diff options
Diffstat (limited to 'StoneIsland/plugins')
447 files changed, 7745 insertions, 8705 deletions
diff --git a/StoneIsland/plugins/android.json b/StoneIsland/plugins/android.json index 8747af08..3e0b601f 100755 --- a/StoneIsland/plugins/android.json +++ b/StoneIsland/plugins/android.json @@ -7,48 +7,52 @@ "files": {} }, "installed_plugins": { - "com.ionic.keyboard": { - "PACKAGE_NAME": "us.okfoc.stoneisland" - }, "com.parse.cordova.core.pushplugin": { "APP_ID": "GS82ZxpN8Mecpc53rsyu6aLLGK0W4CKi42J25DLB", "CLIENT_KEY": "hQRtQfsgimYnX5PMivtcdXCG9eZhESeyTr0Rd8Sv", "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-console": { + "cordova-plugin-inappbrowser": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-customurlscheme": { - "URL_SCHEME": "stoneisland", + "cordova-plugin-x-socialsharing": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-device": { + "cordova-plugin-customurlscheme": { + "URL_SCHEME": "stoneisland", + "ANDROID_SCHEME": " ", + "ANDROID_HOST": " ", + "ANDROID_PATHPREFIX": "/", "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-dialogs": { + "cordova-plugin-whitelist": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-geolocation": { + "cordova-plugin-console": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-inappbrowser": { + "cordova-plugin-device": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, "cordova-plugin-network-information": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-splashscreen": { + "cordova-plugin-dialogs": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-whitelist": { + "cordova-plugin-splashscreen": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-x-socialsharing": { + "cordova-plugin-geolocation": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "phonegap-plugin-push": { + "ionic-plugin-keyboard": { "PACKAGE_NAME": "us.okfoc.stoneisland" } }, - "dependent_plugins": {} + "dependent_plugins": { + "cordova-plugin-compat": { + "PACKAGE_NAME": "us.okfoc.stoneisland" + } + } }
\ No newline at end of file diff --git a/StoneIsland/plugins/com.ionic.keyboard/package.json b/StoneIsland/plugins/com.ionic.keyboard/package.json deleted file mode 100755 index 4dd54150..00000000 --- a/StoneIsland/plugins/com.ionic.keyboard/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "1.0.4", - "name": "com.ionic.keyboard", - "cordova_name": "Keyboard", - "description": "Ionic Keyboard Plugin", - "license": "Apache 2.0", - "repo": "https://github.com/driftyco/ionic-plugins-keyboard.git", - "issue": "https://github.com/driftyco/ionic-plugins-keyboard/issues", - "keywords": [ - "Ionic", - "keyboard" - ], - "platforms": [ - "android", - "ios", - "blackberry10" - ], - "engines": [] -}
\ No newline at end of file diff --git a/StoneIsland/plugins/com.ionic.keyboard/plugin.xml b/StoneIsland/plugins/com.ionic.keyboard/plugin.xml deleted file mode 100755 index 06688915..00000000 --- a/StoneIsland/plugins/com.ionic.keyboard/plugin.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" - id="com.ionic.keyboard" - version="1.0.4"> - <name>Keyboard</name> - <description>Ionic Keyboard Plugin</description> - <license>Apache 2.0</license> - <keywords>Ionic,keyboard</keywords> - <repo>https://github.com/driftyco/ionic-plugins-keyboard.git</repo> - <issue>https://github.com/driftyco/ionic-plugins-keyboard/issues</issue> - - <js-module src="www/keyboard.js" name="keyboard"> - <clobbers target="cordova.plugins.Keyboard" /> - </js-module> - - <!-- android --> - <platform name="android"> - - <config-file target="res/xml/config.xml" parent="/*"> - <feature name="Keyboard"> - <param name="android-package" value="com.ionic.keyboard.IonicKeyboard" /> - <param name="onload" value="true" /> - </feature> - </config-file> - - <source-file src="src/android/IonicKeyboard.java" target-dir="src/com/ionic/keyboard" /> - </platform> - - <!-- ios --> - <platform name="ios"> - <config-file target="config.xml" parent="/*"> - <feature name="Keyboard"> - <param name="ios-package" value="IonicKeyboard" onload="true" /> - </feature> - </config-file> - - <header-file src="src/ios/IonicKeyboard.h" /> - <source-file src="src/ios/IonicKeyboard.m" /> - <header-file src="src/ios/UIWebViewExtension.h" /> - <source-file src="src/ios/UIWebViewExtension.m" /> - </platform> - - <!-- blackberry10 --> - <platform name="blackberry10"> - <source-file src="src/blackberry10/index.js" target-dir='Keyboard' /> - <lib-file src="src/blackberry10/native/device/libKeyboard.so" arch="device"/> - <lib-file src="src/blackberry10/native/simulator/libKeyboard.so" arch="simulator"/> - <config-file target="www/config.xml" parent="/widget"> - <feature name="Keyboard" value="com.ionic.keyboard"/> - - </config-file> - </platform> - -</plugin> diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/android/IonicKeyboard.java b/StoneIsland/plugins/com.ionic.keyboard/src/android/IonicKeyboard.java deleted file mode 100755 index deb914ab..00000000 --- a/StoneIsland/plugins/com.ionic.keyboard/src/android/IonicKeyboard.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.ionic.keyboard; - -import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaInterface; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.PluginResult.Status; -import org.json.JSONArray; -import org.json.JSONException; - -import android.content.Context; -import android.graphics.Rect; -import android.util.DisplayMetrics; -import android.view.View; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.view.inputmethod.InputMethodManager; - -public class IonicKeyboard extends CordovaPlugin{ - - public void initialize(CordovaInterface cordova, CordovaWebView webView) { - super.initialize(cordova, webView); - - //calculate density-independent pixels (dp) - //http://developer.android.com/guide/practices/screens_support.html - DisplayMetrics dm = new DisplayMetrics(); - cordova.getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); - final float density = dm.density; - - final CordovaWebView appView = webView; - - //http://stackoverflow.com/a/4737265/1091751 detect if keyboard is showing - final View rootView = cordova.getActivity().getWindow().getDecorView().findViewById(android.R.id.content).getRootView(); - OnGlobalLayoutListener list = new OnGlobalLayoutListener() { - int previousHeightDiff = 0; - @Override - public void onGlobalLayout() { - Rect r = new Rect(); - //r will be populated with the coordinates of your view that area still visible. - rootView.getWindowVisibleDisplayFrame(r); - - int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top); - int pixelHeightDiff = (int)(heightDiff / density); - if (pixelHeightDiff > 100 && pixelHeightDiff != previousHeightDiff) { // if more than 100 pixels, its probably a keyboard... - appView.sendJavascript("cordova.plugins.Keyboard.isVisible = true"); - appView.sendJavascript("cordova.fireWindowEvent('native.keyboardshow', { 'keyboardHeight':" + Integer.toString(pixelHeightDiff)+"});"); - - //deprecated - appView.sendJavascript("cordova.fireWindowEvent('native.showkeyboard', { 'keyboardHeight':" + Integer.toString(pixelHeightDiff)+"});"); - } - else if ( pixelHeightDiff != previousHeightDiff && ( previousHeightDiff - pixelHeightDiff ) > 100 ){ - appView.sendJavascript("cordova.plugins.Keyboard.isVisible = false"); - appView.sendJavascript("cordova.fireWindowEvent('native.keyboardhide')"); - - //deprecated - appView.sendJavascript("cordova.fireWindowEvent('native.hidekeyboard')"); - } - previousHeightDiff = pixelHeightDiff; - } - }; - - rootView.getViewTreeObserver().addOnGlobalLayoutListener(list); - } - - public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { - if ("close".equals(action)) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - //http://stackoverflow.com/a/7696791/1091751 - InputMethodManager inputManager = (InputMethodManager) cordova.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); - View v = cordova.getActivity().getCurrentFocus(); - - if (v == null) { - callbackContext.error("No current focus"); - } else { - inputManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); - callbackContext.success(); // Thread-safe. - } - } - }); - return true; - } - if ("show".equals(action)) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - ((InputMethodManager) cordova.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); - callbackContext.success(); // Thread-safe. - } - }); - return true; - } - return false; // Returning false results in a "MethodNotFound" error. - } - - -} - diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.h b/StoneIsland/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.h deleted file mode 100755 index 1d6c293d..00000000 --- a/StoneIsland/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.h +++ /dev/null @@ -1,4 +0,0 @@ -@interface UIWebView (HackishAccessoryHiding) -@property (nonatomic, assign) BOOL hackishlyHidesInputAccessoryView; -//@property (nonatomic, assign) BOOL styleDark; -@end diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m b/StoneIsland/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m deleted file mode 100755 index 25403e6f..00000000 --- a/StoneIsland/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m +++ /dev/null @@ -1,109 +0,0 @@ -#import <objc/runtime.h> -#import <UIKit/UIKit.h> -#import "UIWebViewExtension.h" - -//Credit: https://gist.github.com/bjhomer/2048571 -//Also: http://stackoverflow.com/a/23398487/1091751 -@implementation UIWebView (HackishAccessoryHiding) - -static const char * const hackishFixClassName = "UIWebBrowserViewMinusAccessoryView"; -static Class hackishFixClass = Nil; - -- (UIView *)hackishlyFoundBrowserView { - UIScrollView *scrollView = self.scrollView; - - UIView *browserView = nil; - for (UIView *subview in scrollView.subviews) { - if ([NSStringFromClass([subview class]) hasPrefix:@"UIWebBrowserView"]) { - browserView = subview; - break; - } - } - return browserView; -} - -- (id)methodReturningNil { - return nil; -} - -- (void)ensureHackishSubclassExistsOfBrowserViewClass:(Class)browserViewClass { - if (!hackishFixClass) { - Class newClass = objc_allocateClassPair(browserViewClass, hackishFixClassName, 0); - IMP nilImp = [self methodForSelector:@selector(methodReturningNil)]; - class_addMethod(newClass, @selector(inputAccessoryView), nilImp, "@@:"); - objc_registerClassPair(newClass); - - hackishFixClass = newClass; - } -} - -- (BOOL) hackishlyHidesInputAccessoryView { - UIView *browserView = [self hackishlyFoundBrowserView]; - return [browserView class] == hackishFixClass; -} - -- (void) setHackishlyHidesInputAccessoryView:(BOOL)value { - UIView *browserView = [self hackishlyFoundBrowserView]; - if (browserView == nil) { - return; - } - [self ensureHackishSubclassExistsOfBrowserViewClass:[browserView class]]; - - if (value) { - object_setClass(browserView, hackishFixClass); - } - else { - Class normalClass = objc_getClass("UIWebBrowserView"); - object_setClass(browserView, normalClass); - } - [browserView reloadInputViews]; -} -/* ---------------------------------------------------------------- */ - -/* -- (UIKeyboardAppearance) darkKeyboardAppearanceTemplateMethod { - return UIKeyboardAppearanceDark; -} - -- (UIKeyboardAppearance) lightKeyboardAppearanceTemplateMethod { - return UIKeyboardAppearanceLight; -} - -- (BOOL) styleDark { - UIView *browserView = [self hackishlyFoundBrowserView]; - if (browserView == nil) { - return false; - } - - Method m = class_getInstanceMethod( [self class], @selector( darkKeyboardAppearanceTemplateMethod ) ); - IMP imp = method_getImplementation( m ); - - Method m2 = class_getInstanceMethod( [browserView class], @selector(keyboardAppearance) ); - IMP imp2 = method_getImplementation( m2 ); - - return imp == imp2; -} - -- (void) setStyleDark:(BOOL)styleDark { - UIView *browserView = [self hackishlyFoundBrowserView]; - if (browserView == nil) { - return; - } - - if ( styleDark ) { - Method m = class_getInstanceMethod( [self class], @selector( darkKeyboardAppearanceTemplateMethod ) ); - IMP imp = method_getImplementation( m ); - const char* typeEncoding = method_getTypeEncoding( m ); - class_replaceMethod( [browserView class], @selector(keyboardAppearance), imp, typeEncoding ); - } - else { - Method m = class_getInstanceMethod( [self class], @selector( lightKeyboardAppearanceTemplateMethod ) ); - IMP imp = method_getImplementation( m ); - const char* typeEncoding = method_getTypeEncoding( m ); - class_replaceMethod( [browserView class], @selector(keyboardAppearance), imp, typeEncoding ); - } -} -*/ - -@end - diff --git a/StoneIsland/plugins/cordova-plugin-compat/README.md b/StoneIsland/plugins/cordova-plugin-compat/README.md new file mode 100644 index 00000000..095c384b --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-compat/README.md @@ -0,0 +1,31 @@ +<!-- +# +# 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. +# +--> + +cordova-plugin-compat +------------------------ + +This repo is for remaining backwards compatible with previous versions of Cordova. + +## USAGE + +Your plugin can depend on this plugin and use it to handle the new run time permissions Android 6.0.0 (cordova-android 5.0.0) introduced. + +View [this commit](https://github.com/apache/cordova-plugin-camera/commit/a9c18710f23e86f5b7f8918dfab7c87a85064870) to see how to depend on `cordova-plugin-compat`. View [this file](https://github.com/apache/cordova-plugin-camera/blob/master/src/android/CameraLauncher.java) to see how `PermissionHelper` is being used to request and store permissions. Read more about Android permissions at http://cordova.apache.org/docs/en/latest/guide/platforms/android/plugin.html#android-permissions. diff --git a/StoneIsland/plugins/cordova-plugin-compat/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-compat/RELEASENOTES.md new file mode 100644 index 00000000..b7aa1293 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-compat/RELEASENOTES.md @@ -0,0 +1,29 @@ +<!-- +# +# 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. +# +--> +# Release Notes + +### 1.1.0 (Nov 02, 2016) +* [CB-11625](https://issues.apache.org/jira/browse/CB-11625) Adding the `BuildConfig` fetching code as a backup to using a new preference +* Add github pull request template + +### 1.0.0 (Apr 15, 2016) +* Initial release +* Moved `PermissionHelper.java` into `src` diff --git a/StoneIsland/plugins/cordova-plugin-compat/package.json b/StoneIsland/plugins/cordova-plugin-compat/package.json new file mode 100644 index 00000000..f31174d1 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-compat/package.json @@ -0,0 +1,32 @@ +{ + "name": "cordova-plugin-compat", + "description": "This repo is for remaining backwards compatible with previous versions of Cordova.", + "version": "1.1.0", + "homepage": "http://github.com/apache/cordova-plugin-compat#readme", + "repository": { + "type": "git", + "url": "git://github.com/apache/cordova-plugin-compat.git" + }, + "bugs": { + "url": "https://github.com/apache/cordova-plugin-compat/issues" + }, + "cordova": { + "id": "cordova-plugin-compat", + "platforms": [ + "android" + ] + }, + "keywords": [ + "ecosystem:cordova", + "ecosystem:phonegap", + "cordova-android" + ], + "engines": [ + { + "name": "cordova", + "version": ">=5.0.0" + } + ], + "author": "Apache Software Foundation", + "license": "Apache-2.0" +} diff --git a/StoneIsland/plugins/cordova-plugin-compat/plugin.xml b/StoneIsland/plugins/cordova-plugin-compat/plugin.xml new file mode 100644 index 00000000..40b45ccd --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-compat/plugin.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + 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. +--> + +<plugin xmlns="http://cordova.apache.org/ns/plugins/1.0" + id="cordova-plugin-compat" + version="1.1.0"> + <name>Compat</name> + <description>Cordova Compatibility Plugin</description> + <license>Apache 2.0</license> + <keywords>cordova,compat</keywords> + <repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-compat.git</repo> + + <!-- android --> + <platform name="android"> + <source-file src="src/android/PermissionHelper.java" target-dir="src/org/apache/cordova" /> + <source-file src="src/android/BuildHelper.java" target-dir="src/org/apache/cordova" /> + </platform> + +</plugin> diff --git a/StoneIsland/plugins/cordova-plugin-compat/src/android/BuildHelper.java b/StoneIsland/plugins/cordova-plugin-compat/src/android/BuildHelper.java new file mode 100644 index 00000000..d9b18aa2 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-compat/src/android/BuildHelper.java @@ -0,0 +1,70 @@ +/* + 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. +*/ + +package org.apache.cordova; + +/* + * This is a utility class that allows us to get the BuildConfig variable, which is required + * for the use of different providers. This is not guaranteed to work, and it's better for this + * to be set in the build step in config.xml + * + */ + +import android.app.Activity; +import android.content.Context; + +import java.lang.reflect.Field; + + +public class BuildHelper { + + + private static String TAG="BuildHelper"; + + /* + * This needs to be implemented if you wish to use the Camera Plugin or other plugins + * that read the Build Configuration. + * + * Thanks to Phil@Medtronic and Graham Borland for finding the answer and posting it to + * StackOverflow. This is annoying as hell! However, this method does not work with + * ProGuard, and you should use the config.xml to define the application_id + * + */ + + public static Object getBuildConfigValue(Context ctx, String key) + { + try + { + Class<?> clazz = Class.forName(ctx.getPackageName() + ".BuildConfig"); + Field field = clazz.getField(key); + return field.get(null); + } catch (ClassNotFoundException e) { + LOG.d(TAG, "Unable to get the BuildConfig, is this built with ANT?"); + e.printStackTrace(); + } catch (NoSuchFieldException e) { + LOG.d(TAG, key + " is not a valid field. Check your build.gradle"); + } catch (IllegalAccessException e) { + LOG.d(TAG, "Illegal Access Exception: Let's print a stack trace."); + e.printStackTrace(); + } + + return null; + } + +} diff --git a/StoneIsland/plugins/cordova-plugin-compat/src/android/PermissionHelper.java b/StoneIsland/plugins/cordova-plugin-compat/src/android/PermissionHelper.java new file mode 100644 index 00000000..bbd79112 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-compat/src/android/PermissionHelper.java @@ -0,0 +1,138 @@ +/* + 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. +*/ +package org.apache.cordova; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; + +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.LOG; + +import android.content.pm.PackageManager; + +/** + * This class provides reflective methods for permission requesting and checking so that plugins + * written for cordova-android 5.0.0+ can still compile with earlier cordova-android versions. + */ +public class PermissionHelper { + private static final String LOG_TAG = "CordovaPermissionHelper"; + + /** + * Requests a "dangerous" permission for the application at runtime. This is a helper method + * alternative to cordovaInterface.requestPermission() that does not require the project to be + * built with cordova-android 5.0.0+ + * + * @param plugin The plugin the permission is being requested for + * @param requestCode A requestCode to be passed to the plugin's onRequestPermissionResult() + * along with the result of the permission request + * @param permission The permission to be requested + */ + public static void requestPermission(CordovaPlugin plugin, int requestCode, String permission) { + PermissionHelper.requestPermissions(plugin, requestCode, new String[] {permission}); + } + + /** + * Requests "dangerous" permissions for the application at runtime. This is a helper method + * alternative to cordovaInterface.requestPermissions() that does not require the project to be + * built with cordova-android 5.0.0+ + * + * @param plugin The plugin the permissions are being requested for + * @param requestCode A requestCode to be passed to the plugin's onRequestPermissionResult() + * along with the result of the permissions request + * @param permissions The permissions to be requested + */ + public static void requestPermissions(CordovaPlugin plugin, int requestCode, String[] permissions) { + try { + Method requestPermission = CordovaInterface.class.getDeclaredMethod( + "requestPermissions", CordovaPlugin.class, int.class, String[].class); + + // If there is no exception, then this is cordova-android 5.0.0+ + requestPermission.invoke(plugin.cordova, plugin, requestCode, permissions); + } catch (NoSuchMethodException noSuchMethodException) { + // cordova-android version is less than 5.0.0, so permission is implicitly granted + LOG.d(LOG_TAG, "No need to request permissions " + Arrays.toString(permissions)); + + // Notify the plugin that all were granted by using more reflection + deliverPermissionResult(plugin, requestCode, permissions); + } catch (IllegalAccessException illegalAccessException) { + // Should never be caught; this is a public method + LOG.e(LOG_TAG, "IllegalAccessException when requesting permissions " + Arrays.toString(permissions), illegalAccessException); + } catch(InvocationTargetException invocationTargetException) { + // This method does not throw any exceptions, so this should never be caught + LOG.e(LOG_TAG, "invocationTargetException when requesting permissions " + Arrays.toString(permissions), invocationTargetException); + } + } + + /** + * Checks at runtime to see if the application has been granted a permission. This is a helper + * method alternative to cordovaInterface.hasPermission() that does not require the project to + * be built with cordova-android 5.0.0+ + * + * @param plugin The plugin the permission is being checked against + * @param permission The permission to be checked + * + * @return True if the permission has already been granted and false otherwise + */ + public static boolean hasPermission(CordovaPlugin plugin, String permission) { + try { + Method hasPermission = CordovaInterface.class.getDeclaredMethod("hasPermission", String.class); + + // If there is no exception, then this is cordova-android 5.0.0+ + return (Boolean) hasPermission.invoke(plugin.cordova, permission); + } catch (NoSuchMethodException noSuchMethodException) { + // cordova-android version is less than 5.0.0, so permission is implicitly granted + LOG.d(LOG_TAG, "No need to check for permission " + permission); + return true; + } catch (IllegalAccessException illegalAccessException) { + // Should never be caught; this is a public method + LOG.e(LOG_TAG, "IllegalAccessException when checking permission " + permission, illegalAccessException); + } catch(InvocationTargetException invocationTargetException) { + // This method does not throw any exceptions, so this should never be caught + LOG.e(LOG_TAG, "invocationTargetException when checking permission " + permission, invocationTargetException); + } + return false; + } + + private static void deliverPermissionResult(CordovaPlugin plugin, int requestCode, String[] permissions) { + // Generate the request results + int[] requestResults = new int[permissions.length]; + Arrays.fill(requestResults, PackageManager.PERMISSION_GRANTED); + + try { + Method onRequestPermissionResult = CordovaPlugin.class.getDeclaredMethod( + "onRequestPermissionResult", int.class, String[].class, int[].class); + + onRequestPermissionResult.invoke(plugin, requestCode, permissions, requestResults); + } catch (NoSuchMethodException noSuchMethodException) { + // Should never be caught since the plugin must be written for cordova-android 5.0.0+ if it + // made it to this point + LOG.e(LOG_TAG, "NoSuchMethodException when delivering permissions results", noSuchMethodException); + } catch (IllegalAccessException illegalAccessException) { + // Should never be caught; this is a public method + LOG.e(LOG_TAG, "IllegalAccessException when delivering permissions results", illegalAccessException); + } catch(InvocationTargetException invocationTargetException) { + // This method may throw a JSONException. We are just duplicating cordova-android's + // exception handling behavior here; all it does is log the exception in CordovaActivity, + // print the stacktrace, and ignore it + LOG.e(LOG_TAG, "InvocationTargetException when delivering permissions results", invocationTargetException); + } + } +} diff --git a/StoneIsland/plugins/cordova-plugin-console/CONTRIBUTING.md b/StoneIsland/plugins/cordova-plugin-console/CONTRIBUTING.md index f7dbcaba..4c8e6a5e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/CONTRIBUTING.md +++ b/StoneIsland/plugins/cordova-plugin-console/CONTRIBUTING.md @@ -27,7 +27,7 @@ There are multiple ways to contribute: report bugs, improve the docs, and contribute code. For instructions on this, start with the -[contribution overview](http://cordova.apache.org/#contribute). +[contribution overview](http://cordova.apache.org/contribute/). The details are explained there, but the important items are: - Sign and submit an Apache ICLA (Contributor License Agreement). diff --git a/StoneIsland/plugins/cordova-plugin-console/LICENSE b/StoneIsland/plugins/cordova-plugin-console/LICENSE index 7a4a3ea2..7a4a3ea2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/LICENSE +++ b/StoneIsland/plugins/cordova-plugin-console/LICENSE diff --git a/StoneIsland/plugins/cordova-plugin-console/NOTICE b/StoneIsland/plugins/cordova-plugin-console/NOTICE index 8ec56a52..8ec56a52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/NOTICE +++ b/StoneIsland/plugins/cordova-plugin-console/NOTICE diff --git a/StoneIsland/plugins/cordova-plugin-console/README.md b/StoneIsland/plugins/cordova-plugin-console/README.md index 73e89084..ebd09398 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/README.md @@ -1,3 +1,7 @@ +--- +title: Console +description: Get JavaScript logs in your native logs. +--- <!--- # license: Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,9 +21,11 @@ # under the License. --> -# cordova-plugin-console +|Android|iOS| Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI | +|:-:|:-:|:-:|:-:|:-:|:-:| +|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=android,PLUGIN=cordova-plugin-console/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=ios,PLUGIN=cordova-plugin-console/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-store,PLUGIN=cordova-plugin-console/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-phone,PLUGIN=cordova-plugin-console/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-10-store,PLUGIN=cordova-plugin-console/)|[](https://travis-ci.org/apache/cordova-plugin-console) -[](https://travis-ci.org/apache/cordova-plugin-console) +# cordova-plugin-console This plugin is meant to ensure that console.log() is as useful as it can be. It adds additional function for iOS, Ubuntu, Windows Phone 8, and Windows. If @@ -36,6 +42,9 @@ are not available until after the `deviceready` event. console.log("console.log works well"); } +:warning: Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Console%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) + + ## Installation cordova plugin add cordova-plugin-console @@ -46,3 +55,55 @@ On some platforms other than Android, console.log() will act on multiple arguments, such as console.log("1", "2", "3"). However, Android will act only on the first argument. Subsequent arguments to console.log() will be ignored. This plugin is not the cause of that, it is a limitation of Android itself. + +## Supported Methods + +The plugin support following methods of the `console` object: + +- `console.log` +- `console.error` +- `console.exception` +- `console.warn` +- `console.info` +- `console.debug` +- `console.assert` +- `console.dir` +- `console.dirxml` +- `console.time` +- `console.timeEnd` +- `console.table` + +## Partially supported Methods + +Methods of the `console` object which implemented, but behave different from browser implementation: + +- `console.group` +- `console.groupCollapsed` + +The grouping methods are just log name of the group and don't actually indicate grouping for later +calls to `console` object methods. + +## Not supported Methods + +Methods of the `console` object which are implemented, but do nothing: + +- `console.clear` +- `console.trace` +- `console.groupEnd` +- `console.timeStamp` +- `console.profile` +- `console.profileEnd` +- `console.count` + +## Supported formatting + +The following formatting options available: + +Format chars: + +* `%j` - format arg as JSON +* `%o` - format arg as JSON +* `%c` - format arg as `''`. No color formatting could be done. +* `%%` - replace with `'%'` + +Any other char following `%` will format its arg via `toString()`. diff --git a/StoneIsland/plugins/cordova-plugin-console/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-console/RELEASENOTES.md index 5b1fdd1d..76cc093b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-console/RELEASENOTES.md @@ -20,65 +20,85 @@ --> # Release Notes -### 0.2.3 (Sept 25, 2013) -* CB-4889 bumping&resetting version -* CB-4889 renaming org.apache.cordova.core.console to org.apache.cordova.console -* Rename CHANGELOG.md -> RELEASENOTES.md -* [CB-4752] Incremented plugin version on dev branch. +### 1.0.4 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to `cordovaDependencies` +* add `JIRA` issue tracker link +* Add badges for paramedic builds on Jenkins +* Add pull request template. +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md - ### 0.2.4 (Oct 28, 2013) -* CB-5154 log formatting incorrectly to native -* CB-5128: added repo + issue tag to plugin.xml for console plugin -* [CB-4915] Incremented plugin version on dev branch. +### 1.0.3 (Apr 15, 2016) +* [CB-10720](https://issues.apache.org/jira/browse/CB-10720) Minor spelling/formatting changes. +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add `JSHint` for plugins -### 0.2.5 (Dec 4, 2013) -* add ubuntu platform +### 1.0.2 (Nov 18, 2015) +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest +* Fixing contribute link. +* Document formatting options for the console object +* [CB-5089](https://issues.apache.org/jira/browse/CB-5089) Document supported methods for console object +* reverted `d58f218b9149d362ebb0b8ce697cf403569d14cd` because `logger` is not needed on **Android** -### 0.2.6 (Jan 02, 2014) -* CB-5658 Add doc/index.md for Console plugin +### 1.0.1 (Jun 17, 2015) +* move logger.js and console-via-logger.js to common modules, instead of the numerous repeats that were there. +* clean up tests, info is below log level so it does not exist by default. +* add a couple tests +* [CB-9191](https://issues.apache.org/jira/browse/CB-9191) Add basic test +* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-console documentation translation: cordova-plugin-console +* attempt to fix npm markdown issue -### 0.2.7 (Feb 05, 2014) -* Native console needs to be called DebugConsole to avoid ambiguous reference. This commit requires the 3.4.0 version of the native class factory -* CB-4718 fixed Console plugin not working on wp +### 1.0.0 (Apr 15, 2015) +* [CB-8746](https://issues.apache.org/jira/browse/CB-8746) gave plugin major version bump +* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) changed plugin-id to pacakge-name +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) updated translated docs to use new id +* Use TRAVIS_BUILD_DIR, install paramedic by npm +* docs: renamed Windows8 to Windows +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) Updated Readme +* [CB-8560](https://issues.apache.org/jira/browse/CB-8560) Integrate TravisCI +* [CB-8438](https://issues.apache.org/jira/browse/CB-8438) cordova-plugin-console documentation translation: cordova-plugin-console +* [CB-8538](https://issues.apache.org/jira/browse/CB-8538) Added package.json file +* [CB-8362](https://issues.apache.org/jira/browse/CB-8362) Add Windows platform section to Console plugin + +### 0.2.13 (Feb 04, 2015) +* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) ios: Use argumentForIndex rather than NSArray extension + +### 0.2.12 (Dec 02, 2014) +* [CB-7977](https://issues.apache.org/jira/browse/CB-7977) Mention `deviceready` in plugin docs +* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-console documentation translation: cordova-plugin-console + +### 0.2.11 (Sep 17, 2014) +* [CB-7249](https://issues.apache.org/jira/browse/CB-7249) cordova-plugin-console documentation translation + +### 0.2.10 (Aug 06, 2014) +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Updated translations for docs + +### 0.2.9 (Jun 05, 2014) +* [CB-6848](https://issues.apache.org/jira/browse/CB-6848) Add Android quirk, list applicable platforms +* [CB-6796](https://issues.apache.org/jira/browse/CB-6796) Add license +* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md ### 0.2.8 (Apr 17, 2014) -* CB-6460: Update license headers +* [CB-6460](https://issues.apache.org/jira/browse/CB-6460): Update license headers * Add NOTICE file -### 0.2.9 (Jun 05, 2014) -* CB-6848 Add Android quirk, list applicable platforms -* CB-6796 Add license -* CB-6491 add CONTRIBUTING.md +### 0.2.7 (Feb 05, 2014) +* Native console needs to be called DebugConsole to avoid ambiguous reference. This commit requires the 3.4.0 version of the native class factory +* [CB-4718](https://issues.apache.org/jira/browse/CB-4718) fixed Console plugin not working on wp -### 0.2.10 (Aug 06, 2014) -* CB-6127 Updated translations for docs +### 0.2.6 (Jan 02, 2014) +* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Add doc/index.md for Console plugin -### 0.2.11 (Sep 17, 2014) -* CB-7249 cordova-plugin-console documentation translation +### 0.2.5 (Dec 4, 2013) +* add ubuntu platform -### 0.2.12 (Dec 02, 2014) -* CB-7977 Mention `deviceready` in plugin docs -* CB-7700 cordova-plugin-console documentation translation: cordova-plugin-console +### 0.2.4 (Oct 28, 2013) +* [CB-5154](https://issues.apache.org/jira/browse/CB-5154) log formatting incorrectly to native +* [CB-5128](https://issues.apache.org/jira/browse/CB-5128): added repo + issue tag to plugin.xml for console plugin +* [CB-4915](https://issues.apache.org/jira/browse/CB-4915) Incremented plugin version on dev branch. -### 0.2.13 (Feb 04, 2015) -* CB-8351 ios: Use argumentForIndex rather than NSArray extension +### 0.2.3 (Sept 25, 2013) +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) bumping&resetting version +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming org.apache.cordova.core.console to org.apache.cordova.console +* Rename CHANGELOG.md -> RELEASENOTES.md +* [CB-4752](https://issues.apache.org/jira/browse/CB-4752) Incremented plugin version on dev branch. -### 1.0.0 (Apr 15, 2015) -* CB-8746 gave plugin major version bump -* CB-8683 changed plugin-id to pacakge-name -* CB-8653 updated translated docs to use new id -* Use TRAVIS_BUILD_DIR, install paramedic by npm -* docs: renamed Windows8 to Windows -* CB-8653 Updated Readme -* CB-8560 Integrate TravisCI -* CB-8438 cordova-plugin-console documentation translation: cordova-plugin-console -* CB-8538 Added package.json file -* CB-8362 Add Windows platform section to Console plugin -### 1.0.1 (Jun 17, 2015) -* move logger.js and console-via-logger.js to common modules, instead of the numerous repeats that were there. -* clean up tests, info is below log level so it does not exist by default. -* add a couple tests -* CB-9191 Add basic test -* CB-9128 cordova-plugin-console documentation translation: cordova-plugin-console -* attempt to fix npm markdown issue diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/de/README.md index 933c1b7a..933c1b7a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/de/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/de/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/de/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/de/index.md index 95517827..95517827 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/de/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/de/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/es/README.md index b089d639..b089d639 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/es/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/es/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/es/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/es/index.md index e6b8e684..e6b8e684 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/es/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/es/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/fr/README.md index 74207ac4..74207ac4 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/fr/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/fr/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/fr/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/fr/index.md index d0dbba55..d0dbba55 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/fr/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/fr/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/it/README.md index 5394d551..5394d551 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/it/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/it/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/it/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/it/index.md index f0625b39..f0625b39 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/it/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/it/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/ja/README.md index 059c373c..059c373c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/ja/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/ja/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/ja/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/ja/index.md index 413593ce..413593ce 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/ja/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/ja/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/ko/README.md index d03ee5aa..d03ee5aa 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/ko/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/ko/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/ko/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/ko/index.md index ca631e44..ca631e44 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/ko/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/ko/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/pl/README.md index 78ab9d2c..78ab9d2c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/pl/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/pl/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/pl/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/pl/index.md index 922b577c..922b577c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/pl/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/pl/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/ru/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/ru/index.md index 3cfe15dc..3cfe15dc 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/ru/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/ru/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-console/doc/zh/README.md index ce27c3e1..ce27c3e1 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/zh/README.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/zh/README.md diff --git a/StoneIsland/plugins/cordova-plugin-console/doc/zh/index.md b/StoneIsland/plugins/cordova-plugin-console/doc/zh/index.md index e18a141b..e18a141b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/doc/zh/index.md +++ b/StoneIsland/plugins/cordova-plugin-console/doc/zh/index.md diff --git a/StoneIsland/plugins/cordova-plugin-console/package.json b/StoneIsland/plugins/cordova-plugin-console/package.json index 9f667f00..39dc7614 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/package.json +++ b/StoneIsland/plugins/cordova-plugin-console/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-console", - "version": "1.0.1", + "version": "1.0.4", "description": "Cordova Console Plugin", "cordova": { "id": "cordova-plugin-console", @@ -28,6 +28,20 @@ "cordova-windows8", "cordova-windows" ], + "scripts": { + "test": "npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests" + }, "author": "Apache Software Foundation", - "license": "Apache 2.0" + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova": ">100" + } + } + }, + "devDependencies": { + "jshint": "^2.6.0" + } } diff --git a/StoneIsland/plugins/cordova-plugin-console/plugin.xml b/StoneIsland/plugins/cordova-plugin-console/plugin.xml index f902cc74..b2fb3f06 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-console/plugin.xml @@ -20,7 +20,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-console" - version="1.0.1"> + version="1.0.4"> <name>Console</name> <description>Cordova Console Plugin</description> @@ -29,14 +29,6 @@ <repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-console.git</repo> <issue>https://issues.apache.org/jira/browse/CB/component/12320644</issue> - <js-module src="www/logger.js" name="logger"> - <clobbers target="cordova.logger" /> - </js-module> - - <js-module src="www/console-via-logger.js" name="console"> - <clobbers target="console" /> - </js-module> - <!-- ios --> <platform name="ios"> @@ -46,6 +38,14 @@ </feature> </config-file> + <js-module src="www/console-via-logger.js" name="console"> + <clobbers target="console" /> + </js-module> + + <js-module src="www/logger.js" name="logger"> + <clobbers target="cordova.logger" /> + </js-module> + <header-file src="src/ios/CDVLogger.h" /> <source-file src="src/ios/CDVLogger.m" /> @@ -53,6 +53,13 @@ <!-- ubuntu --> <platform name="ubuntu"> + <js-module src="www/console-via-logger.js" name="console"> + <clobbers target="console" /> + </js-module> + + <js-module src="www/logger.js" name="logger"> + <clobbers target="cordova.logger" /> + </js-module> <header-file src="src/ubuntu/console.h" /> <source-file src="src/ubuntu/console.cpp" /> @@ -67,6 +74,14 @@ </feature> </config-file> + <js-module src="www/console-via-logger.js" name="console"> + <clobbers target="console" /> + </js-module> + + <js-module src="www/logger.js" name="logger"> + <clobbers target="cordova.logger" /> + </js-module> + <source-file src="src/wp/DebugConsole.cs" /> </platform> @@ -78,15 +93,35 @@ </feature> </config-file> + <js-module src="www/console-via-logger.js" name="console"> + <clobbers target="console" /> + </js-module> + + <js-module src="www/logger.js" name="logger"> + <clobbers target="cordova.logger" /> + </js-module> + <source-file src="src/wp/DebugConsole.cs" /> </platform> <!-- windows8 --> <platform name="windows8"> + <js-module src="www/logger.js" name="logger"> + <clobbers target="cordova.logger" /> + </js-module> + <js-module src="www/console-via-logger.js" name="console"> + <clobbers target="console" /> + </js-module> </platform> <!-- Windows universal platform --> <platform name="windows"> + <js-module src="www/logger.js" name="logger"> + <clobbers target="cordova.logger" /> + </js-module> + <js-module src="www/console-via-logger.js" name="console"> + <clobbers target="console" /> + </js-module> </platform> </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.h b/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.h index 7cfb3063..7cfb3063 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.h +++ b/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.h diff --git a/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.m b/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.m index ccfa3a51..ccfa3a51 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.m +++ b/StoneIsland/plugins/cordova-plugin-console/src/ios/CDVLogger.m diff --git a/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.cpp b/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.cpp index 9de09f43..9de09f43 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.cpp +++ b/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.cpp diff --git a/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.h b/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.h index 3f3d1634..3f3d1634 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.h +++ b/StoneIsland/plugins/cordova-plugin-console/src/ubuntu/console.h diff --git a/StoneIsland/plugins/cordova-plugin-console/src/wp/DebugConsole.cs b/StoneIsland/plugins/cordova-plugin-console/src/wp/DebugConsole.cs index 9bb5476d..9bb5476d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/src/wp/DebugConsole.cs +++ b/StoneIsland/plugins/cordova-plugin-console/src/wp/DebugConsole.cs diff --git a/StoneIsland/plugins/cordova-plugin-console/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-console/tests/plugin.xml index a44db3bc..cce2c53f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-console/tests/plugin.xml @@ -22,7 +22,7 @@ xmlns:rim="http://www.blackberry.com/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-console-tests" - version="1.0.1"> + version="1.0.4"> <name>Cordova Console Plugin Tests</name> <license>Apache 2.0</license> diff --git a/StoneIsland/plugins/cordova-plugin-console/tests/tests.js b/StoneIsland/plugins/cordova-plugin-console/tests/tests.js index 6479e41d..74765d98 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/tests/tests.js +++ b/StoneIsland/plugins/cordova-plugin-console/tests/tests.js @@ -19,24 +19,24 @@ * */ +/* jshint jasmine: true */ + exports.defineAutoTests = function () { describe("Console", function () { it("console.spec.1 should exist", function() { expect(window.console).toBeDefined(); }); - + it("console.spec.2 has required methods log|warn|error", function(){ expect(window.console.log).toBeDefined(); expect(typeof window.console.log).toBe('function'); - + expect(window.console.warn).toBeDefined(); expect(typeof window.console.warn).toBe('function'); - + expect(window.console.error).toBeDefined(); - expect(typeof window.console.error).toBe('function'); - + expect(typeof window.console.error).toBe('function'); }); - }); }; diff --git a/StoneIsland/plugins/cordova-plugin-console/www/console-via-logger.js b/StoneIsland/plugins/cordova-plugin-console/www/console-via-logger.js index 4095eb3e..ffee3263 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/www/console-via-logger.js +++ b/StoneIsland/plugins/cordova-plugin-console/www/console-via-logger.js @@ -22,7 +22,6 @@ //------------------------------------------------------------------------------ var logger = require("./logger"); -var utils = require("cordova/utils"); //------------------------------------------------------------------------------ // object that we're exporting diff --git a/StoneIsland/plugins/cordova-plugin-console/www/logger.js b/StoneIsland/plugins/cordova-plugin-console/www/logger.js index cbf81b9c..430d887d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-console/www/logger.js +++ b/StoneIsland/plugins/cordova-plugin-console/www/logger.js @@ -43,7 +43,6 @@ var logger = exports; var exec = require('cordova/exec'); -var utils = require('cordova/utils'); var UseConsole = false; var UseLogger = true; diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/LaunchMyApp-PhoneGap-Plugin.iws b/StoneIsland/plugins/cordova-plugin-customurlscheme/LaunchMyApp-PhoneGap-Plugin.iws deleted file mode 100644 index 9879f7f4..00000000 --- a/StoneIsland/plugins/cordova-plugin-customurlscheme/LaunchMyApp-PhoneGap-Plugin.iws +++ /dev/null @@ -1,1242 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ChangeListManager"> - <list default="true" id="96110866-69f3-4eb0-8539-5f26f68fe1ac" name="Default" comment="" /> - <ignored path="LaunchMyApp-PhoneGap-Plugin.iws" /> - <ignored path=".idea/workspace.xml" /> - <ignored path="$PROJECT_DIR$/out/" /> - <ignored path=".idea/dataSources.local.xml" /> - <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> - <option name="TRACKING_ENABLED" value="true" /> - <option name="SHOW_DIALOG" value="false" /> - <option name="HIGHLIGHT_CONFLICTS" value="true" /> - <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> - <option name="LAST_RESOLUTION" value="IGNORE" /> - </component> - <component name="ChangesViewManager" flattened_view="true" show_ignored="false" /> - <component name="CreatePatchCommitExecutor"> - <option name="PATCH_PATH" value="" /> - </component> - <component name="DaemonCodeAnalyzer"> - <disable_hints /> - </component> - <component name="DebuggerManager"> - <breakpoint_any default_suspend_policy="SuspendAll" default_condition_enabled="true" converted="true"> - <breakpoint> - <option name="NOTIFY_CAUGHT" value="true" /> - <option name="NOTIFY_UNCAUGHT" value="true" /> - <option name="ENABLED" value="false" /> - <option name="LOG_ENABLED" value="false" /> - <option name="LOG_EXPRESSION_ENABLED" value="false" /> - <option name="REMOVE_AFTER_HIT" value="false" /> - <option name="SUSPEND_POLICY" value="SuspendAll" /> - <option name="SUSPEND" value="true" /> - <option name="COUNT_FILTER_ENABLED" value="false" /> - <option name="COUNT_FILTER" value="0" /> - <option name="CONDITION_ENABLED" value="true" /> - <option name="CLASS_FILTERS_ENABLED" value="false" /> - <option name="INSTANCE_FILTERS_ENABLED" value="false" /> - <option name="CONDITION" value="" /> - <option name="LOG_MESSAGE" value="" /> - </breakpoint> - <breakpoint> - <option name="NOTIFY_CAUGHT" value="true" /> - <option name="NOTIFY_UNCAUGHT" value="true" /> - <option name="ENABLED" value="false" /> - <option name="LOG_ENABLED" value="false" /> - <option name="LOG_EXPRESSION_ENABLED" value="false" /> - <option name="REMOVE_AFTER_HIT" value="false" /> - <option name="SUSPEND_POLICY" value="SuspendAll" /> - <option name="SUSPEND" value="true" /> - <option name="COUNT_FILTER_ENABLED" value="false" /> - <option name="COUNT_FILTER" value="0" /> - <option name="CONDITION_ENABLED" value="true" /> - <option name="CLASS_FILTERS_ENABLED" value="false" /> - <option name="INSTANCE_FILTERS_ENABLED" value="false" /> - <option name="CONDITION" value="" /> - <option name="LOG_MESSAGE" value="" /> - </breakpoint> - </breakpoint_any> - <breakpoint_rules converted="true" /> - <ui_properties converted="true" /> - </component> - <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" /> - <component name="FavoritesManager"> - <favorites_list name="LaunchMyApp-PhoneGap-Plugin" /> - </component> - <component name="FileEditorManager"> - <leaf> - <file leaf-file-name="package.json" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/package.json"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-5.625" vertical-offset="0" max-vertical-offset="720"> - <caret line="9" column="17" selection-start-line="9" selection-start-column="17" selection-end-line="9" selection-end-column="17" /> - <folding /> - </state> - </provider> - </entry> - </file> - <file leaf-file-name="plugin.xml" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1695"> - <caret line="7" column="0" selection-start-line="7" selection-start-column="0" selection-end-line="7" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> - </file> - <file leaf-file-name="README.md" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/README.md"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-2.0" vertical-offset="0" max-vertical-offset="3105"> - <caret line="4" column="24" selection-start-line="4" selection-start-column="24" selection-end-line="4" selection-end-column="24" /> - <folding /> - </state> - </provider> - <provider editor-type-id="MarkdownPreviewEditor"> - <state /> - </provider> - </entry> - </file> - <file leaf-file-name="LaunchMyApp.java" pinned="false" current-in-tab="true"> - <entry file="file://$PROJECT_DIR$/src/android/nl/xservices/plugins/LaunchMyApp.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.13907285" vertical-offset="60" max-vertical-offset="1920"> - <caret line="22" column="43" selection-start-line="22" selection-start-column="43" selection-end-line="22" selection-end-column="43" /> - <folding /> - </state> - </provider> - </entry> - </file> - </leaf> - </component> - <component name="FindManager"> - <FindUsagesManager> - <setting name="OPEN_NEW_TAB" value="false" /> - </FindUsagesManager> - </component> - <component name="Git.Settings"> - <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> - </component> - <component name="GitLogSettings"> - <option name="myDateState"> - <MyDateState /> - </option> - </component> - <component name="IdeDocumentHistory"> - <option name="CHANGED_PATHS"> - <list> - <option value="$PROJECT_DIR$/www/android/LaunchMyApp.js" /> - <option value="$PROJECT_DIR$/plugin.xml" /> - <option value="$PROJECT_DIR$/README.md" /> - <option value="$PROJECT_DIR$/package.json" /> - <option value="$PROJECT_DIR$/src/android/nl/xservices/plugins/LaunchMyApp.java" /> - </list> - </option> - </component> - <component name="JsGulpfileManager"> - <detection-done>true</detection-done> - </component> - <component name="PhpWorkspaceProjectConfiguration" backward_compatibility_performed="true" /> - <component name="ProjectFrameBounds"> - <option name="x" value="587" /> - <option name="y" value="23" /> - <option name="width" value="1095" /> - <option name="height" value="926" /> - </component> - <component name="ProjectLevelVcsManager" settingsEditedManually="false"> - <OptionsSetting value="true" id="Add" /> - <OptionsSetting value="true" id="Remove" /> - <OptionsSetting value="true" id="Checkout" /> - <OptionsSetting value="false" id="Update" /> - <OptionsSetting value="true" id="Status" /> - <OptionsSetting value="true" id="Edit" /> - <OptionsSetting value="true" id="Undo Check Out" /> - <OptionsSetting value="true" id="Get Latest Version" /> - <ConfirmationsSetting value="1" id="Add" /> - <ConfirmationsSetting value="0" id="Remove" /> - </component> - <component name="ProjectView"> - <navigator currentView="ProjectPane" proportions="" version="1"> - <flattenPackages /> - <showMembers /> - <showModules /> - <showLibraryContents /> - <hideEmptyPackages /> - <abbreviatePackageNames /> - <autoscrollToSource /> - <autoscrollFromSource /> - <sortByType /> - </navigator> - <panes> - <pane id="ProjectPane"> - <subPane> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> - </PATH_ELEMENT> - </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="www" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="windows" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="www" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="www" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="android" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - </PATH> - <PATH> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="LaunchMyApp-PhoneGap-Plugin" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="src" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="android" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="nl" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="xservices" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - <PATH_ELEMENT> - <option name="myItemId" value="plugins" /> - <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" /> - </PATH_ELEMENT> - </PATH> - </subPane> - </pane> - <pane id="Scope" /> - <pane id="PackagesPane" /> - </panes> - </component> - <component name="PropertiesComponent"> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth0" value="64" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="72" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="90" /> - <property name="MemberChooser.sorted" value="false" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder0" value="0" /> - <property name="last_opened_file_path" value="$PROJECT_DIR$/LaunchMyApp-PhoneGap-Plugin.ipr" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth2" value="75" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth3" value="749" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth3" value="812" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth2" value="94" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth1" value="90" /> - <property name="GoToClass.toSaveIncludeLibraries" value="false" /> - <property name="WebServerToolWindowFactoryState" value="true" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder2" value="2" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder3" value="3" /> - <property name="MemberChooser.showClasses" value="true" /> - <property name="FullScreen" value="false" /> - <property name="GoToClass.includeLibraries" value="false" /> - <property name="GoToFile.includeJavaFiles" value="false" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder1" value="1" /> - <property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder2" value="2" /> - <property name="MemberChooser.copyJavadoc" value="false" /> - </component> - <component name="RecentsManager"> - <key name="CopyFile.RECENT_KEYS"> - <recent name="$PROJECT_DIR$" /> - <recent name="$PROJECT_DIR$/www/ios" /> - <recent name="$PROJECT_DIR$/www/android" /> - <recent name="$PROJECT_DIR$/www" /> - </key> - <key name="MoveFile.RECENT_KEYS"> - <recent name="$PROJECT_DIR$/www/android" /> - <recent name="$PROJECT_DIR$/www" /> - </key> - </component> - <component name="RunManager"> - <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin"> - <module name="" /> - <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m" /> - <option name="PROGRAM_PARAMETERS" /> - <method /> - </configuration> - <configuration default="true" type="GrailsRunConfigurationType" factoryName="Grails"> - <module name="" /> - <setting name="vmparams" value="" /> - <setting name="cmdLine" value="run-app" /> - <setting name="depsClasspath" value="false" /> - <setting name="passParentEnv" value="true" /> - <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> - <setting name="launchBrowser" value="false" /> - <method /> - </configuration> - <configuration default="true" type="Remote" factoryName="Remote"> - <option name="USE_SOCKET_TRANSPORT" value="true" /> - <option name="SERVER_MODE" value="false" /> - <option name="SHMEM_ADDRESS" value="javadebug" /> - <option name="HOST" value="localhost" /> - <option name="PORT" value="5005" /> - <method /> - </configuration> - <configuration default="true" type="PhpLocalRunConfigurationType" factoryName="PHP Console"> - <method /> - </configuration> - <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug"> - <method /> - </configuration> - <configuration default="true" type="Applet" factoryName="Applet"> - <module name="" /> - <option name="MAIN_CLASS_NAME" /> - <option name="HTML_FILE_NAME" /> - <option name="HTML_USED" value="false" /> - <option name="WIDTH" value="400" /> - <option name="HEIGHT" value="300" /> - <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" /> - <option name="VM_PARAMETERS" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - <method /> - </configuration> - <configuration default="true" type="TestNG" factoryName="TestNG"> - <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> - <module name="" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - <option name="SUITE_NAME" /> - <option name="PACKAGE_NAME" /> - <option name="MAIN_CLASS_NAME" /> - <option name="METHOD_NAME" /> - <option name="GROUP_NAME" /> - <option name="TEST_OBJECT" value="CLASS" /> - <option name="VM_PARAMETERS" value="-ea" /> - <option name="PARAMETERS" /> - <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> - <option name="OUTPUT_DIRECTORY" /> - <option name="ANNOTATION_TYPE" /> - <option name="ENV_VARIABLES" /> - <option name="PASS_PARENT_ENVS" value="true" /> - <option name="TEST_SEARCH_SCOPE"> - <value defaultName="moduleWithDependencies" /> - </option> - <option name="USE_DEFAULT_REPORTERS" value="false" /> - <option name="PROPERTIES_FILE" /> - <envs /> - <properties /> - <listeners /> - <method /> - </configuration> - <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js"> - <node-options /> - <gulpfile /> - <tasks /> - <pass-parent-envs>true</pass-parent-envs> - <envs /> - <method /> - </configuration> - <configuration default="true" type="PhpUnitRemoteRunConfigurationType" factoryName="PHPUnit on Server"> - <method /> - </configuration> - <configuration default="true" type="JUnit" factoryName="JUnit"> - <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> - <module name="" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - <option name="PACKAGE_NAME" /> - <option name="MAIN_CLASS_NAME" /> - <option name="METHOD_NAME" /> - <option name="TEST_OBJECT" value="class" /> - <option name="VM_PARAMETERS" value="-ea" /> - <option name="PARAMETERS" /> - <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> - <option name="ENV_VARIABLES" /> - <option name="PASS_PARENT_ENVS" value="true" /> - <option name="TEST_SEARCH_SCOPE"> - <value defaultName="moduleWithDependencies" /> - </option> - <envs /> - <patterns /> - <method /> - </configuration> - <configuration default="true" type="FlashRunConfigurationType" factoryName="Flash App"> - <option name="BCName" value="" /> - <option name="IOSSimulatorSdkPath" value="" /> - <option name="adlOptions" value="" /> - <option name="airProgramParameters" value="" /> - <option name="appDescriptorForEmulator" value="Android" /> - <option name="debugTransport" value="USB" /> - <option name="debuggerSdkRaw" value="BC SDK" /> - <option name="emulator" value="NexusOne" /> - <option name="emulatorAdlOptions" value="" /> - <option name="fastPackaging" value="true" /> - <option name="fullScreenHeight" value="0" /> - <option name="fullScreenWidth" value="0" /> - <option name="launchUrl" value="false" /> - <option name="launcherParameters"> - <LauncherParameters> - <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" /> - <option name="launcherType" value="OSDefault" /> - <option name="newPlayerInstance" value="false" /> - <option name="playerPath" value="/Applications/Flash Player Debugger.app" /> - </LauncherParameters> - </option> - <option name="mobileRunTarget" value="Emulator" /> - <option name="moduleName" value="" /> - <option name="overriddenMainClass" value="" /> - <option name="overriddenOutputFileName" value="" /> - <option name="overrideMainClass" value="false" /> - <option name="runTrusted" value="true" /> - <option name="screenDpi" value="0" /> - <option name="screenHeight" value="0" /> - <option name="screenWidth" value="0" /> - <option name="url" value="http://" /> - <option name="usbDebugPort" value="7936" /> - <method /> - </configuration> - <configuration default="true" type="PHPUnitRunConfigurationType" factoryName="PHPUnit"> - <TestRunner /> - <method /> - </configuration> - <configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests"> - <module name="" /> - <option name="TESTING_TYPE" value="0" /> - <option name="INSTRUMENTATION_RUNNER_CLASS" value="" /> - <option name="METHOD_NAME" value="" /> - <option name="CLASS_NAME" value="" /> - <option name="PACKAGE_NAME" value="" /> - <option name="TARGET_SELECTION_MODE" value="EMULATOR" /> - <option name="USE_LAST_SELECTED_DEVICE" value="false" /> - <option name="PREFERRED_AVD" value="" /> - <option name="USE_COMMAND_LINE" value="true" /> - <option name="COMMAND_LINE" value="" /> - <option name="WIPE_USER_DATA" value="false" /> - <option name="DISABLE_BOOT_ANIMATION" value="false" /> - <option name="NETWORK_SPEED" value="full" /> - <option name="NETWORK_LATENCY" value="none" /> - <option name="CLEAR_LOGCAT" value="false" /> - <option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" /> - <option name="FILTER_LOGCAT_AUTOMATICALLY" value="true" /> - <method /> - </configuration> - <configuration default="true" type="BashConfigurationType" factoryName="Bash"> - <option name="INTERPRETER_OPTIONS" value="" /> - <option name="INTERPRETER_PATH" value="/bin/bash" /> - <option name="WORKING_DIRECTORY" value="" /> - <option name="PARENT_ENVS" value="true" /> - <option name="SCRIPT_NAME" value="" /> - <option name="PARAMETERS" value="" /> - <module name="" /> - <envs /> - <method /> - </configuration> - <configuration default="true" type="JarApplication" factoryName="JAR Application"> - <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> - <envs /> - <method /> - </configuration> - <configuration default="true" type="GradleRunConfiguration" factoryName="Gradle"> - <ExternalSystemSettings> - <option name="executionName" /> - <option name="externalProjectPath" /> - <option name="externalSystemIdString" value="GRADLE" /> - <option name="scriptParameters" /> - <option name="taskDescriptions"> - <list /> - </option> - <option name="taskNames"> - <list /> - </option> - <option name="vmOptions" /> - </ExternalSystemSettings> - <method /> - </configuration> - <configuration default="true" type="FlexUnitRunConfigurationType" factoryName="FlexUnit" appDescriptorForEmulator="Android" class_name="" emulatorAdlOptions="" method_name="" package_name="" scope="Class"> - <option name="BCName" value="" /> - <option name="launcherParameters"> - <LauncherParameters> - <option name="browser" value="a7bb68e0-33c0-4d6f-a81a-aac1fdb870c8" /> - <option name="launcherType" value="OSDefault" /> - <option name="newPlayerInstance" value="false" /> - <option name="playerPath" value="/Applications/Flash Player Debugger.app" /> - </LauncherParameters> - </option> - <option name="moduleName" value="" /> - <option name="trusted" value="true" /> - <method /> - </configuration> - <configuration default="true" type="CucumberJavaRunConfigurationType" factoryName="Cucumber java"> - <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> - <option name="myFilePath" /> - <option name="GLUE" /> - <option name="myNameFilter" /> - <option name="myGeneratedName" /> - <option name="MAIN_CLASS_NAME" /> - <option name="VM_PARAMETERS" /> - <option name="PROGRAM_PARAMETERS" /> - <option name="WORKING_DIRECTORY" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - <option name="ENABLE_SWING_INSPECTOR" value="false" /> - <option name="ENV_VARIABLES" /> - <option name="PASS_PARENT_ENVS" value="true" /> - <module name="" /> - <envs /> - <method /> - </configuration> - <configuration default="true" type="Application" factoryName="Application"> - <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" /> - <option name="MAIN_CLASS_NAME" /> - <option name="VM_PARAMETERS" /> - <option name="PROGRAM_PARAMETERS" /> - <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> - <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> - <option name="ALTERNATIVE_JRE_PATH" /> - <option name="ENABLE_SWING_INSPECTOR" value="false" /> - <option name="ENV_VARIABLES" /> - <option name="PASS_PARENT_ENVS" value="true" /> - <module name="" /> - <envs /> - <method /> - </configuration> - <configuration default="true" type="AndroidRunConfigurationType" factoryName="Android Application"> - <module name="" /> - <option name="ACTIVITY_CLASS" value="" /> - <option name="MODE" value="default_activity" /> - <option name="DEPLOY" value="true" /> - <option name="ARTIFACT_NAME" value="" /> - <option name="TARGET_SELECTION_MODE" value="EMULATOR" /> - <option name="USE_LAST_SELECTED_DEVICE" value="false" /> - <option name="PREFERRED_AVD" value="" /> - <option name="USE_COMMAND_LINE" value="true" /> - <option name="COMMAND_LINE" value="" /> - <option name="WIPE_USER_DATA" value="false" /> - <option name="DISABLE_BOOT_ANIMATION" value="false" /> - <option name="NETWORK_SPEED" value="full" /> - <option name="NETWORK_LATENCY" value="none" /> - <option name="CLEAR_LOGCAT" value="false" /> - <option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" /> - <option name="FILTER_LOGCAT_AUTOMATICALLY" value="true" /> - <method /> - </configuration> - <list size="0" /> - <configuration name="<template>" type="WebApp" default="true" selected="false"> - <Host>localhost</Host> - <Port>5050</Port> - </configuration> - </component> - <component name="ShelveChangesManager" show_recycled="false" /> - <component name="SvnConfiguration" myUseAcceleration="nothing"> - <configuration /> - </component> - <component name="TaskManager"> - <task active="true" id="Default" summary="Default task"> - <changelist id="96110866-69f3-4eb0-8539-5f26f68fe1ac" name="Default" comment="" /> - <created>1380298653954</created> - <option name="number" value="Default" /> - <updated>1380298653954</updated> - <workItem from="1390857442497" duration="680000" /> - <workItem from="1391027761184" duration="538000" /> - <workItem from="1402047801442" duration="226000" /> - <workItem from="1417632415028" duration="123000" /> - <workItem from="1417702903217" duration="1164000" /> - <workItem from="1417732337674" duration="68000" /> - <workItem from="1432718035482" duration="300000" /> - <workItem from="1434477283713" duration="33000" /> - <workItem from="1434530183600" duration="166000" /> - <workItem from="1434576966771" duration="61000" /> - <workItem from="1435160289082" duration="779000" /> - <workItem from="1437822576701" duration="751000" /> - <workItem from="1440661703645" duration="1158000" /> - </task> - <task id="LOCAL-00001" summary="initial checkin"> - <created>1380299229689</created> - <option name="number" value="00001" /> - <option name="project" value="LOCAL" /> - <updated>1380299229689</updated> - </task> - <task id="LOCAL-00002" summary="initial checkin"> - <created>1380302935690</created> - <option name="number" value="00002" /> - <option name="project" value="LOCAL" /> - <updated>1380302935690</updated> - </task> - <task id="LOCAL-00003" summary="testing scheme"> - <created>1380305538088</created> - <option name="number" value="00003" /> - <option name="project" value="LOCAL" /> - <updated>1380305538088</updated> - </task> - <task id="LOCAL-00004" summary="testing scheme"> - <created>1380305862564</created> - <option name="number" value="00004" /> - <option name="project" value="LOCAL" /> - <updated>1380305862564</updated> - </task> - <task id="LOCAL-00005" summary="testing scheme"> - <created>1380306489891</created> - <option name="number" value="00005" /> - <option name="project" value="LOCAL" /> - <updated>1380306489891</updated> - </task> - <task id="LOCAL-00006" summary="testing scheme"> - <created>1380307532008</created> - <option name="number" value="00006" /> - <option name="project" value="LOCAL" /> - <updated>1380307532008</updated> - </task> - <task id="LOCAL-00007" summary="testing scheme"> - <created>1380307669209</created> - <option name="number" value="00007" /> - <option name="project" value="LOCAL" /> - <updated>1380307669209</updated> - </task> - <task id="LOCAL-00008" summary="testing scheme"> - <created>1380311306948</created> - <option name="number" value="00008" /> - <option name="project" value="LOCAL" /> - <updated>1380311306949</updated> - </task> - <task id="LOCAL-00009" summary="testing scheme"> - <created>1380311921427</created> - <option name="number" value="00009" /> - <option name="project" value="LOCAL" /> - <updated>1380311921427</updated> - </task> - <task id="LOCAL-00010" summary="Android w.i.p."> - <created>1380317008739</created> - <option name="number" value="00010" /> - <option name="project" value="LOCAL" /> - <updated>1380317008739</updated> - </task> - <task id="LOCAL-00011" summary="Android w.i.p."> - <created>1380317829887</created> - <option name="number" value="00011" /> - <option name="project" value="LOCAL" /> - <updated>1380317829888</updated> - </task> - <task id="LOCAL-00012" summary="Android w.i.p."> - <created>1380353871771</created> - <option name="number" value="00012" /> - <option name="project" value="LOCAL" /> - <updated>1380353871771</updated> - </task> - <task id="LOCAL-00013" summary="testing schemes"> - <created>1380358237732</created> - <option name="number" value="00013" /> - <option name="project" value="LOCAL" /> - <updated>1380358237732</updated> - </task> - <task id="LOCAL-00014" summary="testing schemes"> - <created>1380358605885</created> - <option name="number" value="00014" /> - <option name="project" value="LOCAL" /> - <updated>1380358605885</updated> - </task> - <task id="LOCAL-00015" summary="testing schemes"> - <created>1380376149014</created> - <option name="number" value="00015" /> - <option name="project" value="LOCAL" /> - <updated>1380376149014</updated> - </task> - <task id="LOCAL-00016" summary="testing schemes"> - <created>1380378153190</created> - <option name="number" value="00016" /> - <option name="project" value="LOCAL" /> - <updated>1380378153205</updated> - </task> - <task id="LOCAL-00017" summary="cleanup"> - <created>1380383948466</created> - <option name="number" value="00017" /> - <option name="project" value="LOCAL" /> - <updated>1380383948466</updated> - </task> - <task id="LOCAL-00018" summary="docs"> - <created>1380393159906</created> - <option name="number" value="00018" /> - <option name="project" value="LOCAL" /> - <updated>1380393159906</updated> - </task> - <task id="LOCAL-00019" summary="docs"> - <created>1380393508799</created> - <option name="number" value="00019" /> - <option name="project" value="LOCAL" /> - <updated>1380393508799</updated> - </task> - <task id="LOCAL-00020" summary="docs"> - <created>1380393757355</created> - <option name="number" value="00020" /> - <option name="project" value="LOCAL" /> - <updated>1380393757355</updated> - </task> - <task id="LOCAL-00021" summary="docs"> - <created>1380393772924</created> - <option name="number" value="00021" /> - <option name="project" value="LOCAL" /> - <updated>1380393772924</updated> - </task> - <task id="LOCAL-00022" summary="docs"> - <created>1380402190419</created> - <option name="number" value="00022" /> - <option name="project" value="LOCAL" /> - <updated>1380402190419</updated> - </task> - <task id="LOCAL-00023" summary="docs"> - <created>1380402398063</created> - <option name="number" value="00023" /> - <option name="project" value="LOCAL" /> - <updated>1380402398063</updated> - </task> - <task id="LOCAL-00024" summary="docs"> - <created>1380402815702</created> - <option name="number" value="00024" /> - <option name="project" value="LOCAL" /> - <updated>1380402815702</updated> - </task> - <task id="LOCAL-00025" summary="found a way to pass a custom urlscheme when the plugin is added"> - <created>1380488689110</created> - <option name="number" value="00025" /> - <option name="project" value="LOCAL" /> - <updated>1380488689110</updated> - </task> - <task id="LOCAL-00026" summary="docs"> - <created>1380488797067</created> - <option name="number" value="00026" /> - <option name="project" value="LOCAL" /> - <updated>1380488797067</updated> - </task> - <task id="LOCAL-00027" summary="docs"> - <created>1380488875151</created> - <option name="number" value="00027" /> - <option name="project" value="LOCAL" /> - <updated>1380488875151</updated> - </task> - <task id="LOCAL-00028" summary="docs"> - <created>1380489049263</created> - <option name="number" value="00028" /> - <option name="project" value="LOCAL" /> - <updated>1380489049263</updated> - </task> - <task id="LOCAL-00029" summary="- docs - version++"> - <created>1380489820453</created> - <option name="number" value="00029" /> - <option name="project" value="LOCAL" /> - <updated>1380489820453</updated> - </task> - <task id="LOCAL-00030" summary="Implemented feedback by Adobe (plugin should indeed work if no JS handler. Thx guys!)."> - <created>1380567506465</created> - <option name="number" value="00030" /> - <option name="project" value="LOCAL" /> - <updated>1380567506465</updated> - </task> - <task id="LOCAL-00031" summary="Implemented feedback by Adobe (plugin should indeed work if no JS handler. Thx guys!)."> - <created>1380567576964</created> - <option name="number" value="00031" /> - <option name="project" value="LOCAL" /> - <updated>1380567576964</updated> - </task> - <task id="LOCAL-00032" summary="Implemented feedback by Adobe (plugin should indeed work if no JS handler. Thx guys!)."> - <created>1380567665822</created> - <option name="number" value="00032" /> - <option name="project" value="LOCAL" /> - <updated>1380567665822</updated> - </task> - <task id="LOCAL-00033" summary="Upgrading to PhoneGap 3.x"> - <created>1383169425770</created> - <option name="number" value="00033" /> - <option name="project" value="LOCAL" /> - <updated>1383169425770</updated> - </task> - <task id="LOCAL-00034" summary="Upgrading to PhoneGap 3.x (DroidGap is gone)"> - <created>1383172326587</created> - <option name="number" value="00034" /> - <option name="project" value="LOCAL" /> - <updated>1383172326587</updated> - </task> - <task id="LOCAL-00035" summary="Upgrading to PhoneGap 3.x (DroidGap is gone)"> - <created>1383174045796</created> - <option name="number" value="00035" /> - <option name="project" value="LOCAL" /> - <updated>1383174045796</updated> - </task> - <task id="LOCAL-00036" summary="- Check intent when the app is resumed - Plugin rename: launchMyApp --> Custom URL Scheme"> - <created>1390857761557</created> - <option name="number" value="00036" /> - <option name="project" value="LOCAL" /> - <updated>1390857761557</updated> - </task> - <task id="LOCAL-00037" summary="- Check intent when the app is resumed - Plugin rename: launchMyApp --> Custom URL Scheme "> - <created>1390857936690</created> - <option name="number" value="00037" /> - <option name="project" value="LOCAL" /> - <updated>1390857936690</updated> - </task> - <task id="LOCAL-00038" summary="Hotfix for silly clobbers comment f*$%#p"> - <created>1391028041914</created> - <option name="number" value="00038" /> - <option name="project" value="LOCAL" /> - <updated>1391028041914</updated> - </task> - <task id="LOCAL-00039" summary="[#13] cleaned up some now obsolete workarounds for singleTask mode, thanks a lot https://github.com/cef62 !"> - <created>1402048017666</created> - <option name="number" value="00039" /> - <option name="project" value="LOCAL" /> - <updated>1402048017666</updated> - </task> - <task id="LOCAL-00040" summary="Hardening against XSS attacks, thanks Neil Bergman (nbergman@cigital.com)!"> - <created>1417632494865</created> - <option name="number" value="00040" /> - <option name="project" value="LOCAL" /> - <updated>1417632494865</updated> - </task> - <task id="LOCAL-00041" summary="#55 #2 Less aggressive cleanup of the intent"> - <created>1417703047123</created> - <option name="number" value="00041" /> - <option name="project" value="LOCAL" /> - <updated>1417703047123</updated> - </task> - <task id="LOCAL-00042" summary="#55 #2 Less aggressive cleanup of the intent"> - <created>1417706007258</created> - <option name="number" value="00042" /> - <option name="project" value="LOCAL" /> - <updated>1417706007258</updated> - </task> - <task id="LOCAL-00043" summary="Possible fix for #65"> - <created>1434477311221</created> - <option name="number" value="00043" /> - <option name="project" value="LOCAL" /> - <updated>1434477311221</updated> - </task> - <task id="LOCAL-00044" summary="Definite fix for #65"> - <created>1434530307503</created> - <option name="number" value="00044" /> - <option name="project" value="LOCAL" /> - <updated>1434530307503</updated> - </task> - <task id="LOCAL-00045" summary="More definite fix for #65"> - <created>1434577022103</created> - <option name="number" value="00045" /> - <option name="project" value="LOCAL" /> - <updated>1434577022103</updated> - </task> - <task id="LOCAL-00046" summary="Even more definite fix for #65, now also compatible with launching your app from another app (which frankly... doesn't pass a category=browsable)"> - <created>1435161053225</created> - <option name="number" value="00046" /> - <option name="project" value="LOCAL" /> - <updated>1435161053225</updated> - </task> - <task id="LOCAL-00047" summary="#95 Make plugin available on npm"> - <created>1440664137793</created> - <option name="number" value="00047" /> - <option name="project" value="LOCAL" /> - <updated>1440664137793</updated> - </task> - <task id="LOCAL-00048" summary="#90 Attempted to send a second callback for ID: LaunchMyApp Result was: "Invalid action""> - <created>1440664585797</created> - <option name="number" value="00048" /> - <option name="project" value="LOCAL" /> - <updated>1440664585797</updated> - </task> - <option name="localTasksCounter" value="49" /> - <servers /> - </component> - <component name="TimeTrackingManager"> - <option name="totallyTimeSpent" value="6047000" /> - </component> - <component name="ToolWindowManager"> - <frame x="587" y="23" width="1095" height="926" extended-state="0" /> - <editor active="true" /> - <layout> - <window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Changes" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32763532" sideWeight="0.6703807" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Atlassian " active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" /> - <window_info id="Remote Host" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" /> - <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> - <window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> - <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32439336" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" /> - <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" /> - <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> - <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24121557" sideWeight="0.67006487" order="0" side_tool="false" content_ui="combo" /> - <window_info id="CDI" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> - <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> - <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="9" side_tool="false" content_ui="combo" /> - <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" /> - <window_info id="JetGradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> - <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> - <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" /> - </layout> - <layout-to-restore> - <window_info id="UI Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="Changes" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32763532" sideWeight="0.6703807" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" /> - <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Remote Host" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> - <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" /> - <window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> - <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32439336" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> - <window_info id="CDI" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="13" side_tool="false" content_ui="tabs" /> - <window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> - <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24121557" sideWeight="0.67006487" order="1" side_tool="false" content_ui="combo" /> - <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" /> - <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="11" side_tool="false" content_ui="combo" /> - <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" /> - <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> - <window_info id="JetGradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> - <window_info id="Atlassian " active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> - <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> - <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> - <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> - <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" /> - <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="true" content_ui="tabs" /> - <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" /> - <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> - <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" /> - <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" /> - <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="12" side_tool="false" content_ui="tabs" /> - </layout-to-restore> - </component> - <component name="Vcs.Log.UiProperties"> - <option name="RECENTLY_FILTERED_USER_GROUPS"> - <collection /> - </option> - <option name="RECENTLY_FILTERED_BRANCH_GROUPS"> - <collection /> - </option> - </component> - <component name="VcsContentAnnotationSettings"> - <option name="myLimit" value="2678400000" /> - </component> - <component name="VcsManagerConfiguration"> - <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" /> - <option name="CHECK_NEW_TODO" value="false" /> - <option name="myTodoPanelSettings"> - <TodoPanelSettings /> - </option> - <MESSAGE value="initial checkin" /> - <MESSAGE value="testing scheme" /> - <MESSAGE value="Android w.i.p." /> - <MESSAGE value="testing schemes" /> - <MESSAGE value="cleanup" /> - <MESSAGE value="found a way to pass a custom urlscheme when the plugin is added" /> - <MESSAGE value="docs" /> - <MESSAGE value="- docs - version++" /> - <MESSAGE value="Implemented feedback by Adobe (plugin should indeed work if no JS handler. Thx guys!)." /> - <MESSAGE value="Upgrading to PhoneGap 3.x" /> - <MESSAGE value="Upgrading to PhoneGap 3.x (DroidGap is gone)" /> - <MESSAGE value="- Check intent when the app is resumed - Plugin rename: launchMyApp --> Custom URL Scheme" /> - <MESSAGE value="- Check intent when the app is resumed - Plugin rename: launchMyApp --> Custom URL Scheme " /> - <MESSAGE value="Hotfix for silly clobbers comment f*$%#p" /> - <MESSAGE value="[#13] cleaned up some now obsolete workarounds for singleTask mode, thanks a lot https://github.com/cef62 !" /> - <MESSAGE value="Hardening against XSS attacks, thanks Neil Bergman (nbergman@cigital.com)!" /> - <MESSAGE value="#55 #2 Less aggressive cleanup of the intent" /> - <MESSAGE value="Possible fix for #65" /> - <MESSAGE value="Definite fix for #65" /> - <MESSAGE value="More definite fix for #65" /> - <MESSAGE value="Even more definite fix for #65, now also compatible with launching your app from another app (which frankly... doesn't pass a category=browsable)" /> - <MESSAGE value="#95 Make plugin available on npm" /> - <MESSAGE value="#90 Attempted to send a second callback for ID: LaunchMyApp Result was: "Invalid action"" /> - <option name="LAST_COMMIT_MESSAGE" value="#90 Attempted to send a second callback for ID: LaunchMyApp Result was: "Invalid action"" /> - </component> - <component name="XDebuggerManager"> - <breakpoint-manager> - <option name="time" value="1" /> - </breakpoint-manager> - <watches-manager /> - </component> - <component name="antWorkspaceConfiguration"> - <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" /> - <option name="FILTER_TARGETS" value="false" /> - </component> - <component name="atlassian-ide-plugin-workspace"> - <option name="bambooConfiguration"> - <BambooWorkspaceConfiguration> - <option name="view"> - <BambooViewConfigurationBean /> - </option> - </BambooWorkspaceConfiguration> - </option> - <option name="defaultCredentials"> - <UserCfgBean /> - </option> - </component> - <component name="atlassian-ide-plugin-workspace-issues"> - <option name="view"> - <JiraViewConfigurationBean> - <option name="viewFilterId" value="" /> - </JiraViewConfigurationBean> - </option> - </component> - <component name="editorHistoryManager"> - <entry file="file://$PROJECT_DIR$/www/android/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="450"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="285" max-vertical-offset="1035"> - <caret line="19" column="12" selection-start-line="19" selection-start-column="12" selection-end-line="19" selection-end-column="12" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/android/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="225" max-vertical-offset="315"> - <caret line="15" column="0" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/android/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="8" column="22" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/src/android/nl/xservices/plugins/LaunchMyApp.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="19" column="16" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="28" column="14" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/android/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="6" column="25" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/src/android/nl/xservices/plugins/LaunchMyApp.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="26" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/android/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="8" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/src/android/nl/xservices/plugins/LaunchMyApp.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="26" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/android/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="8" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="38" column="18" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/src/android/nl/xservices/plugins/LaunchMyApp.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="26" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="16" column="16" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/.gitignore"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.014299333" vertical-offset="0" max-vertical-offset="0"> - <caret line="1" column="5" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/../mgggplus/mgggplus-frontend/www/config.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="0"> - <caret line="12" column="23" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/ios/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="743"> - <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/android/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="450"> - <caret line="18" column="22" selection-start-line="18" selection-start-column="22" selection-end-line="18" selection-end-column="22" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/www/windows/LaunchMyApp.js"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.1986755" vertical-offset="0" max-vertical-offset="755"> - <caret line="10" column="0" selection-start-line="10" selection-start-column="0" selection-end-line="10" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/README.md"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-2.0" vertical-offset="0" max-vertical-offset="3105"> - <caret line="4" column="24" selection-start-line="4" selection-start-column="24" selection-end-line="4" selection-end-column="24" /> - <folding /> - </state> - </provider> - <provider editor-type-id="MarkdownPreviewEditor"> - <state /> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/package.json"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="-5.625" vertical-offset="0" max-vertical-offset="720"> - <caret line="9" column="17" selection-start-line="9" selection-start-column="17" selection-end-line="9" selection-end-column="17" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/plugin.xml"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1695"> - <caret line="7" column="0" selection-start-line="7" selection-start-column="0" selection-end-line="7" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/src/android/nl/xservices/plugins/LaunchMyApp.java"> - <provider selected="true" editor-type-id="text-editor"> - <state vertical-scroll-proportion="0.13907285" vertical-offset="60" max-vertical-offset="1920"> - <caret line="22" column="43" selection-start-line="22" selection-start-column="43" selection-end-line="22" selection-end-column="43" /> - <folding /> - </state> - </provider> - </entry> - </component> -</project>
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/README.md b/StoneIsland/plugins/cordova-plugin-customurlscheme/README.md index 2de829c2..d7222e90 100644 --- a/StoneIsland/plugins/cordova-plugin-customurlscheme/README.md +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/README.md @@ -1,6 +1,6 @@ # Custom URL scheme PhoneGap Plugin #### launch your app by a link like this: `mycoolapp://` -for iOS and Android, by [Eddy Verbruggen](http://www.x-services.nl) +for iOS, Android and WP, by [Eddy Verbruggen](http://www.x-services.nl) - This repo is for PhoneGap 3.0.0 and up - For PhoneGap 2.9.0 and lower, [switch to the phonegap-2.9.0-and-lower branch](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin/tree/phonegap-2.9.0-and-lower) @@ -10,11 +10,15 @@ for iOS and Android, by [Eddy Verbruggen](http://www.x-services.nl) 2. [Manually](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin#manually) 2. [PhoneGap Build](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin#phonegap-build) 3. [Usage](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin#3-usage) + 2. [iOS](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin#ios-usage) + 2. [Meteor](https://github.com/EddyVerbruggen/Custom-URL-scheme#meteor--getlastintent-android-only) 4. [URL Scheme hints](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin#4-url-scheme-hints) 5. [License](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin#5-license) -### BEWARE: [This Apache Cordova issue](https://issues.apache.org/jira/browse/CB-7606) causes problems with Cordova-iOS 3.7.0: the `handleOpenURL` function is not invoked upon cold start. Use a higher or lower version than 3.7.0. +### BEWARE: +### - [This Apache Cordova issue](https://issues.apache.org/jira/browse/CB-7606) causes problems with Cordova-iOS 3.7.0: the `handleOpenURL` function is not invoked upon cold start. Use a higher or lower version than 3.7.0. +### - As of iOS 9.2, the dialog `Open in "mycoolapp"?` no longer blocks JS, so if you have a short timeout that opens the app store, the user will be taken to the store before they have a chance to see and answer the dialog. [See below](https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin#ios-usage) for available solutions. ## 1. Description @@ -32,6 +36,8 @@ This plugin allows you to start your app by calling it with a URL like `mycoolap ### Android specifics * Unlike iOS, there is no way to use config.xml to define a scheme for your app. Now there is. * Tested on Android 4.3, will most likely work with 2.2 and up. +* If you're trying to launch your app from an In-App Browser it opened previously, then [use this In-App Browser plugin fork](https://github.com/Innovation-District/cordova-plugin-inappbrowser) which allows that. +* In case you have a multi-page app (multiple HTML files, and all implementing handleOpenURL), set the preference `CustomURLSchemePluginClearsAndroidIntent` to `true` in `config.xml` so the function won't be triggered multiple times. Note that this may interfere with other plugins requiring the intent data. ## 2. Installation @@ -168,6 +174,37 @@ function handleOpenURL(url) { A more useful implementation would mean parsing the URL, saving any params to sessionStorage and redirecting the app to the correct page inside your app. All this happens before the first page is loaded. +### iOS Usage +A common method of deeplinking is to give the user the URL of a webpage (for instance http://linker.myapp.com/pathfoo) that opens the app if installed or the app store if not. This can be done in the following ways, depending on the desired UX: + +1. The page content has a button that says "Install app" and when clicked opens the app store by doing `location.href = 'itms-apps://itunes.apple.com/us/app/mycoolapp/idfoo'`. On page load, do `location.href = 'mycoolapp://pathfoo'`. If the user has the app, they will see a dialog that says `Open in "mycoolapp"? [Cancel] [Open]`. If the user does not have the app, they will see an alert that says `Cannot Open Page: Safari cannot open the page because the address is invalid`. Once they dismiss the alert, they see the button that opens the app store, and they tap it. +2. The page has two buttons: one that opens the app, and one that opens the app store. +3. On page load, open a Universal Link using [cordova-universal-links-plugin](https://github.com/nordnet/cordova-universal-links-plugin). (A Universal Link either opens the app or the app store.) Then fall back to one of the above methods if Univeral Links is not supported. + +You can also use a service that provides pages that do #3 for you, such as [Branch](https://branch.io/). + +### CSP - or: `handleOpenURL` doesn't work +The Whitelist plugin will prevent inline JS from executing, unless you whitelist the url scheme. Please see [this SO issue](http://stackoverflow.com/questions/34257097/using-handleopenurl-with-custom-url-scheme-in-cordova/34281420#34281420) for details. + +### Meteor / getLastIntent (Android only) +When running a [meteor](meteor.com) app in the cordova environment, `handleOpenURL` doesn't get called after a cold start, because cordova resets the javascript world during startup and our timer waiting for `handleOpenURL` gets vanished (see [#98](https://github.com/EddyVerbruggen/Custom-URL-scheme/issues/98)). To get the intent by which the app was started in a meteor cordova app you need to ask for it from the meteor side with `getLastIntent` like this. +```javascript +Meteor.startup(function() { + if (Meteor.isCordova) { + window.plugins.launchmyapp.getLastIntent(function(url) { + if (intent.indexOf('mycoolapp://' > -1)) { + console.log("received url: " + url); + } else { + return console.log("ignore intent: " + url); + } + }, function(error) { + return console.log("no intent received"); + }); + return; + } +}); +``` + ## 4. URL Scheme hints Please choose a URL_SCHEME which which complies to these restrictions: - Don't use an already registered scheme (like `fb`, `twitter`, `comgooglemaps`, etc). diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/atlassian-ide-plugin.xml b/StoneIsland/plugins/cordova-plugin-customurlscheme/atlassian-ide-plugin.xml deleted file mode 100644 index 858eed55..00000000 --- a/StoneIsland/plugins/cordova-plugin-customurlscheme/atlassian-ide-plugin.xml +++ /dev/null @@ -1,5 +0,0 @@ -<atlassian-ide-plugin>
- <project-configuration id="1">
- <servers id="2" />
- </project-configuration>
-</atlassian-ide-plugin>
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/package.json b/StoneIsland/plugins/cordova-plugin-customurlscheme/package.json index de90c8e2..3d0a4eaf 100644 --- a/StoneIsland/plugins/cordova-plugin-customurlscheme/package.json +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-customurlscheme", - "version": "4.0.0", + "version": "4.2.0", "description": "Launch your app by using this URL: mycoolapp://, you can add a path and even pass params like this: mycoolerapp://somepath?foo=bar", "cordova": { "id": "cordova-plugin-customurlscheme", @@ -40,4 +40,4 @@ "url": "https://github.com/EddyVerbruggen/Custom-URL-scheme/issues" }, "homepage": "https://github.com/EddyVerbruggen/Custom-URL-scheme#readme" -}
\ No newline at end of file +} diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/plugin.xml b/StoneIsland/plugins/cordova-plugin-customurlscheme/plugin.xml index 1e43e724..0fde67b0 100755 --- a/StoneIsland/plugins/cordova-plugin-customurlscheme/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/plugin.xml @@ -2,7 +2,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-customurlscheme" - version="4.0.0"> + version="4.2.0"> <name>Custom URL scheme</name> @@ -47,6 +47,10 @@ <!-- android --> <platform name="android"> + <preference name="ANDROID_SCHEME" default=" " /> + <preference name="ANDROID_HOST" default=" " /> + <preference name="ANDROID_PATHPREFIX" default="/" /> + <js-module src="www/android/LaunchMyApp.js" name="LaunchMyApp"> <clobbers target="window.plugins.launchmyapp" /> </js-module> @@ -59,16 +63,24 @@ <source-file src="src/android/nl/xservices/plugins/LaunchMyApp.java" target-dir="src/nl/xservices/plugins"/> - <config-file target="AndroidManifest.xml" parent="/*/application/activity"> + <config-file target="AndroidManifest.xml" parent="/manifest/application/activity"> <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="$URL_SCHEME"/> + </intent-filter> + <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="$ANDROID_SCHEME" + android:host="$ANDROID_HOST" + android:pathPrefix="$ANDROID_PATHPREFIX" /> </intent-filter> </config-file> </platform> - + <!-- windows8 --> <platform name="windows8"> <config-file target="package.appxmanifest" parent="/Package/Applications/Application/Extensions"> @@ -76,14 +88,20 @@ <Protocol Name="$URL_SCHEME" /> </Extension> </config-file> - + <js-module src="www/windows/LaunchMyApp.js" name="LaunchMyApp"> <clobbers target="window.plugins.launchmyapp" /> </js-module> </platform> - + <!-- windows --> <platform name="windows"> + <hook type="before_prepare" src="src/windows/hooks/prepare-manifest.js" /> + <config-file target="package.windows10.appxmanifest" parent="/Package/Applications/Application/Extensions"> + <uap:Extension Category="windows.protocol" StartPage="www/index.html"> + <uap:Protocol Name="$URL_SCHEME" /> + </uap:Extension> + </config-file> <config-file target="package.windows.appxmanifest" parent="/Package/Applications/Application/Extensions"> <Extension Category="windows.protocol" StartPage="www/index.html"> <Protocol Name="$URL_SCHEME" /> @@ -104,4 +122,28 @@ </js-module> </platform> + <!-- wp8 --> + <platform name="wp8"> + <config-file target="config.xml" parent="/*"> + <feature name="CustomUriMapperCommand"> + <param name="wp-package" value="CustomUriMapperCommand"/> + <param name="onload" value="true" /> + </feature> + </config-file> + + <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App" after="Tokens"> + <Extensions> + <Protocol Name="$URL_SCHEME" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" /> + </Extensions> + </config-file> + + <source-file src="src/wp8/CompositeUriMapper.cs" /> + <source-file src="src/wp8/ICustomUriMapper.cs" /> + <source-file src="src/wp8/CustomUriMapperCommand.cs" /> + <js-module src="www/wp8/LaunchMyApp.js" name="LaunchMyApp"> + <clobbers target="window.plugins.launchmyapp" /> + </js-module> + <hook type="after_plugin_install" src="src/wp8/hooks/add-uri-mapper.js" /> + </platform> + </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/src/android/nl/xservices/plugins/LaunchMyApp.java b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/android/nl/xservices/plugins/LaunchMyApp.java index 9d3f3d63..3a52d287 100644 --- a/StoneIsland/plugins/cordova-plugin-customurlscheme/src/android/nl/xservices/plugins/LaunchMyApp.java +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/android/nl/xservices/plugins/LaunchMyApp.java @@ -4,6 +4,8 @@ import android.content.Intent; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaActivity; import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaWebView; import org.apache.cordova.PluginResult; import org.json.JSONArray; import org.json.JSONException; @@ -16,19 +18,52 @@ import java.util.Locale; public class LaunchMyApp extends CordovaPlugin { private static final String ACTION_CHECKINTENT = "checkIntent"; + private static final String ACTION_CLEARINTENT = "clearIntent"; + private static final String ACTION_GETLASTINTENT = "getLastIntent"; + + private String lastIntentString = null; + + /** + * We don't want to interfere with other plugins requiring the intent data, + * but in case of a multi-page app your app may receive the same intent data + * multiple times, that's why you'll get an option to reset it (null it). + * + * Add this to config.xml to enable that behaviour (default false): + * <preference name="CustomURLSchemePluginClearsAndroidIntent" value="true"/> + */ + private boolean resetIntent; + + @Override + public void initialize(final CordovaInterface cordova, CordovaWebView webView){ + this.resetIntent = preferences.getBoolean("resetIntent", false) || + preferences.getBoolean("CustomURLSchemePluginClearsAndroidIntent", false); + } @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { - if (ACTION_CHECKINTENT.equalsIgnoreCase(action)) { + if (ACTION_CLEARINTENT.equalsIgnoreCase(action)) { + final Intent intent = ((CordovaActivity) this.webView.getContext()).getIntent(); + if (resetIntent){ + intent.setData(null); + } + return true; + } else if (ACTION_CHECKINTENT.equalsIgnoreCase(action)) { final Intent intent = ((CordovaActivity) this.webView.getContext()).getIntent(); final String intentString = intent.getDataString(); - if (intentString != null && intentString.contains("://") && intent.getScheme() != null) { + if (intentString != null && intent.getScheme() != null) { + lastIntentString = intentString; callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, intent.getDataString())); - intent.setData(null); } else { callbackContext.error("App was not started via the launchmyapp URL scheme. Ignoring this errorcallback is the best approach."); } return true; + } else if (ACTION_GETLASTINTENT.equalsIgnoreCase(action)) { + if(lastIntentString != null) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, lastIntentString)); + } else { + callbackContext.error("No intent received so far."); + } + return true; } else { callbackContext.error("This plugin only responds to the " + ACTION_CHECKINTENT + " action."); return false; @@ -38,8 +73,10 @@ public class LaunchMyApp extends CordovaPlugin { @Override public void onNewIntent(Intent intent) { final String intentString = intent.getDataString(); - if (intentString != null && intentString.contains("://") && intent.getScheme() != null) { - intent.setData(null); + if (intentString != null && intent.getScheme() != null) { + if (resetIntent){ + intent.setData(null); + } try { StringWriter writer = new StringWriter(intentString.length() * 2); escapeJavaStyleString(writer, intentString, true, false); @@ -133,4 +170,4 @@ public class LaunchMyApp extends CordovaPlugin { private static String hex(char ch) { return Integer.toHexString(ch).toUpperCase(Locale.ENGLISH); } -}
\ No newline at end of file +} diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/src/windows/hooks/prepare-manifest.js b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/windows/hooks/prepare-manifest.js new file mode 100644 index 00000000..06e237f7 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/windows/hooks/prepare-manifest.js @@ -0,0 +1,30 @@ +module.exports = function(context) { + var fs = context.requireCordovaModule('fs'), + et = context.requireCordovaModule('elementtree'), + path = context.requireCordovaModule('path'), + xml= context.requireCordovaModule('cordova-common').xmlHelpers, + projectRoot = path.join(context.opts.projectRoot, "platforms", "windows"); + + var MANIFEST_WINDOWS = 'package.windows.appxmanifest', + MANIFEST_PHONE = 'package.phone.appxmanifest', + MANIFEST_WINDOWS10 = 'package.windows10.appxmanifest', + MANIFEST_WINDOWS80 = 'package.windows80.appxmanifest'; + + function updateManifestFile(manifestPath) { + var doc = xml.parseElementtreeSync(manifestPath); + var root = doc.getroot(); + var app = root.find('./Applications/Application'); + if (!app) { + throw new Error(manifestPath + ' has incorrect XML structure.'); + } + if (!app.find('./Extensions')) { + app.append(new et.Element('Extensions')); + } + fs.writeFileSync(manifestPath, doc.write({indent: 4}), 'utf-8'); + } + + [MANIFEST_PHONE, MANIFEST_WINDOWS80, MANIFEST_WINDOWS, MANIFEST_WINDOWS10] + .forEach(function(manifestFile) { + updateManifestFile(path.join(projectRoot, manifestFile)); + }); +} diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/CompositeUriMapper.cs b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/CompositeUriMapper.cs new file mode 100644 index 00000000..8db593b8 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/CompositeUriMapper.cs @@ -0,0 +1,46 @@ +using System; +using System.Linq; +using System.Windows.Navigation; + +internal class CompositeUriMapper : UriMapperBase +{ + public static string launchUrl; + + public override Uri MapUri(Uri uri) + { + string launchUri = uri.ToString(); + if (launchUri.StartsWith("/Protocol?encodedLaunchUri=")) + { + int launchUrlIndex = launchUri.IndexOf("encodedLaunchUri="); + launchUrl = System.Net.HttpUtility.UrlDecode(launchUri.Substring(launchUrlIndex+17)); + return new Uri("/MainPage.xaml", UriKind.Relative); + } + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var types = assemblies.SelectMany(a => + { + try + { + return a.ExportedTypes.Where(et => typeof(ICustomUriMapper).IsAssignableFrom(et)); + } + catch + { + return Enumerable.Empty<Type>(); + } + }); + + foreach (var type in types) + { + if (type != typeof(ICustomUriMapper)) + { + var worker = (ICustomUriMapper)Activator.CreateInstance(type); + var mappedUri = worker.CustomMapUri(uri); + if (mappedUri != null) + { + return mappedUri; + } + } + } + + return uri; + } +}
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/CustomUriMapperCommand.cs b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/CustomUriMapperCommand.cs new file mode 100644 index 00000000..2004f2ec --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/CustomUriMapperCommand.cs @@ -0,0 +1,9 @@ +using System; +using WPCordovaClassLib.Cordova.Commands; + +namespace Cordova.Extension.Commands +{ + public class CustomUriMapperCommand : BaseCommand + { + } +}
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/ICustomUriMapper.cs b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/ICustomUriMapper.cs new file mode 100644 index 00000000..2cc31e5c --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/ICustomUriMapper.cs @@ -0,0 +1,7 @@ +using System; +using System.Linq; + +public interface ICustomUriMapper +{ + Uri CustomMapUri(Uri uri); +} diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/hooks/add-uri-mapper.js b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/hooks/add-uri-mapper.js new file mode 100644 index 00000000..1c1db69c --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/src/wp8/hooks/add-uri-mapper.js @@ -0,0 +1,80 @@ +module.exports = function (context) { + var deferred = context.requireCordovaModule('q').defer(), + fs = context.requireCordovaModule('fs'), + path = context.requireCordovaModule('path'), + projectRoot = context.opts.projectRoot; + + // While on AppBuilder this may work, the Cordova CLI doesn't like it + // (or at least not all versions of it). + var appXaml = path.join(projectRoot, "App.xaml.cs"); + var mainPageXaml = path.join(projectRoot, "MainPage.xaml.cs"); + try { + fs.statSync(appXaml); + fs.statSync(mainPageXaml); + } catch (err) { + appXaml = path.join(projectRoot, "platforms", "wp8", "App.xaml.cs"); + mainPageXaml = path.join(projectRoot, "platforms", "wp8", "MainPage.xaml.cs"); + try { + fs.statSync(appXaml); + fs.statSync(mainPageXaml); + } catch (err2) { + console.error("Custom URL Scheme plugin couldn't find your App's xaml file! Try to adjust the file manually according to the 'add-uri-mapper.js' hook."); + return; + } + } + + fs.readFile(appXaml, 'utf8', function (err,data) { + if (err) { + console.error("Error while configuring the Custom URL Scheme: " + err); + deferred.reject(err); + return; + } + + var result = data.replace(/^(\s*?)(RootFrame.NavigationFailed\s*?\+=\s*?RootFrame_NavigationFailed;)/gm, + "$1$2\n\n$1// Assign the URI-mapper class to the application frame\n$1RootFrame.UriMapper = new CompositeUriMapper();"); + + fs.writeFile(appXaml, result, 'utf8', function (err) { + if (err){ + deferred.reject(err); + } else{ + deferred.resolve(); + } + }); + }); + + fs.readFile(mainPageXaml, 'utf8', function (err,data) { + if (err) { + console.error("Error while configuring the Custom URL Scheme: " + err); + deferred.reject(err); + return; + } + + // first add a line to refer to a new method + var result = data.replace(/^(\s*?)(this.CordovaView.Loaded\s*?\+=\s*?CordovaView_Loaded;)/gm, + "$1$2\n\n$1// Wire a handler so we can check for our custom scheme\n$1this.CordovaView.Browser.LoadCompleted += CordovaBrowser_LoadCompleted;"); + + // now add that new method + result = result.replace(/^(\s*?)(\/\/ Constructor)/gm, + "$1void CordovaBrowser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) {\n"+ + "$1\tif (CompositeUriMapper.launchUrl != null) {\n" + + "$1\t\tstring handleOpenURL = string.Format(\"(function() {{ document.addEventListener('deviceready', function() {{ if (typeof handleOpenURL === 'function') {{ handleOpenURL(\\\"{0}\\\"); }} }}); }})()\", CompositeUriMapper.launchUrl);\n" + + "$1\t\ttry {\n" + + "$1\t\t\tthis.CordovaView.CordovaBrowser.InvokeScript(\"eval\", new string[] { handleOpenURL });\n" + + "$1\t\t} catch (Exception) {}\n" + + "$1\t\tCompositeUriMapper.launchUrl = null;\n" + + "$1\t}\n" + + "$1\tthis.CordovaView.Browser.LoadCompleted -= CordovaBrowser_LoadCompleted;\n" + + "$1}\n\n" + + "$1$2"); + + fs.writeFile(mainPageXaml, result, 'utf8', function (err) { + if (err){ + deferred.reject(err); + } else{ + deferred.resolve(); + } + }); + }); + + return deferred.promise; +}
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/www/android/LaunchMyApp.js b/StoneIsland/plugins/cordova-plugin-customurlscheme/www/android/LaunchMyApp.js index 19dbdc0b..18fe0112 100644 --- a/StoneIsland/plugins/cordova-plugin-customurlscheme/www/android/LaunchMyApp.js +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/www/android/LaunchMyApp.js @@ -4,10 +4,18 @@ var remainingAttempts = 10; function waitForAndCallHandlerFunction(url) { - if (typeof window.handleOpenURL == "function") { + if (typeof window.handleOpenURL === "function") { + // Clear the intent when we have a handler (note that this is only done when the preference 'CustomURLSchemePluginClearsAndroidIntent' is 'true' in config.xml + cordova.exec( + null, + null, + "LaunchMyApp", + "clearIntent", + []); + window.handleOpenURL(url); } else if (remainingAttempts-- > 0) { - setTimeout(function(){waitForAndCallHandlerFunction(url)}, 500); + setTimeout(function(){waitForAndCallHandlerFunction(url);}, 500); } } @@ -21,4 +29,18 @@ } document.addEventListener("deviceready", triggerOpenURL, false); + + var launchmyapp = { + getLastIntent: function(success, failure) { + cordova.exec( + success, + failure, + "LaunchMyApp", + "getLastIntent", + []); + } + } + + module.exports = launchmyapp; + }()); diff --git a/StoneIsland/plugins/cordova-plugin-customurlscheme/www/wp8/LaunchMyApp.js b/StoneIsland/plugins/cordova-plugin-customurlscheme/www/wp8/LaunchMyApp.js new file mode 100644 index 00000000..a8172f0f --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-customurlscheme/www/wp8/LaunchMyApp.js @@ -0,0 +1,12 @@ +(function () { + function activatedHandlerWinUI(e) { + if (typeof handleOpenURL == 'function' && e.uri) { + handleOpenURL(e.uri.rawUri); + } + }; + + if (typeof Windows != 'undefined') { + var wui = Windows.UI.WebUI.WebUIApplication; + wui.addEventListener("activated", activatedHandlerWinUI, false); + } +}());
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-device/CONTRIBUTING.md b/StoneIsland/plugins/cordova-plugin-device/CONTRIBUTING.md index f7dbcaba..4c8e6a5e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/CONTRIBUTING.md +++ b/StoneIsland/plugins/cordova-plugin-device/CONTRIBUTING.md @@ -27,7 +27,7 @@ There are multiple ways to contribute: report bugs, improve the docs, and contribute code. For instructions on this, start with the -[contribution overview](http://cordova.apache.org/#contribute). +[contribution overview](http://cordova.apache.org/contribute/). The details are explained there, but the important items are: - Sign and submit an Apache ICLA (Contributor License Agreement). diff --git a/StoneIsland/plugins/cordova-plugin-device/LICENSE b/StoneIsland/plugins/cordova-plugin-device/LICENSE index 7a4a3ea2..7a4a3ea2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/LICENSE +++ b/StoneIsland/plugins/cordova-plugin-device/LICENSE diff --git a/StoneIsland/plugins/cordova-plugin-device/NOTICE b/StoneIsland/plugins/cordova-plugin-device/NOTICE index 8ec56a52..8ec56a52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/NOTICE +++ b/StoneIsland/plugins/cordova-plugin-device/NOTICE diff --git a/StoneIsland/plugins/cordova-plugin-device/README.md b/StoneIsland/plugins/cordova-plugin-device/README.md index d3d7673d..10b80160 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/README.md @@ -1,3 +1,7 @@ +--- +title: Device +description: Get device information. +--- <!-- # license: Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,17 +21,24 @@ # under the License. --> -# cordova-plugin-device +|Android|iOS| Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI | +|:-:|:-:|:-:|:-:|:-:|:-:| +|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=android,PLUGIN=cordova-plugin-device/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=ios,PLUGIN=cordova-plugin-device/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-store,PLUGIN=cordova-plugin-device/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-phone,PLUGIN=cordova-plugin-device/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-10-store,PLUGIN=cordova-plugin-device/)|[](https://travis-ci.org/apache/cordova-plugin-device)| -[](https://travis-ci.org/apache/cordova-plugin-device) +# cordova-plugin-device This plugin defines a global `device` object, which describes the device's hardware and software. Although the object is in the global scope, it is not available until after the `deviceready` event. - document.addEventListener("deviceready", onDeviceReady, false); - function onDeviceReady() { - console.log(device.cordova); - } +```js +document.addEventListener("deviceready", onDeviceReady, false); +function onDeviceReady() { + console.log(device.cordova); +} +``` + +Report issues with this plugin on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Device%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) + ## Installation @@ -40,6 +51,9 @@ Although the object is in the global scope, it is not available until after the - device.platform - device.uuid - device.version +- device.manufacturer +- device.isVirtual +- device.serial ## device.cordova @@ -55,7 +69,8 @@ Get the version of Cordova running on the device. - iOS - Tizen - Windows Phone 7 and 8 -- Windows 8 +- Windows +- OSX ## device.model @@ -71,18 +86,22 @@ different across versions of the same product. - iOS - Tizen - Windows Phone 7 and 8 -- Windows 8 +- Windows +- OSX ### Quick Example - // Android: Nexus One returns "Passion" (Nexus One code name) - // Motorola Droid returns "voles" - // BlackBerry: Torch 9800 returns "9800" - // Browser: Google Chrome returns "Chrome" - // Safari returns "Safari" - // iOS: for the iPad Mini, returns iPad2,5; iPhone 5 is iPhone 5,1. See http://theiphonewiki.com/wiki/index.php?title=Models - // - var model = device.model; +```js +// Android: Nexus One returns "Passion" (Nexus One code name) +// Motorola Droid returns "voles" +// BlackBerry: Torch 9800 returns "9800" +// Browser: Google Chrome returns "Chrome" +// Safari returns "Safari" +// iOS: for the iPad Mini, returns iPad2,5; iPhone 5 is iPhone 5,1. See http://theiphonewiki.com/wiki/index.php?title=Models +// OSX: returns "x86_64" +// +var model = device.model; +``` ### Android Quirks @@ -100,30 +119,34 @@ different across versions of the same product. Get the device's operating system name. - var string = device.platform; - +```js +var string = device.platform; +``` ### Supported Platforms - Android - BlackBerry 10 -- Browser4 +- Browser - Firefox OS - iOS - Tizen - Windows Phone 7 and 8 -- Windows 8 +- Windows +- OSX ### Quick Example - // Depending on the device, a few examples are: - // - "Android" - // - "BlackBerry 10" - // - Browser: returns "MacIntel" on Mac - // returns "Win32" on Windows - // - "iOS" - // - "WinCE" - // - "Tizen" - var devicePlatform = device.platform; +```js +// Depending on the device, a few examples are: +// - "Android" +// - "BlackBerry 10" +// - "browser" +// - "iOS" +// - "WinCE" +// - "Tizen" +// - "Mac OS X" +var devicePlatform = device.platform; +``` ### Windows Phone 7 Quirks @@ -137,7 +160,9 @@ Windows Phone 8 devices report the platform as `Win32NT`. Get the device's Universally Unique Identifier ([UUID](http://en.wikipedia.org/wiki/Universally_Unique_Identifier)). - var string = device.uuid; +```js +var string = device.uuid; +``` ### Description @@ -150,33 +175,36 @@ The details of how a UUID is generated are determined by the device manufacturer - iOS - Tizen - Windows Phone 7 and 8 -- Windows 8 +- Windows +- OSX ### Quick Example - // Android: Returns a random 64-bit integer (as a string, again!) - // The integer is generated on the device's first boot - // - // BlackBerry: Returns the PIN number of the device - // This is a nine-digit unique integer (as a string, though!) - // - // iPhone: (Paraphrased from the UIDevice Class documentation) - // Returns a string of hash values created from multiple hardware identifies. - // It is guaranteed to be unique for every device and can't be tied - // to the user account. - // Windows Phone 7 : Returns a hash of device+current user, - // if the user is not defined, a guid is generated and will persist until the app is uninstalled - // Tizen: returns the device IMEI (International Mobile Equipment Identity or IMEI is a number - // unique to every GSM and UMTS mobile phone. - var deviceID = device.uuid; +```js +// Android: Returns a random 64-bit integer (as a string, again!) +// The integer is generated on the device's first boot +// +// BlackBerry: Returns the PIN number of the device +// This is a nine-digit unique integer (as a string, though!) +// +// iPhone: (Paraphrased from the UIDevice Class documentation) +// Returns the [UIDevice identifierForVendor] UUID which is unique and the same for all apps installed by the same vendor. However the UUID can be different if the user deletes all apps from the vendor and then reinstalls it. +// Windows Phone 7 : Returns a hash of device+current user, +// if the user is not defined, a guid is generated and will persist until the app is uninstalled +// Tizen: returns the device IMEI (International Mobile Equipment Identity or IMEI is a number +// unique to every GSM and UMTS mobile phone. +var deviceID = device.uuid; +``` ### iOS Quirk -The `uuid` on iOS is not unique to a device, but varies for each -application, for each installation. It changes if you delete and -re-install the app, and possibly also when you upgrade iOS, or even -upgrade the app per version (apparent in iOS 5.1). The `uuid` is not -a reliable value. +The `uuid` on iOS uses the identifierForVendor property. It is unique to the device across the same vendor, but will be different for different vendors and will change if all apps from the vendor are deleted and then reinstalled. +Refer [here](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDevice_Class/#//apple_ref/occ/instp/UIDevice/identifierForVendor) for details. +The UUID will be the same if app is restored from a backup or iCloud as it is saved in preferences. Users using older versions of this plugin will still receive the same previous UUID generated by another means as it will be retrieved from preferences. + +### OSX Quirk + +The `uuid` on OSX is generated automatically if it does not exist yet and is stored in the `standardUserDefaults` in the `CDVUUID` property. ### Windows Phone 7 and 8 Quirks @@ -200,21 +228,84 @@ Get the operating system version. - iOS - Tizen - Windows Phone 7 and 8 -- Windows 8 +- Windows +- OSX + +### Quick Example + +```js +// Android: Froyo OS would return "2.2" +// Eclair OS would return "2.1", "2.0.1", or "2.0" +// Version can also return update level "2.1-update1" +// +// BlackBerry: Torch 9800 using OS 6.0 would return "6.0.0.600" +// +// Browser: Returns version number for the browser +// +// iPhone: iOS 3.2 returns "3.2" +// +// Windows Phone 7: returns current OS version number, ex. on Mango returns 7.10.7720 +// Windows 8: return the current OS version, ex on Windows 8.1 returns 6.3.9600.16384 +// Tizen: returns "TIZEN_20120425_2" +// OSX: El Capitan would return "10.11.2" +// +var deviceVersion = device.version; +``` + +## device.manufacturer + +Get the device's manufacturer. + + var string = device.manufacturer; + +### Supported Platforms + +- Android +- BlackBerry 10 +- iOS +- Windows Phone 7 and 8 +- Windows ### Quick Example - // Android: Froyo OS would return "2.2" - // Eclair OS would return "2.1", "2.0.1", or "2.0" - // Version can also return update level "2.1-update1" - // - // BlackBerry: Torch 9800 using OS 6.0 would return "6.0.0.600" - // - // Browser: Returns version number for the browser - // - // iPhone: iOS 3.2 returns "3.2" - // - // Windows Phone 7: returns current OS version number, ex. on Mango returns 7.10.7720 - // Tizen: returns "TIZEN_20120425_2" - var deviceVersion = device.version; +```js +// Android: Motorola XT1032 would return "motorola" +// BlackBerry: returns "BlackBerry" +// iPhone: returns "Apple" +// +var deviceManufacturer = device.manufacturer; +``` + +## device.isVirtual + +whether the device is running on a simulator. + +```js +var isSim = device.isVirtual; +``` + +### Supported Platforms + +- Android 2.1+ +- iOS +- Windows Phone 8 +- Windows +- OSX + +### OSX Quirk + +The `isVirtual` property on OS X always returns false. + +## device.serial + +Get the device hardware serial number ([SERIAL](http://developer.android.com/reference/android/os/Build.html#SERIAL)). + +```js +var string = device.serial; +``` + +### Supported Platforms + +- Android +- OSX diff --git a/StoneIsland/plugins/cordova-plugin-device/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-device/RELEASENOTES.md index f06fc6b5..4167735b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-device/RELEASENOTES.md @@ -20,95 +20,129 @@ --> # Release Notes -### 0.2.1 (Sept 5, 2013) -* removed extraneous print statement -* [CB-4432] copyright notice change - -### 0.2.3 (Sept 25, 2013) -* CB-4889 bumping&resetting version -* [windows8] commandProxy has moved -* [BlackBerry10] removed uneeded permission tags in plugin.xml -* CB-4889 renaming org.apache.cordova.core.device to org.apache.cordova.device -* Rename CHANGELOG.md -> RELEASENOTES.md -* updated to use commandProxy for ffos -* add firefoxos support -* [CB-4752] Incremented plugin version on dev branch. - -### 0.2.4 (Oct 28, 2013) -* CB-5128: added repo + issue tag in plugin.xml for device plugin -* CB-5085 device.cordova returning wrong value -* [CB-4915] Incremented plugin version on dev branch. +### 1.1.3 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* Add badges for paramedic builds on Jenkins +* Add pull request template. +* Readme: Add fenced code blocks with langauage hints +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to `README.md` -### 0.2.5 (Dec 4, 2013) -* CB-5316 Spell Cordova as a brand unless it's a command or script -* [ubuntu] use cordova/exec/proxy -* add ubuntu platform -* Modify Device.platform logic to use amazon-fireos as the platform for Amazon Devices -* 1. Added amazon-fireos platform. 2. Change to use cordova-amazon-fireos as the platform if user agent contains 'cordova-amazon-fireos' +### 1.1.2 (Apr 15, 2016) +* Use passed device, follow create policy forf `CFUUIDCreate` +* [CB-10631](https://issues.apache.org/jira/browse/CB-10631) Fix for `device.uuid` in **iOS 5.1.1** +* Updating the comment to exclude URL +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add `JSHint` for plugins +* Refactored `deviceInfo` on **iOS** for better readability. -### 0.2.6 (Jan 02, 2014) -* CB-5658 Add doc/index.md for Device plugin -* CB-5504 Moving Telephony Logic out of Device +### 1.1.1 (Jan 15, 2016) +* [CB-10238](https://issues.apache.org/jira/browse/CB-10238) **OSX** Move `device-plugin` out from `cordovalib` to the plugin repository +* [CB-9923](https://issues.apache.org/jira/browse/CB-9923) Update `device.platform` documentation for **Browser** platform -### 0.2.7 (Jan 07, 2014) -* CB-5737 Fix exception on close caused by left over telephony code from CB-5504 +### 1.1.0 (Nov 18, 2015) +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest +* Add `isVirtual` for **Windows Phone 8.x** +* Added basic **Android** support for hardware serial number +* [CB-9865](https://issues.apache.org/jira/browse/CB-9865) Better simulator detection for **iOS** +* Fixing contribute link. +* Added **WP8** implementation +* update to use `TARGET_OS_SIMULATOR` as `TARGET_IPHONE_SIMULATOR` is deprecated. +* update code to use 'isVirtual' +* create test to verify existence and type of new property 'isVirtual' +* add `isSimulator` for **iOS** & **Android** device +* Updated documentation to mention backwards compatibility +* Updated **README** to reflect new behaviour and quirks on **iOS** +* Check user defaults first to maintain backwards compatibility +* Changed `UUID` to use `[UIDevice identifierForVendor]` -### 0.2.8 (Feb 05, 2014) -* Tizen support added +### 1.0.1 (Jun 17, 2015) +* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-device documentation translation: cordova-plugin-device +* Attempts to corrent npm markdown issue -### 0.2.9 (Apr 17, 2014) -* CB-5105: [Android, windows8, WP, BlackBerry10] Removed dead code for device.version -* CB-6422: [windows8] use cordova/exec/proxy -* CB-6460: Update license headers -* Add NOTICE file +### 1.0.0 (Apr 15, 2015) +* [CB-8746](https://issues.apache.org/jira/browse/CB-8746) gave plugin major version bump +* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) changed plugin-id to pacakge-name +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) properly updated translated docs to use new id +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) updated translated docs to use new id +* Use TRAVIS_BUILD_DIR, install paramedic by npm +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) Updated Readme +* remove defunct windows8 version +* add travis badge +* Add cross-plugin ios paramedic test running for TravisCI +* [CB-8538](https://issues.apache.org/jira/browse/CB-8538) Added package.json file -### 0.2.10 (Jun 05, 2014) -* CB-6127 Spanish and French Translations added. Github close #12 -* Changing 1.5 to 2.0 -* added firefoxos version - conversion -* added firefoxos version -* CB-6800 Add license -* CB-6491 add CONTRIBUTING.md +### 0.3.0 (Feb 04, 2015) +* Added device.manufacturer property for Android, iOS, Blackberry, WP8 +* Support for Windows Phone 8 ANID2 ANID is only supported up to Windows Phone 7.5 +* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) Use a local copy of uniqueAppInstanceIdentifier rather than CordovaLib's version +* browser: Fixed a bug that caused an "cannot call method of undefined" error if the browser's user agent wasn't recognized -### 0.2.11 (Aug 06, 2014) -* [FFOS] update DeviceProxy.js -* CB-6127 Updated translations for docs -* Use Windows system calls to get better info +### 0.2.13 (Dec 02, 2014) +* Changing `device.platform` to always report the platform as "browser". +* [CB-5892](https://issues.apache.org/jira/browse/CB-5892) - Remove deprecated `window.Settings` +* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-device documentation translation: cordova-plugin-device +* [CB-7571](https://issues.apache.org/jira/browse/CB-7571) Bump version of nested plugin to match parent plugin ### 0.2.12 (Sep 17, 2014) -* CB-7471 cordova-plugin-device documentation translation -* CB-7552 device.name docs have not been removed +* [CB-7471](https://issues.apache.org/jira/browse/CB-7471) cordova-plugin-device documentation translation +* [CB-7552](https://issues.apache.org/jira/browse/CB-7552) device.name docs have not been removed * [fxos] Fix cordova version * added status box and documentation to manual tests * [fxos] Fix cordova version * added status box and documentation to manual tests * Added plugin support for the browser -* CB-7262 Adds support for universal windows apps. +* [CB-7262](https://issues.apache.org/jira/browse/CB-7262) Adds support for universal windows apps. -### 0.2.13 (Dec 02, 2014) -* Changing `device.platform` to always report the platform as "browser". -* CB-5892 - Remove deprecated `window.Settings` -* CB-7700 cordova-plugin-device documentation translation: cordova-plugin-device -* CB-7571 Bump version of nested plugin to match parent plugin +### 0.2.11 (Aug 06, 2014) +* [FFOS] update DeviceProxy.js +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Updated translations for docs +* Use Windows system calls to get better info -### 0.3.0 (Feb 04, 2015) -* Added device.manufacturer property for Android, iOS, Blackberry, WP8 -* Support for Windows Phone 8 ANID2 ANID is only supported up to Windows Phone 7.5 -* CB-8351 Use a local copy of uniqueAppInstanceIdentifier rather than CordovaLib's version -* browser: Fixed a bug that caused an "cannot call method of undefined" error if the browser's user agent wasn't recognized +### 0.2.10 (Jun 05, 2014) +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Spanish and French Translations added. Github close #12 +* Changing 1.5 to 2.0 +* added firefoxos version - conversion +* added firefoxos version +* [CB-6800](https://issues.apache.org/jira/browse/CB-6800) Add license +* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md -### 1.0.0 (Apr 15, 2015) -* CB-8746 gave plugin major version bump -* CB-8683 changed plugin-id to pacakge-name -* CB-8653 properly updated translated docs to use new id -* CB-8653 updated translated docs to use new id -* Use TRAVIS_BUILD_DIR, install paramedic by npm -* CB-8653 Updated Readme -* remove defunct windows8 version -* add travis badge -* Add cross-plugin ios paramedic test running for TravisCI -* CB-8538 Added package.json file +### 0.2.9 (Apr 17, 2014) +* [CB-5105](https://issues.apache.org/jira/browse/CB-5105): [Android, windows8, WP, BlackBerry10] Removed dead code for device.version +* [CB-6422](https://issues.apache.org/jira/browse/CB-6422): [windows8] use cordova/exec/proxy +* [CB-6460](https://issues.apache.org/jira/browse/CB-6460): Update license headers +* Add NOTICE file -### 1.0.1 (Jun 17, 2015) -* CB-9128 cordova-plugin-device documentation translation: cordova-plugin-device -* Attempts to corrent npm markdown issue +### 0.2.8 (Feb 05, 2014) +* Tizen support added + +### 0.2.7 (Jan 07, 2014) +* [CB-5737](https://issues.apache.org/jira/browse/CB-5737) Fix exception on close caused by left over telephony code from [CB-5504](https://issues.apache.org/jira/browse/CB-5504) + +### 0.2.6 (Jan 02, 2014) +* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Add doc/index.md for Device plugin +* [CB-5504](https://issues.apache.org/jira/browse/CB-5504) Moving Telephony Logic out of Device + +### 0.2.5 (Dec 4, 2013) +* [CB-5316](https://issues.apache.org/jira/browse/CB-5316) Spell Cordova as a brand unless it's a command or script +* [ubuntu] use cordova/exec/proxy +* add ubuntu platform +* Modify Device.platform logic to use amazon-fireos as the platform for Amazon Devices +* 1. Added amazon-fireos platform. 2. Change to use cordova-amazon-fireos as the platform if user agent contains 'cordova-amazon-fireos' + +### 0.2.4 (Oct 28, 2013) +* [CB-5128](https://issues.apache.org/jira/browse/CB-5128): added repo + issue tag in plugin.xml for device plugin +* [CB-5085](https://issues.apache.org/jira/browse/CB-5085) device.cordova returning wrong value +* [CB-4915](https://issues.apache.org/jira/browse/CB-4915) Incremented plugin version on dev branch. + +### 0.2.3 (Sept 25, 2013) +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) bumping&resetting version +* [windows8] commandProxy has moved +* [BlackBerry10] removed uneeded permission tags in plugin.xml +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming org.apache.cordova.core.device to org.apache.cordova.device +* Rename CHANGELOG.md -> RELEASENOTES.md +* updated to use commandProxy for ffos +* add firefoxos support +* [CB-4752](https://issues.apache.org/jira/browse/CB-4752) Incremented plugin version on dev branch. + +### 0.2.1 (Sept 5, 2013) +* removed extraneous print statement +* [CB-4432](https://issues.apache.org/jira/browse/CB-4432) copyright notice change diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/de/README.md index 81f89e99..81f89e99 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/de/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/de/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/de/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/de/index.md index e3a537ed..e3a537ed 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/de/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/de/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/es/README.md index a27abfb8..a27abfb8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/es/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/es/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/es/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/es/index.md index f4a58977..f4a58977 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/es/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/es/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/fr/README.md index 4101fd94..4101fd94 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/fr/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/fr/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/fr/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/fr/index.md index 163e498c..163e498c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/fr/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/fr/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/it/README.md index 79749626..79749626 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/it/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/it/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/it/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/it/index.md index 98c6200a..98c6200a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/it/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/it/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/ja/README.md index 5a345f87..5a345f87 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/ja/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/ja/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/ja/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/ja/index.md index b4030fd0..b4030fd0 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/ja/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/ja/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/ko/README.md index a818aacb..a818aacb 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/ko/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/ko/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/ko/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/ko/index.md index 0fe38a7a..0fe38a7a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/ko/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/ko/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/pl/README.md index c38832df..c38832df 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/pl/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/pl/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/pl/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/pl/index.md index acc8f9c8..acc8f9c8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/pl/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/pl/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/ru/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/ru/index.md index 263b1cd9..263b1cd9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/ru/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/ru/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-device/doc/zh/README.md index 9a18a55e..9a18a55e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/zh/README.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/zh/README.md diff --git a/StoneIsland/plugins/cordova-plugin-device/doc/zh/index.md b/StoneIsland/plugins/cordova-plugin-device/doc/zh/index.md index 5626d696..5626d696 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/doc/zh/index.md +++ b/StoneIsland/plugins/cordova-plugin-device/doc/zh/index.md diff --git a/StoneIsland/plugins/cordova-plugin-device/package.json b/StoneIsland/plugins/cordova-plugin-device/package.json index 388b81d5..1357f229 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/package.json +++ b/StoneIsland/plugins/cordova-plugin-device/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-device", - "version": "1.0.1", + "version": "1.1.3", "description": "Cordova Device Plugin", "cordova": { "id": "cordova-plugin-device", @@ -16,7 +16,8 @@ "wp8", "windows8", "windows", - "browser" + "browser", + "osx" ] }, "repository": { @@ -38,8 +39,23 @@ "cordova-wp8", "cordova-windows8", "cordova-windows", - "cordova-browser" + "cordova-browser", + "cordova-osx" ], + "scripts": { + "test": "npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests" + }, "author": "Apache Software Foundation", - "license": "Apache 2.0" + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova": ">100" + } + } + }, + "devDependencies": { + "jshint": "^2.6.0" + } } diff --git a/StoneIsland/plugins/cordova-plugin-device/plugin.xml b/StoneIsland/plugins/cordova-plugin-device/plugin.xml index 172cff23..7d041252 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-device/plugin.xml @@ -22,7 +22,7 @@ xmlns:rim="http://www.blackberry.com/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-device" - version="1.0.1"> + version="1.1.3"> <name>Device</name> <description>Cordova Device Plugin</description> <license>Apache 2.0</license> @@ -158,4 +158,17 @@ </js-module> </platform> + <!-- osx --> + <platform name="osx"> + <config-file target="config.xml" parent="/*"> + <feature name="Device"> + <param name="ios-package" value="CDVDevice"/> + </feature> + </config-file> + + <header-file src="src/osx/CDVDevice.h" /> + <source-file src="src/osx/CDVDevice.m" /> + </platform> + + </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-device/src/android/Device.java b/StoneIsland/plugins/cordova-plugin-device/src/android/Device.java index 5eded907..e9efcb49 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/android/Device.java +++ b/StoneIsland/plugins/cordova-plugin-device/src/android/Device.java @@ -67,13 +67,15 @@ public class Device extends CordovaPlugin { * @return True if the action was valid, false if not. */ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { - if (action.equals("getDeviceInfo")) { + if ("getDeviceInfo".equals(action)) { JSONObject r = new JSONObject(); r.put("uuid", Device.uuid); r.put("version", this.getOSVersion()); r.put("platform", this.getPlatform()); r.put("model", this.getModel()); r.put("manufacturer", this.getManufacturer()); + r.put("isVirtual", this.isVirtual()); + r.put("serial", this.getSerialNumber()); callbackContext.success(r); } else { @@ -88,7 +90,7 @@ public class Device extends CordovaPlugin { /** * Get the OS name. - * + * * @return */ public String getPlatform() { @@ -125,6 +127,12 @@ public class Device extends CordovaPlugin { String manufacturer = android.os.Build.MANUFACTURER; return manufacturer; } + + public String getSerialNumber() { + String serial = android.os.Build.SERIAL; + return serial; + } + /** * Get the OS version. * @@ -148,7 +156,7 @@ public class Device extends CordovaPlugin { /** * Function to check if the device is manufactured by Amazon - * + * * @return */ public boolean isAmazonDevice() { @@ -158,4 +166,9 @@ public class Device extends CordovaPlugin { return false; } + public boolean isVirtual() { + return android.os.Build.FINGERPRINT.contains("generic") || + android.os.Build.PRODUCT.contains("sdk"); + } + } diff --git a/StoneIsland/plugins/cordova-plugin-device/src/blackberry10/index.js b/StoneIsland/plugins/cordova-plugin-device/src/blackberry10/index.js index 77f25a9e..ef0543bc 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/blackberry10/index.js +++ b/StoneIsland/plugins/cordova-plugin-device/src/blackberry10/index.js @@ -19,6 +19,8 @@ * */ +/* global PluginResult */ + function getModelName () { var modelName = window.qnx.webplatform.device.modelName; //Pre 10.2 (meaning Z10 or Q10) diff --git a/StoneIsland/plugins/cordova-plugin-device/src/browser/DeviceProxy.js b/StoneIsland/plugins/cordova-plugin-device/src/browser/DeviceProxy.js index fcaed20c..a8632016 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/browser/DeviceProxy.js +++ b/StoneIsland/plugins/cordova-plugin-device/src/browser/DeviceProxy.js @@ -19,7 +19,6 @@ * */ var browser = require('cordova/platform'); -var cordova = require('cordova'); function getPlatform() { return "browser"; @@ -36,6 +35,7 @@ function getVersion() { function getBrowserInfo(getModel) { var userAgent = navigator.userAgent; var returnVal = ''; + var offset; if ((offset = userAgent.indexOf('Chrome')) !== -1) { returnVal = (getModel) ? 'Chrome' : userAgent.substring(offset + 7); diff --git a/StoneIsland/plugins/cordova-plugin-device/src/firefoxos/DeviceProxy.js b/StoneIsland/plugins/cordova-plugin-device/src/firefoxos/DeviceProxy.js index 79f3a2b0..a05d7ca0 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/firefoxos/DeviceProxy.js +++ b/StoneIsland/plugins/cordova-plugin-device/src/firefoxos/DeviceProxy.js @@ -20,8 +20,6 @@ */ //example UA String for Firefox OS //Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0 -var firefoxos = require('cordova/platform'); -var cordova = require('cordova'); //UA parsing not recommended but currently this is the only way to get the Firefox OS version //https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference diff --git a/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.h b/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.h index a146d882..a146d882 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.h +++ b/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.h diff --git a/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.m b/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.m index 5a3f4708..4d75a574 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.m +++ b/StoneIsland/plugins/cordova-plugin-device/src/ios/CDVDevice.m @@ -19,6 +19,7 @@ #include <sys/types.h> #include <sys/sysctl.h> +#include "TargetConditionals.h" #import <Cordova/CDV.h> #import "CDVDevice.h" @@ -49,21 +50,23 @@ { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; static NSString* UUID_KEY = @"CDVUUID"; - + + // Check user defaults first to maintain backwards compaitibility with previous versions + // which didn't user identifierForVendor NSString* app_uuid = [userDefaults stringForKey:UUID_KEY]; - if (app_uuid == nil) { - CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault); - CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef); + if ([device respondsToSelector:@selector(identifierForVendor)]) { + app_uuid = [[device identifierForVendor] UUIDString]; + } else { + CFUUIDRef uuid = CFUUIDCreate(NULL); + app_uuid = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid); + CFRelease(uuid); + } - app_uuid = [NSString stringWithString:(__bridge NSString*)uuidString]; [userDefaults setObject:app_uuid forKey:UUID_KEY]; [userDefaults synchronize]; - - CFRelease(uuidString); - CFRelease(uuidRef); } - + return app_uuid; } @@ -78,17 +81,16 @@ - (NSDictionary*)deviceProperties { UIDevice* device = [UIDevice currentDevice]; - NSMutableDictionary* devProps = [NSMutableDictionary dictionaryWithCapacity:4]; - [devProps setObject:@"Apple" forKey:@"manufacturer"]; - [devProps setObject:[device modelVersion] forKey:@"model"]; - [devProps setObject:@"iOS" forKey:@"platform"]; - [devProps setObject:[device systemVersion] forKey:@"version"]; - [devProps setObject:[self uniqueAppInstanceIdentifier:device] forKey:@"uuid"]; - [devProps setObject:[[self class] cordovaVersion] forKey:@"cordova"]; - - NSDictionary* devReturn = [NSDictionary dictionaryWithDictionary:devProps]; - return devReturn; + return @{ + @"manufacturer": @"Apple", + @"model": [device modelVersion], + @"platform": @"iOS", + @"version": [device systemVersion], + @"uuid": [self uniqueAppInstanceIdentifier:device], + @"cordova": [[self class] cordovaVersion], + @"isVirtual": @([self isVirtual]) + }; } + (NSString*)cordovaVersion @@ -96,4 +98,15 @@ return CDV_VERSION; } +- (BOOL)isVirtual +{ + #if TARGET_OS_SIMULATOR + return true; + #elif TARGET_IPHONE_SIMULATOR + return true; + #else + return false; + #endif +} + @end diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/src/ios/CDVNavigationWhitelistPlugin.h b/StoneIsland/plugins/cordova-plugin-device/src/osx/CDVDevice.h index d0b93654..9def2548 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/src/ios/CDVNavigationWhitelistPlugin.h +++ b/StoneIsland/plugins/cordova-plugin-device/src/osx/CDVDevice.h @@ -17,15 +17,12 @@ under the License. */ -#import <UIKit/UIKit.h> #import <Cordova/CDVPlugin.h> -#import <Cordova/CDVWhitelist.h> -@interface CDVNavigationWhitelistPlugin : CDVPlugin {} +@interface CDVDevice : CDVPlugin -@property (nonatomic, readonly, strong) CDVWhitelist* whitelist; // readonly for public ++ (NSString*) cordovaVersion; -- (BOOL)shouldAllowNavigationToURL:(NSURL *)url; -- (BOOL)shouldAllowRequestForURL:(NSURL *)url; +- (void) getDeviceInfo:(CDVInvokedUrlCommand*)command; @end diff --git a/StoneIsland/plugins/cordova-plugin-device/src/osx/CDVDevice.m b/StoneIsland/plugins/cordova-plugin-device/src/osx/CDVDevice.m new file mode 100644 index 00000000..3a63588f --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-device/src/osx/CDVDevice.m @@ -0,0 +1,113 @@ +/* + 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. + */ + +#include <sys/sysctl.h> + +#import "CDVDevice.h" + +#define SYSTEM_VERSION_PLIST @"/System/Library/CoreServices/SystemVersion.plist" + +@implementation CDVDevice + +- (NSString*) modelVersion { + size_t size; + + sysctlbyname("hw.machine", NULL, &size, NULL, 0); + char* machine = malloc(size); + sysctlbyname("hw.machine", machine, &size, NULL, 0); + NSString* modelVersion = [NSString stringWithUTF8String:machine]; + free(machine); + + return modelVersion; +} + + +- (NSString*) getSerialNr { + NSString* serialNr; + io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")); + if (platformExpert) { + CFTypeRef serialNumberAsCFString = + IORegistryEntryCreateCFProperty(platformExpert, + CFSTR(kIOPlatformSerialNumberKey), + kCFAllocatorDefault, 0); + if (serialNumberAsCFString) { + serialNr = (__bridge NSString*) serialNumberAsCFString; + } + IOObjectRelease(platformExpert); + } + return serialNr; +} + +- (NSString*) uniqueAppInstanceIdentifier { + NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; + static NSString* UUID_KEY = @"CDVUUID"; + + NSString* app_uuid = [userDefaults stringForKey:UUID_KEY]; + + if (app_uuid == nil) { + CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault); + CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef); + + app_uuid = [NSString stringWithString:(__bridge NSString*) uuidString]; + [userDefaults setObject:app_uuid forKey:UUID_KEY]; + [userDefaults synchronize]; + + CFRelease(uuidString); + CFRelease(uuidRef); + } + + return app_uuid; +} + +- (NSString*) platform { + return [NSDictionary dictionaryWithContentsOfFile:SYSTEM_VERSION_PLIST][@"ProductName"]; +} + +- (NSString*) systemVersion { + return [NSDictionary dictionaryWithContentsOfFile:SYSTEM_VERSION_PLIST][@"ProductVersion"]; +} + +- (void) getDeviceInfo:(CDVInvokedUrlCommand*) command { + NSDictionary* deviceProperties = [self deviceProperties]; + CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:deviceProperties]; + + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; +} + +- (NSDictionary*) deviceProperties { + NSMutableDictionary* devProps = [NSMutableDictionary dictionaryWithCapacity:4]; + + devProps[@"manufacturer"] = @"Apple"; + devProps[@"model"] = [self modelVersion]; + devProps[@"platform"] = [self platform]; + devProps[@"version"] = [self systemVersion]; + devProps[@"uuid"] = [self uniqueAppInstanceIdentifier]; + devProps[@"cordova"] = [[self class] cordovaVersion]; + devProps[@"serial"] = [self getSerialNr]; + devProps[@"isVirtual"] = @NO; + + NSDictionary* devReturn = [NSDictionary dictionaryWithDictionary:devProps]; + return devReturn; +} + ++ (NSString*) cordovaVersion { + return CDV_VERSION; +} + +@end diff --git a/StoneIsland/plugins/cordova-plugin-device/src/tizen/DeviceProxy.js b/StoneIsland/plugins/cordova-plugin-device/src/tizen/DeviceProxy.js index 2afc3243..973b7162 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/tizen/DeviceProxy.js +++ b/StoneIsland/plugins/cordova-plugin-device/src/tizen/DeviceProxy.js @@ -20,7 +20,6 @@ */ var tizen = require('cordova/platform'); -var cordova = require('cordova'); module.exports = { getDeviceInfo: function(success, error) { diff --git a/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.cpp b/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.cpp index eb5a012d..eb5a012d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.cpp +++ b/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.cpp diff --git a/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.h b/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.h index 91cb9377..91cb9377 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.h +++ b/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.h diff --git a/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.js b/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.js index 3adb110b..838586c3 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.js +++ b/StoneIsland/plugins/cordova-plugin-device/src/ubuntu/device.js @@ -19,8 +19,7 @@ * */ -var cordova = require('cordova'); -var exec = require('cordova/exec'); +/* global Cordova */ module.exports = { getInfo:function(win,fail,args) { diff --git a/StoneIsland/plugins/cordova-plugin-device/src/windows/DeviceProxy.js b/StoneIsland/plugins/cordova-plugin-device/src/windows/DeviceProxy.js index 69ed4446..f338ad3a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/windows/DeviceProxy.js +++ b/StoneIsland/plugins/cordova-plugin-device/src/windows/DeviceProxy.js @@ -19,13 +19,14 @@ * */ +/* global Windows, createUUID */ + var ROOT_CONTAINER = "{00000000-0000-0000-FFFF-FFFFFFFFFFFF}"; var DEVICE_CLASS_KEY = "{A45C254E-DF1C-4EFD-8020-67D146A850E0},10"; -var DEVICE_CLASS_KEY_NO_SEMICOLON = '{A45C254E-DF1C-4EFD-8020-67D146A850E0}10'; +var DEVICE_CLASS_KEY_NO_SEMICOLON = "{A45C254E-DF1C-4EFD-8020-67D146A850E0}10"; var ROOT_CONTAINER_QUERY = "System.Devices.ContainerId:=\"" + ROOT_CONTAINER + "\""; var HAL_DEVICE_CLASS = "4d36e966-e325-11ce-bfc1-08002be10318"; var DEVICE_DRIVER_VERSION_KEY = "{A8B865DD-2E3D-4094-AD97-E593A70C75D6},3"; -var MANU_KEY = "System.Devices.Manufacturer"; module.exports = { @@ -33,8 +34,6 @@ module.exports = { // deviceId aka uuid, stored in Windows.Storage.ApplicationData.current.localSettings.values.deviceId var deviceId; - var manufacturer = "unknown"; - // get deviceId, or create and store one var localSettings = Windows.Storage.ApplicationData.current.localSettings; if (localSettings.values.deviceId) { @@ -55,51 +54,42 @@ module.exports = { var userAgent = window.clientInformation.userAgent; - // this will report "windows" in windows8.1 and windows phone 8.1 apps - // and "windows8" in windows 8.0 apps similar to cordova.js - // See https://github.com/apache/cordova-js/blob/master/src/windows/platform.js#L25 + // this will report "windows" in windows8.1 and windows phone 8.1 apps + // and "windows8" in windows 8.0 apps similar to cordova.js + // See https://github.com/apache/cordova-js/blob/master/src/windows/platform.js#L25 var devicePlatform = userAgent.indexOf("MSAppHost/1.0") == -1 ? "windows" : "windows8"; var versionString = userAgent.match(/Windows (?:Phone |NT )?([0-9.]+)/)[1]; - + var deviceInfo = new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation(); + // Running in the Windows Simulator is a remote session. + // Running in the Windows Phone Emulator has the systemProductName set to "Virtual" + var isVirtual = Windows.System.RemoteDesktop.InteractiveSession.isRemote || deviceInfo.systemProductName == "Virtual"; + var manufacturer = deviceInfo.systemManufacturer; + var model = deviceInfo.systemProductName; var Pnp = Windows.Devices.Enumeration.Pnp; - Pnp.PnpObject.findAllAsync(Pnp.PnpObjectType.deviceContainer,[MANU_KEY]) - .then(function (infoList) { - var numDevices = infoList.length; - if (numDevices) { - for (var i = 0; i < numDevices; i++) { - var devContainer = infoList[i]; - if (devContainer.id == ROOT_CONTAINER) { - manufacturer = devContainer.properties[MANU_KEY]; + Pnp.PnpObject.findAllAsync(Pnp.PnpObjectType.device, + [DEVICE_DRIVER_VERSION_KEY, DEVICE_CLASS_KEY], + ROOT_CONTAINER_QUERY) + .then(function (rootDevices) { + for (var i = 0; i < rootDevices.length; i++) { + var rootDevice = rootDevices[i]; + if (!rootDevice.properties) continue; + if (rootDevice.properties[DEVICE_CLASS_KEY_NO_SEMICOLON] == HAL_DEVICE_CLASS) { + versionString = rootDevice.properties[DEVICE_DRIVER_VERSION_KEY]; break; } } - } - }) - .then(function () { - Pnp.PnpObject.findAllAsync(Pnp.PnpObjectType.device, - [DEVICE_DRIVER_VERSION_KEY, DEVICE_CLASS_KEY], - ROOT_CONTAINER_QUERY) - .then(function (rootDevices) { - for (var i = 0; i < rootDevices.length; i++) { - var rootDevice = rootDevices[i]; - if (!rootDevice.properties) continue; - if (rootDevice.properties[DEVICE_CLASS_KEY_NO_SEMICOLON] == HAL_DEVICE_CLASS) { - versionString = rootDevice.properties[DEVICE_DRIVER_VERSION_KEY]; - break; - } - } - setTimeout(function () { - win({ platform: devicePlatform, - version: versionString, - uuid: deviceId, - model: window.clientInformation.platform, - manufacturer:manufacturer}); - }, 0); - }); + setTimeout(function () { + win({ platform: devicePlatform, + version: versionString, + uuid: deviceId, + isVirtual: isVirtual, + model: model, + manufacturer:manufacturer}); + }, 0); }); } diff --git a/StoneIsland/plugins/cordova-plugin-device/src/wp/Device.cs b/StoneIsland/plugins/cordova-plugin-device/src/wp/Device.cs index 897a35af..76fe8cf2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/src/wp/Device.cs +++ b/StoneIsland/plugins/cordova-plugin-device/src/wp/Device.cs @@ -1,32 +1,21 @@ /* - Licensed 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. + Licensed 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. */ -using System; -using System.Net; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Documents; -using System.Windows.Ink; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Animation; -using System.Windows.Shapes; using Microsoft.Phone.Info; -using System.IO.IsolatedStorage; -using System.Windows.Resources; +using System; using System.IO; -using System.Diagnostics; +using System.IO.IsolatedStorage; namespace WPCordovaClassLib.Cordova.Commands { @@ -34,55 +23,27 @@ namespace WPCordovaClassLib.Cordova.Commands { public void getDeviceInfo(string notused) { - - string res = String.Format("\"name\":\"{0}\",\"platform\":\"{1}\",\"uuid\":\"{2}\",\"version\":\"{3}\",\"model\":\"{4}\",\"manufacturer\":\"{5}\"", - this.name, - this.platform, - this.uuid, - this.version, - this.model, - this.manufacturer); - - res = "{" + res + "}"; - //Debug.WriteLine("Result::" + res); - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, res)); + string res = String.Format("\"name\":\"{0}\",\"platform\":\"{1}\",\"uuid\":\"{2}\",\"version\":\"{3}\",\"model\":\"{4}\",\"manufacturer\":\"{5}\",\"isVirtual\":{6}", + DeviceStatus.DeviceName, + Environment.OSVersion.Platform.ToString(), + UUID, + Environment.OSVersion.Version.ToString(), + DeviceStatus.DeviceName, + DeviceStatus.DeviceManufacturer, + IsVirtual ? "true" : "false"); + DispatchCommandResult(new PluginResult(PluginResult.Status.OK, "{" + res + "}")); } - public string model - { - get - { - return DeviceStatus.DeviceName; - //return String.Format("{0},{1},{2}", DeviceStatus.DeviceManufacturer, DeviceStatus.DeviceHardwareVersion, DeviceStatus.DeviceFirmwareVersion); - } - } - public string manufacturer + public bool IsVirtual { - get + get { - return DeviceStatus.DeviceManufacturer; + return (Microsoft.Devices.Environment.DeviceType == Microsoft.Devices.DeviceType.Emulator); } } - public string name - { - get - { - return DeviceStatus.DeviceName; - - } - } - - public string platform - { - get - { - return Environment.OSVersion.Platform.ToString(); - } - } - - public string uuid + public string UUID { get { @@ -122,14 +83,5 @@ namespace WPCordovaClassLib.Cordova.Commands return returnVal; } } - - public string version - { - get - { - return Environment.OSVersion.Version.ToString(); - } - } - } } diff --git a/StoneIsland/plugins/cordova-plugin-device/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-device/tests/plugin.xml index bcca190e..ad4433c9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-device/tests/plugin.xml @@ -22,7 +22,7 @@ xmlns:rim="http://www.blackberry.com/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-device-tests" - version="1.0.1"> + version="1.1.3"> <name>Cordova Device Plugin Tests</name> <license>Apache 2.0</license> diff --git a/StoneIsland/plugins/cordova-plugin-device/tests/tests.js b/StoneIsland/plugins/cordova-plugin-device/tests/tests.js index 1f49d7e1..ac9a2810 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/tests/tests.js +++ b/StoneIsland/plugins/cordova-plugin-device/tests/tests.js @@ -19,6 +19,8 @@ * */ +/* jshint jasmine: true */ + exports.defineAutoTests = function() { describe('Device Information (window.device)', function () { it("should exist", function() { @@ -27,18 +29,18 @@ exports.defineAutoTests = function() { it("should contain a platform specification that is a string", function() { expect(window.device.platform).toBeDefined(); - expect((new String(window.device.platform)).length > 0).toBe(true); + expect((String(window.device.platform)).length > 0).toBe(true); }); it("should contain a version specification that is a string", function() { expect(window.device.version).toBeDefined(); - expect((new String(window.device.version)).length > 0).toBe(true); + expect((String(window.device.version)).length > 0).toBe(true); }); it("should contain a UUID specification that is a string or a number", function() { expect(window.device.uuid).toBeDefined(); if (typeof window.device.uuid == 'string' || typeof window.device.uuid == 'object') { - expect((new String(window.device.uuid)).length > 0).toBe(true); + expect((String(window.device.uuid)).length > 0).toBe(true); } else { expect(window.device.uuid > 0).toBe(true); } @@ -46,12 +48,12 @@ exports.defineAutoTests = function() { it("should contain a cordova specification that is a string", function() { expect(window.device.cordova).toBeDefined(); - expect((new String(window.device.cordova)).length > 0).toBe(true); + expect((String(window.device.cordova)).length > 0).toBe(true); }); it("should depend on the presence of cordova.version string", function() { expect(window.cordova.version).toBeDefined(); - expect((new String(window.cordova.version)).length > 0).toBe(true); + expect((String(window.cordova.version)).length > 0).toBe(true); }); it("should contain device.cordova equal to cordova.version", function() { @@ -60,18 +62,30 @@ exports.defineAutoTests = function() { it("should contain a model specification that is a string", function() { expect(window.device.model).toBeDefined(); - expect((new String(window.device.model)).length > 0).toBe(true); + expect((String(window.device.model)).length > 0).toBe(true); }); it("should contain a manufacturer property that is a string", function() { expect(window.device.manufacturer).toBeDefined(); - expect((new String(window.device.manufacturer)).length > 0).toBe(true); + expect((String(window.device.manufacturer)).length > 0).toBe(true); + }); + + it("should contain an isVirtual property that is a boolean", function() { + expect(window.device.isVirtual).toBeDefined(); + expect(typeof window.device.isVirtual).toBe("boolean"); }); + + it("should contain a serial number specification that is a string", function() { + expect(window.device.serial).toBeDefined(); + expect((String(window.device.serial)).length > 0).toBe(true); + + }); + }); }; exports.defineManualTests = function(contentEl, createActionButton) { - var logMessage = function (message, color) { + var logMessage = function (message, color) { var log = document.getElementById('info'); var logLine = document.createElement('div'); if (color) { @@ -79,12 +93,12 @@ exports.defineManualTests = function(contentEl, createActionButton) { } logLine.innerHTML = message; log.appendChild(logLine); - } + }; var clearLog = function () { var log = document.getElementById('info'); log.innerHTML = ''; - } + }; var device_tests = '<h3>Press Dump Device button to get device information</h3>' + '<div id="dump_device"></div>' + diff --git a/StoneIsland/plugins/cordova-plugin-device/www/device.js b/StoneIsland/plugins/cordova-plugin-device/www/device.js index b1d0d25d..f7ed19f9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-device/www/device.js +++ b/StoneIsland/plugins/cordova-plugin-device/www/device.js @@ -42,6 +42,8 @@ function Device() { this.cordova = null; this.model = null; this.manufacturer = null; + this.isVirtual = null; + this.serial = null; var me = this; @@ -56,7 +58,9 @@ function Device() { me.uuid = info.uuid; me.cordova = buildLabel; me.model = info.model; + me.isVirtual = info.isVirtual; me.manufacturer = info.manufacturer || 'unknown'; + me.serial = info.serial || 'unknown'; channel.onCordovaInfoReady.fire(); },function(e) { me.available = false; diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/CONTRIBUTING.md b/StoneIsland/plugins/cordova-plugin-dialogs/CONTRIBUTING.md index f7dbcaba..4c8e6a5e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/CONTRIBUTING.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/CONTRIBUTING.md @@ -27,7 +27,7 @@ There are multiple ways to contribute: report bugs, improve the docs, and contribute code. For instructions on this, start with the -[contribution overview](http://cordova.apache.org/#contribute). +[contribution overview](http://cordova.apache.org/contribute/). The details are explained there, but the important items are: - Sign and submit an Apache ICLA (Contributor License Agreement). diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/LICENSE b/StoneIsland/plugins/cordova-plugin-dialogs/LICENSE index 7a4a3ea2..7a4a3ea2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/LICENSE +++ b/StoneIsland/plugins/cordova-plugin-dialogs/LICENSE diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/NOTICE b/StoneIsland/plugins/cordova-plugin-dialogs/NOTICE index 8ec56a52..8ec56a52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/NOTICE +++ b/StoneIsland/plugins/cordova-plugin-dialogs/NOTICE diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/README.md index b16b9f9a..ea2b9311 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/README.md @@ -1,3 +1,7 @@ +--- +title: Dialogs +description: Use native dialog UI elements +--- <!-- # license: Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,9 +21,11 @@ # under the License. --> -# cordova-plugin-dialogs +|Android|iOS| Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI | +|:-:|:-:|:-:|:-:|:-:|:-:| +|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=android,PLUGIN=cordova-plugin-dialogs/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=ios,PLUGIN=cordova-plugin-dialogs/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-store,PLUGIN=cordova-plugin-dialogs/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-phone,PLUGIN=cordova-plugin-dialogs/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-10-store,PLUGIN=cordova-plugin-dialogs/)|[](https://travis-ci.org/apache/cordova-plugin-dialogs)| -[](https://travis-ci.org/apache/cordova-plugin-dialogs) +# cordova-plugin-dialogs This plugin provides access to some native dialog UI elements via a global `navigator.notification` object. @@ -31,6 +37,8 @@ Although the object is attached to the global scoped `navigator`, it is not avai console.log(navigator.notification); } +Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Dialogs%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) + ## Installation cordova plugin add cordova-plugin-dialogs @@ -77,6 +85,7 @@ function, which is typically less customizable. - Amazon Fire OS - Android - BlackBerry 10 +- Browser - Firefox OS - iOS - Tizen @@ -141,6 +150,7 @@ indexing, so the value is `1`, `2`, `3`, etc. - Amazon Fire OS - Android - BlackBerry 10 +- Browser - Firefox OS - iOS - Tizen @@ -212,6 +222,7 @@ contains the following properties: - Amazon Fire OS - Android +- Browser - Firefox OS - iOS - Windows Phone 7 and 8 @@ -250,6 +261,7 @@ The device plays a beep sound. - Amazon Fire OS - Android - BlackBerry 10 +- Browser - iOS - Tizen - Windows Phone 7 and 8 @@ -272,4 +284,3 @@ The device plays a beep sound. - Tizen implements beeps by playing an audio file via the media API. - The beep file must be short, must be located in a `sounds` subdirectory of the application's root directory, and must be named `beep.wav`. - diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-dialogs/RELEASENOTES.md index 79571543..2b34048b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/RELEASENOTES.md @@ -20,120 +20,147 @@ --> # Release Notes -### 0.2.2 (Sept 25, 2013) -* CB-4889 bumping&resetting version -* [windows8] commandProxy was moved -* CB-4889 renaming reference in Notification.cs -* CB-4889 renaming org.apache.cordova.core.dialogs to org.apache.cordova.dialogs -* Rename CHANGELOG.md -> RELEASENOTES.md -* [CB-4592] [Blackberry10] Added beep support -* [CB-4752] Incremented plugin version on dev branch. +### 1.3.0 (Sep 08, 2016) +* [CB-11832](https://issues.apache.org/jira/browse/CB-11832) updated missing header file +* Select the text and put default value in the input directly. +* [CB-11281](https://issues.apache.org/jira/browse/CB-11281) **windows**: `defaultText` is not taken as input if no input by user fixed +* Separated `CSS` from `JS` code. Fixed the prompt dialog CSS to look close to native. Fixed the positioning of the prompt dialog for Windows. Fixed minor JSHint issues. +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* [CB-8773](https://issues.apache.org/jira/browse/CB-8773) Fix for **iOS 8** keyboard not appearing on prompt +* [CB-11677](https://issues.apache.org/jira/browse/CB-11677) **Android**: made text, entered to prompt dialog visible +* CB-8947:(**ios**) Fix crash. Convert non-string messages to strings. Added tests. +* Add badges for paramedic builds on Jenkins +* Add pull request template. +* [CB-11218](https://issues.apache.org/jira/browse/CB-11218) Convert button list to appropriate type +* Simply add **Browser** to supported platforms +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md - ### 0.2.3 (Oct 28, 2013) -* CB-5128: added repo + issue tag to plugin.xml for dialogs plugin -* new plugin execute arguments supported -* new plugin style -* smaller fonts styling input -* img files copied inside plugin -* style added -* prompt added -* styling from James -* fixed "exec" calls addedd css, but not working yet -* first (blind) try -* [CB-4915] Incremented plugin version on dev branch. +### 1.2.1 (Apr 15, 2016) +* [CB-10097](https://issues.apache.org/jira/browse/CB-10097) dialog doesn't show on **iOS** when called from a select list `onChange` event +* Remove `warning` emoji, as it doesn't correctly display in the docs website: http://cordova.apache.org/docs/en/dev/cordova-plugin-dialogs/index.html +* [CB-10727](https://issues.apache.org/jira/browse/CB-10727) Dialogs plugin has warnings on **iOS** +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add `JSHint` for plugins - -### 0.2.4 (Dec 4, 2013) -* add ubuntu platform -* 1. Added amazon-fireos platform. 2. Change to use amazon-fireos as a platform if user agent string contains 'cordova-amazon-fireos'. -* added beep funtionality using ms-winsoundevent:Notfication.Default +### 1.2.0 (Nov 18, 2015) +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest +* [CB-8549](https://issues.apache.org/jira/browse/CB-8549) Updated source to pass `Fortify` scan. +* Fixing contribute link. +* add `CSS class` to prompt `div` for **Windows** platform +* [CB-9347](https://issues.apache.org/jira/browse/CB-9347) - fix to allow to stack multiple `UIAlertControllers` -### 0.2.5 (Jan 02, 2014) -* CB-4696 Fix compile error for Xcode 4.5. -* CB-5658 Add doc/index.md for Dialogs plugin -* CB-3762 Change prompt default to empty string -* Move images from css to img +### 1.1.1 (Jun 17, 2015) +* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-dialogs documentation translation: cordova-plugin-dialogs +* fix npm md -### 0.2.6 (Feb 05, 2014) -* no need to recreate the manifest.webapp file after each `cordova prepare` for FFOS -* FFOS description added +### 1.1.0 (May 06, 2015) +* [CB-8928](https://issues.apache.org/jira/browse/CB-8928): Removed direct call to `toStaticHTML`, only call it if we are sure it's present. This closes #52 +* [CB-7734](https://issues.apache.org/jira/browse/CB-7734) - `navigator.notification.alert` or `navigator.notification.confirm` seem have a "many words" issue. (closes #39) + +### 1.0.0 (Apr 15, 2015) +* [CB-8746](https://issues.apache.org/jira/browse/CB-8746) gave plugin major version bump +* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) updated wp and bb specific references of old id to new id +* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) changed plugin-id to pacakge-name +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) properly updated translated docs to use new id +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) updated translated docs to use new id +* Use TRAVIS_BUILD_DIR, install paramedic by npm +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) Updated Readme +* [CB-8659](https://issues.apache.org/jira/browse/CB-8659): ios: 4.0.x Compatibility: Remove use of deprecated headers +* [CB-8565](https://issues.apache.org/jira/browse/CB-8565) Integrate TravisCI +* [CB-8438](https://issues.apache.org/jira/browse/CB-8438) cordova-plugin-dialogs documentation translation: cordova-plugin-dialogs +* [CB-8538](https://issues.apache.org/jira/browse/CB-8538) Added package.json file +* [CB-8367](https://issues.apache.org/jira/browse/CB-8367) [org.apache.cordova.dialogs] Add Prompt support on Windows -### 0.2.7 (Apr 17, 2014) -* CB-6212: [iOS] fix warnings compiled under arm64 64-bit -* CB-6411: [BlackBerry10] Work around Audio playback issue -* CB-6411: [BlackBerry10] Updates to beep -* CB-6422: [windows8] use cordova/exec/proxy -* CB-6460: Update license headers -* Add NOTICE file +### 0.3.0 (Feb 04, 2015) +* Correct way to specify Windows platform in config.xml +* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) ios: Use argumentForIndex rather than NSArray extension +* [CB-7955](https://issues.apache.org/jira/browse/CB-7955) Add support "browser" platform -### 0.2.8 (Jun 05, 2014) -* CB-6801 Add license -* running original windows.open, inAppBrowser is overriding it no need to place CSS in every page anymore -* CB-5945 [Windows8] do not call success callbacks until dialog is dismissed -* CB-4616 Returned index 0 was not documented for notification.prompt -* update docs to state that prompt is supported on windowsphone -* CB-6528 allow scroll on alert message content -* [CB-6628][amazon-fireos]dialogs plugin's confirm and prompt methods dont work confirm() method was missing amazon-fireos platform check. added that. prompt() method had bug. It is executed in a worker thread that does not have a message queue(or Looper object) associated with it and hence "can't create a handler" exception is thrown. To fix this issue, we need to create the EditText widget from within the UI thread. This was fixed sometime ago when we added fireos platform but commit got lost somewhere. So fixing it again now. -* CB-6491 add CONTRIBUTING.md -* Added check for isFinishing() on the parent activity to prevent crashes when trying to display dialogs when activity is in this phase of it's lifecycle -* CB-4966 Dialogs are in window now No need to add anything to manifest or index.html -* Removing FirefoxOS Quirks * no need to add special permission (it's different API with the same name) * notification.css is added automatically +### 0.2.11 (Dec 02, 2014) +* [CB-7737](https://issues.apache.org/jira/browse/CB-7737) lower min height for alert +* [CB-8038](https://issues.apache.org/jira/browse/CB-8038) backslash getting escaped twice in **BB10** +* [CB-8029](https://issues.apache.org/jira/browse/CB-8029) test 1-based indexing for confirm +* [CB-7639](https://issues.apache.org/jira/browse/CB-7639) Update docs + manual tests +* [CB-7639](https://issues.apache.org/jira/browse/CB-7639) Revert back `isAlertShowing` flag in case of exception to prevent queuing of future dialogs. +* [CB-7639](https://issues.apache.org/jira/browse/CB-7639) Handle button labels as array on windows +* [CB-7977](https://issues.apache.org/jira/browse/CB-7977) Mention `deviceready` in plugin docs +* Check for `setTextDirection` API level +* **Android** Make spinner dialog to use `THEME_DEVICE_DEFAULT_LIGHT` (same as the other dialogs) +* **Android** Unbreak `API` level < `14` +* [CB-7414](https://issues.apache.org/jira/browse/CB-7414) **BB10** Document callback parameter for `navigator.notification.alert` +* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-dialogs documentation translation: cordova-plugin-dialogs +* [CB-7571](https://issues.apache.org/jira/browse/CB-7571) Bump version of nested plugin to match parent plugin + +### 0.2.10 (Sep 17, 2014) +* [CB-7538](https://issues.apache.org/jira/browse/CB-7538) Android beep thread fix Beep now executes in it's own thread. It was previously executing in the main UI thread which was causing the application to lock up will the beep was occurring. Closing pull request +* Set dialog text dir to locale +* Renamed test dir, added nested plugin.xml +* added documentation for manual tests +* [CB-6965](https://issues.apache.org/jira/browse/CB-6965) Added manual tests +* [CB-6965](https://issues.apache.org/jira/browse/CB-6965) Port notification tests to test-framework ### 0.2.9 (Aug 06, 2014) * ubuntu: pass proper arguments to prompt callback * ubuntu: use TextField instead of TextInput * ubuntu: proper message escaping before passing to qml * **FFOS** update notification.js -* CB-6127 Updated translations for docs +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Updated translations for docs * android: Explicitly apply default theme to dialogs * Fix Beep exception on Android when no argument passed -### 0.2.10 (Sep 17, 2014) -* CB-7538 Android beep thread fix Beep now executes in it's own thread. It was previously executing in the main UI thread which was causing the application to lock up will the beep was occurring. Closing pull request -* Set dialog text dir to locale -* Renamed test dir, added nested plugin.xml -* added documentation for manual tests -* CB-6965 Added manual tests -* CB-6965 Port notification tests to test-framework +### 0.2.8 (Jun 05, 2014) +* [CB-6801](https://issues.apache.org/jira/browse/CB-6801) Add license +* running original windows.open, inAppBrowser is overriding it no need to place CSS in every page anymore +* [CB-5945](https://issues.apache.org/jira/browse/CB-5945) [Windows8] do not call success callbacks until dialog is dismissed +* [CB-4616](https://issues.apache.org/jira/browse/CB-4616) Returned index 0 was not documented for notification.prompt +* update docs to state that prompt is supported on windowsphone +* [CB-6528](https://issues.apache.org/jira/browse/CB-6528) allow scroll on alert message content +* [CB-6628][amazon-fireos]dialogs plugin's confirm and prompt methods dont work confirm() method was missing amazon-fireos platform check. added that. prompt() method had bug. It is executed in a worker thread that does not have a message queue(or Looper object) associated with it and hence "can't create a handler" exception is thrown. To fix this issue, we need to create the EditText widget from within the UI thread. This was fixed sometime ago when we added fireos platform but commit got lost somewhere. So fixing it again now. +* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md +* Added check for isFinishing() on the parent activity to prevent crashes when trying to display dialogs when activity is in this phase of it's lifecycle +* [CB-4966](https://issues.apache.org/jira/browse/CB-4966) Dialogs are in window now No need to add anything to manifest or index.html +* Removing FirefoxOS Quirks * no need to add special permission (it's different API with the same name) * notification.css is added automatically -### 0.2.11 (Dec 02, 2014) -* [CB-7737] lower min height for alert -* CB-8038 backslash getting escaped twice in **BB10** -* CB-8029 test 1-based indexing for confirm -* CB-7639 Update docs + manual tests -* CB-7639 Revert back `isAlertShowing` flag in case of exception to prevent queuing of future dialogs. -* CB-7639 Handle button labels as array on windows -* CB-7977 Mention `deviceready` in plugin docs -* Check for `setTextDirection` API level -* **Android** Make spinner dialog to use `THEME_DEVICE_DEFAULT_LIGHT` (same as the other dialogs) -* **Android** Unbreak `API` level < `14` -* CB-7414 **BB10** Document callback parameter for `navigator.notification.alert` -* CB-7700 cordova-plugin-dialogs documentation translation: cordova-plugin-dialogs -* CB-7571 Bump version of nested plugin to match parent plugin +### 0.2.7 (Apr 17, 2014) +* [CB-6212](https://issues.apache.org/jira/browse/CB-6212): [iOS] fix warnings compiled under arm64 64-bit +* [CB-6411](https://issues.apache.org/jira/browse/CB-6411): [BlackBerry10] Work around Audio playback issue +* [CB-6411](https://issues.apache.org/jira/browse/CB-6411): [BlackBerry10] Updates to beep +* [CB-6422](https://issues.apache.org/jira/browse/CB-6422): [windows8] use cordova/exec/proxy +* [CB-6460](https://issues.apache.org/jira/browse/CB-6460): Update license headers +* Add NOTICE file -### 0.3.0 (Feb 04, 2015) -* Correct way to specify Windows platform in config.xml -* CB-8351 ios: Use argumentForIndex rather than NSArray extension -* CB-7955 Add support "browser" platform +### 0.2.6 (Feb 05, 2014) +* no need to recreate the manifest.webapp file after each `cordova prepare` for FFOS +* FFOS description added -### 1.0.0 (Apr 15, 2015) -* CB-8746 gave plugin major version bump -* CB-8683 updated wp and bb specific references of old id to new id -* CB-8683 changed plugin-id to pacakge-name -* CB-8653 properly updated translated docs to use new id -* CB-8653 updated translated docs to use new id -* Use TRAVIS_BUILD_DIR, install paramedic by npm -* CB-8653 Updated Readme -* CB-8659: ios: 4.0.x Compatibility: Remove use of deprecated headers -* CB-8565 Integrate TravisCI -* CB-8438 cordova-plugin-dialogs documentation translation: cordova-plugin-dialogs -* CB-8538 Added package.json file -* CB-8367 [org.apache.cordova.dialogs] Add Prompt support on Windows +### 0.2.5 (Jan 02, 2014) +* [CB-4696](https://issues.apache.org/jira/browse/CB-4696) Fix compile error for Xcode 4.5. +* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Add doc/index.md for Dialogs plugin +* [CB-3762](https://issues.apache.org/jira/browse/CB-3762) Change prompt default to empty string +* Move images from css to img -### 1.1.0 (May 06, 2015) -* CB-8928: Removed direct call to `toStaticHTML`, only call it if we are sure it's present. This closes #52 -* CB-7734 - `navigator.notification.alert` or `navigator.notification.confirm` seem have a "many words" issue. (closes #39) +### 0.2.4 (Dec 4, 2013) +* add ubuntu platform +* 1. Added amazon-fireos platform. 2. Change to use amazon-fireos as a platform if user agent string contains 'cordova-amazon-fireos'. +* added beep funtionality using ms-winsoundevent:Notfication.Default -### 1.1.1 (Jun 17, 2015) -* CB-9128 cordova-plugin-dialogs documentation translation: cordova-plugin-dialogs -* fix npm md +### 0.2.3 (Oct 28, 2013) +* [CB-5128](https://issues.apache.org/jira/browse/CB-5128): added repo + issue tag to plugin.xml for dialogs plugin +* new plugin execute arguments supported +* new plugin style +* smaller fonts styling input +* img files copied inside plugin +* style added +* prompt added +* styling from James +* fixed "exec" calls addedd css, but not working yet +* first (blind) try +* [CB-4915](https://issues.apache.org/jira/browse/CB-4915) Incremented plugin version on dev branch. + +### 0.2.2 (Sept 25, 2013) +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) bumping&resetting version +* [windows8] commandProxy was moved +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming reference in Notification.cs +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming org.apache.cordova.core.dialogs to org.apache.cordova.dialogs +* Rename CHANGELOG.md -> RELEASENOTES.md +* [CB-4592](https://issues.apache.org/jira/browse/CB-4592) [Blackberry10] Added beep support +* [CB-4752](https://issues.apache.org/jira/browse/CB-4752) Incremented plugin version on dev branch. diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/README.md index 355cd4d1..355cd4d1 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/index.md index c003d401..c003d401 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/de/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/README.md index e7df5fea..e7df5fea 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/index.md index 9ff4251e..9ff4251e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/es/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/README.md index 994c8264..994c8264 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/index.md index fec09396..fec09396 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/fr/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/README.md index 8a72905d..8a72905d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/index.md index e8e02c7a..e8e02c7a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/it/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/README.md index 0722658b..0722658b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/index.md index b5308605..b5308605 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ja/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/README.md index 04532da8..04532da8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/index.md index 8216d8cf..8216d8cf 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ko/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/README.md index 45fa937c..45fa937c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/index.md index 462d5ac2..462d5ac2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/pl/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ru/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ru/index.md index 49474ead..49474ead 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/ru/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/ru/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/README.md index c8c26c3d..c8c26c3d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/README.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/README.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/index.md b/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/index.md index b47fc5f9..b47fc5f9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/index.md +++ b/StoneIsland/plugins/cordova-plugin-dialogs/doc/zh/index.md diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/package.json b/StoneIsland/plugins/cordova-plugin-dialogs/package.json index 3fd10da8..f85f14ce 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/package.json +++ b/StoneIsland/plugins/cordova-plugin-dialogs/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-dialogs", - "version": "1.1.1", + "version": "1.3.0", "description": "Cordova Notification Plugin", "cordova": { "id": "cordova-plugin-dialogs", @@ -38,6 +38,20 @@ "cordova-windows8", "cordova-windows" ], + "scripts": { + "test": "npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests" + }, "author": "Apache Software Foundation", - "license": "Apache 2.0" + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova": ">100" + } + } + }, + "devDependencies": { + "jshint": "^2.6.0" + } } diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/plugin.xml b/StoneIsland/plugins/cordova-plugin-dialogs/plugin.xml index 6d6235fa..1069cce1 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-dialogs/plugin.xml @@ -20,7 +20,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-dialogs" - version="1.1.1"> + version="1.3.0"> <name>Notification</name> <description>Cordova Notification Plugin</description> @@ -41,13 +41,13 @@ </feature> </config-file> - <asset src="www/firefoxos/notification.css" target="css/notification.css" /> - <asset src="www/firefoxos/danger-press.png" target="img/danger-press.png" /> - <asset src="www/firefoxos/danger.png" target="img/danger.png" /> - <asset src="www/firefoxos/default.png" target="img/default.png" /> - <asset src="www/firefoxos/gradient.png" target="img/gradient.png" /> - <asset src="www/firefoxos/pattern.png" target="img/pattern.png" /> - <asset src="www/firefoxos/recommend.png" target="img/recommend.png" /> + <asset src="www/firefoxos/notification.css" target="css/notification.css" /> + <asset src="www/firefoxos/danger-press.png" target="img/danger-press.png" /> + <asset src="www/firefoxos/danger.png" target="img/danger.png" /> + <asset src="www/firefoxos/default.png" target="img/default.png" /> + <asset src="www/firefoxos/gradient.png" target="img/gradient.png" /> + <asset src="www/firefoxos/pattern.png" target="img/pattern.png" /> + <asset src="www/firefoxos/recommend.png" target="img/recommend.png" /> <js-module src="src/firefoxos/notification.js" name="dialogs-impl"> <runs /> </js-module> @@ -110,9 +110,9 @@ </feature> </config-file> <header-file src="src/ios/CDVNotification.h" /> - <source-file src="src/ios/CDVNotification.m" /> - <resource-file src="src/ios/CDVNotification.bundle" /> - <framework src="AudioToolbox.framework" weak="true" /> + <source-file src="src/ios/CDVNotification.m" /> + <resource-file src="src/ios/CDVNotification.bundle" /> + <framework src="AudioToolbox.framework" weak="true" /> </platform> <!-- blackberry10 --> @@ -167,5 +167,7 @@ <js-module src="src/windows/NotificationProxy.js" name="NotificationProxy"> <merges target="" /> </js-module> + + <asset src="www/windows/notification.css" target="css/notification.css" /> </platform> </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/android/Notification.java b/StoneIsland/plugins/cordova-plugin-dialogs/src/android/Notification.java index 3bc3cee6..f19bc888 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/android/Notification.java +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/android/Notification.java @@ -21,6 +21,7 @@ package org.apache.cordova.dialogs; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.LOG; import org.apache.cordova.PluginResult; import org.json.JSONArray; import org.json.JSONException; @@ -31,6 +32,7 @@ import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.ProgressDialog; import android.content.DialogInterface; +import android.content.res.Resources; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; @@ -48,6 +50,8 @@ import android.widget.TextView; */ public class Notification extends CordovaPlugin { + private static final String LOG_TAG = "Notification"; + public int confirmResult = -1; public ProgressDialog spinnerDialog = null; public ProgressDialog progressDialog = null; @@ -139,6 +143,7 @@ public class Notification extends CordovaPlugin { try { Thread.sleep(100); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); } } } @@ -215,7 +220,9 @@ public class Notification extends CordovaPlugin { callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 1)); } }); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on first button."); + } } // Second button @@ -228,7 +235,9 @@ public class Notification extends CordovaPlugin { callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 2)); } }); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on second button."); + } } // Third button @@ -241,7 +250,9 @@ public class Notification extends CordovaPlugin { callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, 3)); } }); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on third button."); + } } dlg.setOnCancelListener(new AlertDialog.OnCancelListener() { public void onCancel(DialogInterface dialog) @@ -276,7 +287,14 @@ public class Notification extends CordovaPlugin { Runnable runnable = new Runnable() { public void run() { final EditText promptInput = new EditText(cordova.getActivity()); - promptInput.setHint(defaultText); + + /* CB-11677 - By default, prompt input text color is set according current theme. + But for some android versions is not visible (for example 5.1.1). + android.R.color.primary_text_light will make text visible on all versions. */ + Resources resources = cordova.getActivity().getResources(); + int promptInputTextColor = resources.getColor(android.R.color.primary_text_light); + promptInput.setTextColor(promptInputTextColor); + promptInput.setText(defaultText); AlertDialog.Builder dlg = createDialog(cordova); // new AlertDialog.Builder(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); dlg.setMessage(message); dlg.setTitle(title); @@ -296,11 +314,15 @@ public class Notification extends CordovaPlugin { try { result.put("buttonIndex",1); result.put("input1", promptInput.getText().toString().trim().length()==0 ? defaultText : promptInput.getText()); - } catch (JSONException e) { e.printStackTrace(); } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on first button.", e); + } callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); } }); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on first button."); + } } // Second button @@ -313,11 +335,15 @@ public class Notification extends CordovaPlugin { try { result.put("buttonIndex",2); result.put("input1", promptInput.getText().toString().trim().length()==0 ? defaultText : promptInput.getText()); - } catch (JSONException e) { e.printStackTrace(); } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on second button.", e); + } callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); } }); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on second button."); + } } // Third button @@ -330,11 +356,15 @@ public class Notification extends CordovaPlugin { try { result.put("buttonIndex",3); result.put("input1", promptInput.getText().toString().trim().length()==0 ? defaultText : promptInput.getText()); - } catch (JSONException e) { e.printStackTrace(); } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on third button.", e); + } callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); } }); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG,"JSONException on third button."); + } } dlg.setOnCancelListener(new AlertDialog.OnCancelListener() { public void onCancel(DialogInterface dialog){ diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/blackberry10/index.js b/StoneIsland/plugins/cordova-plugin-dialogs/src/blackberry10/index.js index 3660f667..4969a770 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/blackberry10/index.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/blackberry10/index.js @@ -14,6 +14,8 @@ * limitations under the License. */ +/* global qnx, PluginResult */ + function showDialog(args, dialogType, result) { //Unpack and map the args var msg = JSON.parse(decodeURIComponent(args[0])), diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/firefoxos/notification.js b/StoneIsland/plugins/cordova-plugin-dialogs/src/firefoxos/notification.js index b6986fd0..aea562d0 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/firefoxos/notification.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/firefoxos/notification.js @@ -60,7 +60,8 @@ function modal(message, callback, title, buttonLabels, domObjects) { var menu = modalDocument.createElement('menu'); box.appendChild(menu); for (var index = 0; index < buttonLabels.length; index++) { - addButton(buttonLabels[index], index, (index === 0)); + // TODO: last button listens to the cancel key + addButton(buttonLabels[index], (index+1), (index === 0)); } modalDocument.body.appendChild(box); @@ -83,12 +84,12 @@ function modal(message, callback, title, buttonLabels, domObjects) { result = { input1: '', buttonIndex: 0 - } + }; } mainWindow.setTimeout(function() { callback(result); }, 10); - }; + } modalWindow.addEventListener('unload', onUnload, false); // call callback and destroy modal @@ -109,7 +110,7 @@ function modal(message, callback, title, buttonLabels, domObjects) { } response = response || labelIndex; callback(response); - } + }; } } diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.bundle/beep.wav b/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.bundle/beep.wav Binary files differindex 05f5997f..05f5997f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.bundle/beep.wav +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.bundle/beep.wav diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.h b/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.h index 9253f6a9..9253f6a9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.h +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.h diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.m b/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.m index 1581ad3c..0dd3d2cb 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.m +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/ios/CDVNotification.m @@ -23,6 +23,7 @@ #define DIALOG_TYPE_PROMPT @"prompt" static void soundCompletionCallback(SystemSoundID ssid, void* data); +static NSMutableArray *alertList = nil; @implementation CDVNotification @@ -39,7 +40,7 @@ static void soundCompletionCallback(SystemSoundID ssid, void* data); - (void)showDialogWithMessage:(NSString*)message title:(NSString*)title buttons:(NSArray*)buttons defaultText:(NSString*)defaultText callbackId:(NSString*)callbackId dialogType:(NSString*)dialogType { - NSUInteger count = [buttons count]; + int count = (int)[buttons count]; #ifdef __IPHONE_8_0 if (NSClassFromString(@"UIAlertController")) { @@ -58,33 +59,32 @@ static void soundCompletionCallback(SystemSoundID ssid, void* data); alertController.view.frame = alertFrame; } - + + __weak CDVNotification* weakNotif = self; + for (int n = 0; n < count; n++) { - - UIAlertAction* action = [UIAlertAction actionWithTitle:[buttons objectAtIndex:n] style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) - { - CDVPluginResult* result; - - if ([dialogType isEqualToString:DIALOG_TYPE_PROMPT]) { - - NSString* value0 = [[alertController.textFields objectAtIndex:0] text]; - NSDictionary* info = @{ - @"buttonIndex":@(n + 1), - @"input1":(value0 ? value0 : [NSNull null]) - }; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; - - } else { - - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(int)(n + 1)]; - - } - - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; - - }]; - [alertController addAction:action]; - + [alertController addAction:[UIAlertAction actionWithTitle:[buttons objectAtIndex:n] + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) + { + CDVPluginResult* result; + + if ([dialogType isEqualToString:DIALOG_TYPE_PROMPT]) + { + NSString* value0 = [[alertController.textFields objectAtIndex:0] text]; + NSDictionary* info = @{ + @"buttonIndex":@(n + 1), + @"input1":(value0 ? value0 : [NSNull null]) + }; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + } + else + { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(int)(n + 1)]; + } + + [weakNotif.commandDelegate sendPluginResult:result callbackId:callbackId]; + }]]; } if ([dialogType isEqualToString:DIALOG_TYPE_PROMPT]) { @@ -94,12 +94,19 @@ static void soundCompletionCallback(SystemSoundID ssid, void* data); }]; } + if(!alertList) + alertList = [[NSMutableArray alloc] init]; + [alertList addObject:alertController]; + if ([alertList count]==1) { + [self presentAlertcontroller]; + } - [self.viewController presentViewController:alertController animated:YES completion:nil]; - - } else { + } + else + { #endif + CDVAlertView* alertView = [[CDVAlertView alloc] initWithTitle:title message:message @@ -183,6 +190,14 @@ static void soundCompletionCallback(SystemSoundID ssid, void* data); [self.commandDelegate sendPluginResult:result callbackId:cdvAlertView.callbackId]; } +- (void)didPresentAlertView:(UIAlertView*)alertView +{ + //show keyboard on iOS 8 + if (alertView.alertViewStyle == UIAlertViewStylePlainTextInput){ + [[alertView textFieldAtIndex:0] selectAll:nil]; + } +} + static void playBeep(int count) { SystemSoundID completeSound; NSInteger cbDataCount = count; @@ -211,6 +226,26 @@ static void soundCompletionCallback(SystemSoundID ssid, void* data) { playBeep([count intValue]); } +-(UIViewController *)getTopPresentedViewController { + UIViewController *presentingViewController = self.viewController; + while(presentingViewController.presentedViewController != nil && ![presentingViewController.presentedViewController isBeingDismissed]) + { + presentingViewController = presentingViewController.presentedViewController; + } + return presentingViewController; +} + +-(void)presentAlertcontroller { + + __weak CDVNotification* weakNotif = self; + [self.getTopPresentedViewController presentViewController:[alertList firstObject] animated:YES completion:^{ + [alertList removeObject:[alertList firstObject]]; + if ([alertList count]>0) { + [weakNotif presentAlertcontroller]; + } + }]; + +} @end diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.cpp b/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.cpp index d0adf892..d0adf892 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.cpp +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.cpp diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.h b/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.h index 53430738..53430738 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.h +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.h diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.qml b/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.qml index 5fdc7d31..5fdc7d31 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.qml +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/ubuntu/notification.qml diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/windows/NotificationProxy.js b/StoneIsland/plugins/cordova-plugin-dialogs/src/windows/NotificationProxy.js index d1eb3448..2d32f836 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/windows/NotificationProxy.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/windows/NotificationProxy.js @@ -17,17 +17,36 @@ * specific language governing permissions and limitations * under the License. * -*/ + */ -/*global Windows:true */ +/*global Windows:true, WinJS, toStaticHTML */ var cordova = require('cordova'); +var urlutil = require('cordova/urlutil'); var isAlertShowing = false; var alertStack = []; +function createCSSElem(fileName) { + var elemId = fileName.substr(0, fileName.lastIndexOf(".")) + "-plugin-style"; + // If the CSS element exists, don't recreate it. + if (document.getElementById(elemId)) { + return false; + } + + // Create CSS and append it to DOM. + var $elem = document.createElement('link'); + $elem.id = elemId; + $elem.rel = "stylesheet"; + $elem.type = "text/css"; + $elem.href = urlutil.makeAbsolute("/www/css/" + fileName); + + document.head.appendChild($elem); + return true; +} + // CB-8928: When toStaticHTML is undefined, prompt fails to run -function _cleanHtml(html) { return html; } +var _cleanHtml = function(html) { return html; }; if (typeof toStaticHTML !== 'undefined') { _cleanHtml = toStaticHTML; } @@ -36,66 +55,53 @@ if (typeof toStaticHTML !== 'undefined') { // simple html-based implementation until it is available function createPromptDialog(title, message, buttons, defaultText, callback) { - var isPhone = cordova.platformId == "windows" && WinJS.Utilities.isPhone;; + var isPhone = cordova.platformId === "windows" && WinJS.Utilities.isPhone; + var isWindows = !!cordova.platformId.match(/windows/); + + createCSSElem("notification.css"); var dlgWrap = document.createElement("div"); - dlgWrap.style.position = "absolute"; - dlgWrap.style.width = "100%"; - dlgWrap.style.height = "100%"; - dlgWrap.style.backgroundColor = "rgba(0,0,0,0.25)"; - dlgWrap.style.zIndex = "100000"; + dlgWrap.className = "dlgWrap"; var dlg = document.createElement("div"); - dlg.style.width = "100%"; - dlg.style.minHeight = "180px"; - dlg.style.height = "auto"; - dlg.style.overflow = "auto"; - dlg.style.backgroundColor = "white"; - dlg.style.position = "relative"; - dlg.style.lineHeight = "2"; + dlg.className = "dlgContainer"; - if (isPhone) { - dlg.style.padding = "0px 5%"; - } else { - dlg.style.top = "50%"; // center vertically - dlg.style.transform = "translateY(-50%)"; - dlg.style.padding = "0px 30%"; + if (isWindows) { + dlg.className += " dlgContainer-windows"; + } else if (isPhone) { + dlg.className += " dlgContainer-phone"; } + // dialog layout template - dlg.innerHTML = _cleanHtml("<span id='lbl-title' style='font-size: 24pt'></span><br/>" // title - + "<span id='lbl-message'></span><br/>" // message - + "<input id='prompt-input' style='width: 100%'/><br/>"); // input fields + dlg.innerHTML = _cleanHtml("<span id='lbl-title'></span><br/>" + // title + "<span id='lbl-message'></span><br/>" + // message + "<input id='prompt-input'/><br/>"); // input fields dlg.querySelector('#lbl-title').appendChild(document.createTextNode(title)); dlg.querySelector('#lbl-message').appendChild(document.createTextNode(message)); dlg.querySelector('#prompt-input').setAttribute('placeholder', defaultText); + dlg.querySelector('#prompt-input').setAttribute('value', defaultText); function makeButtonCallback(idx) { return function () { - var value = promptInput = dlg.querySelector('#prompt-input').value; + var value = dlg.querySelector('#prompt-input').value || defaultText; dlgWrap.parentNode.removeChild(dlgWrap); if (callback) { callback({ input1: value, buttonIndex: idx }); } - } + }; } function addButton(idx, label) { var button = document.createElement('button'); - button.style.margin = "8px 0 8px 16px"; - button.style.float = "right"; - button.style.fontSize = "12pt"; + button.className = "dlgButton"; button.tabIndex = idx; button.onclick = makeButtonCallback(idx + 1); - if (idx == 0) { - button.style.color = "white"; - button.style.backgroundColor = "#464646"; - } else { - button.style.backgroundColor = "#cccccc"; + if (idx === 0) { + button.className += " dlgButtonFirst"; } - button.style.border = "none"; button.appendChild(document.createTextNode(label)); dlg.appendChild(button); } @@ -109,7 +115,7 @@ function createPromptDialog(title, message, buttons, defaultText, callback) { document.body.appendChild(dlgWrap); // make sure input field is under focus - dlg.querySelector('#prompt-input').focus(); + dlg.querySelector('#prompt-input').select(); return dlgWrap; } @@ -134,7 +140,9 @@ module.exports = { md.commands.append(new Windows.UI.Popups.UICommand(_buttonLabel)); md.showAsync().then(function() { isAlertShowing = false; - win && win(); + if (win) { + win(); + } if (alertStack.length) { setTimeout(alertStack.shift(), 0); @@ -204,7 +212,9 @@ module.exports = { md.showAsync().then(function(res) { isAlertShowing = false; var result = res ? buttons.indexOf(res.label) + 1 : 0; - win && win(result); + if (win) { + win(result); + } if (alertStack.length) { setTimeout(alertStack.shift(), 0); } @@ -236,7 +246,9 @@ module.exports = { } else { snd.removeEventListener("ended", onEvent); snd = null; - winX && winX(); // notification.js just sends null, but this is future friendly + if (winX) { + winX(); // notification.js just sends null, but this is future friendly + } } count--; }; diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/Notification.cs b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/Notification.cs index b6216848..b6216848 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/Notification.cs +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/Notification.cs diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml index 2d564fba..2d564fba 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml.cs b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml.cs index 50b2f2a8..50b2f2a8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml.cs +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/NotificationBox.xaml.cs diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/notification-beep.wav b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/notification-beep.wav Binary files differindex d0ad085f..d0ad085f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/notification-beep.wav +++ b/StoneIsland/plugins/cordova-plugin-dialogs/src/wp/notification-beep.wav diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-dialogs/tests/plugin.xml index f021ddd5..55675b20 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-dialogs/tests/plugin.xml @@ -20,7 +20,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-dialogs-tests" - version="1.1.1"> + version="1.3.0"> <name>Cordova Notification Plugin Tests</name> <license>Apache 2.0</license> diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/tests/tests.js b/StoneIsland/plugins/cordova-plugin-dialogs/tests/tests.js index 16e9cd99..7056c0db 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/tests/tests.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/tests/tests.js @@ -19,6 +19,9 @@ * */ +/* jshint jasmine: true */ +/* global cordova */ + exports.defineAutoTests = function () { describe('Notification (navigator.notification)', function () { it("should exist", function () { @@ -57,12 +60,12 @@ exports.defineManualTests = function (contentEl, createActionButton) { var logLine = document.createElement('div'); logLine.innerHTML = message; log.appendChild(logLine); - } + }; var clearLog = function () { var log = document.getElementById('info'); log.innerHTML = ''; - } + }; var beep = function () { console.log("beep()"); @@ -111,14 +114,14 @@ exports.defineManualTests = function (contentEl, createActionButton) { buttons); }; - var promptDialog = function (message, title, buttons) { + var promptDialog = function (message, title, buttons,defaultText) { clearLog(); navigator.notification.prompt(message, function (r) { if (r && r.buttonIndex === 0) { var msg = "Dismissed dialog"; if (r.input1) { - msg += " with input: " + r.input1 + msg += " with input: " + r.input1; } logMessage(msg); console.log(msg); @@ -128,7 +131,7 @@ exports.defineManualTests = function (contentEl, createActionButton) { } }, title, - buttons); + buttons,defaultText); }; /******************************************************************************/ @@ -144,13 +147,15 @@ exports.defineManualTests = function (contentEl, createActionButton) { '<p/> <div id="confirm"></div>' + 'Expected result: Dialog will say "You pressed confirm". Press Yes, No, or Maybe, Not Sure to close dialog. Status box will tell you what option you selected, and should use 1-based indexing.' + '<p/> <div id="prompt"></div>' + - 'Expected result: Dialog will say "You pressed prompt". Enter any message and press Yes, No, or Maybe, Not Sure to close dialog. Status box will tell you what option you selected and message you entered, and should use 1-based indexing.' + + 'Expected result: Dialog will say "You pressed prompt". Enter any message and press Yes, No, or Maybe, Not Sure to close dialog. Status box will tell you what option you selected and message you entered or if empty, it will display "Default Text", and should use 1-based indexing.' + '<p/> <div id="built_in_alert"></div>' + 'Expected result: Dialog will have title "index.html" and say "You pressed alert" Press OK to close dialog. Nothing will get updated in status box.' + '<p/> <div id="built_in_confirm"></div>' + 'Expected result: Dialog will have title "index.html" and say "You selected confirm". Press Cancel or OK to close dialog. Nothing will get updated in status box.' + '<p/> <div id="built_in_prompt"></div>' + - 'Expected result: Dialog will have title "index.html" and say "This is a prompt". "Default value" will be in text box. Press Cancel or OK to close dialog. Nothing will get updated in status box.'; + 'Expected result: Dialog will have title "index.html" and say "This is a prompt". "Default value" will be in text box. Press Cancel or OK to close dialog. Nothing will get updated in status box.' + + '<p/> <h3>CB-8947 Tests</h3><div id="cb8947"></div>' + + 'Expected results: Dialogs will not crash iOS'; contentEl.innerHTML = '<div id="info"></div>' + dialogs_tests; @@ -177,18 +182,52 @@ exports.defineManualTests = function (contentEl, createActionButton) { }, 'confirm'); createActionButton('Prompt Dialog', function () { - promptDialog('You pressed prompt.', 'Prompt Dialog', ['Yes', 'No', 'Maybe, Not Sure']); + promptDialog('You pressed prompt.', 'Prompt Dialog', ['Yes', 'No', 'Maybe, Not Sure'],'Default Text'); }, 'prompt'); createActionButton('Built-in Alert Dialog', function () { - typeof alert === 'function' && alert('You pressed alert'); + if (typeof alert === 'function') { + alert('You pressed alert'); + } }, 'built_in_alert'); createActionButton('Built-in Confirm Dialog', function () { - typeof confirm === 'function' && confirm('You selected confirm'); + if (typeof confirm === 'function') { + confirm('You selected confirm'); + } }, 'built_in_confirm'); createActionButton('Built-in Prompt Dialog', function () { - typeof prompt === 'function' && prompt('This is a prompt', 'Default value'); + if (typeof prompt === 'function') { + prompt('This is a prompt', 'Default value'); + } }, 'built_in_prompt'); + + // CB-8947 - ensure number messages don't crash iOS + createActionButton('Alert Dialog with Number', function () { + var callback = function() { clearLog(); console.log("Test passed"); }; + navigator.notification.alert(17, callback); + }, 'cb8947'); + + // CB-8947 - ensure object messages don't crash iOS + createActionButton('Alert Dialog with Object', function () { + var object = { number: 42, message: "Make sure an object doesn't crash iOS", issue: 'CB-8947'}; + var callback = function() { clearLog(); console.log("Test passed"); }; + navigator.notification.alert(object, callback); + }, 'cb8947'); + + // CB-8947 - ensure object messages don't crash iOS + createActionButton('Confirm Dialog with Object', function () { + var object = { number: 42, message: "Make sure an object doesn't crash iOS", issue: 'CB-8947'}; + var callback = function() { clearLog(); console.log("Test passed"); }; + navigator.notification.confirm(object, callback); + }, 'cb8947'); + + // CB-8947 - ensure object messages don't crash iOS + createActionButton('Prompt Dialog with Object', function () { + var object = { number: 42, message: "Make sure an object doesn't crash iOS", issue: 'CB-8947'}; + var callback = function() { clearLog(); console.log("Test passed"); }; + navigator.notification.prompt(object, callback); + }, 'cb8947'); + }; diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/android/notification.js b/StoneIsland/plugins/cordova-plugin-dialogs/www/android/notification.js index 8936a5c2..8936a5c2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/android/notification.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/android/notification.js diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/beep.js b/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/beep.js index 401049e8..da2e75d1 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/beep.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/beep.js @@ -21,20 +21,24 @@ module.exports = function (quantity) { var count = 0, - beepObj, - play = function () { - //create new object every time due to strage playback behaviour - beepObj = new Audio('local:///chrome/plugin/cordova-plugin-dialogs/notification-beep.wav'); - beepObj.addEventListener("ended", callback); - beepObj.play(); - }, - callback = function () { - if (--count > 0) { - play(); - } else { - delete beepObj; - } - }; + beepObj; + + function callback() { + if (--count > 0) { + play(); + } else { + beepObj.removeEventListener("ended", callback); + beepObj = null; + } + } + + function play() { + //create new object every time due to strage playback behaviour + beepObj = new Audio('local:///chrome/plugin/cordova-plugin-dialogs/notification-beep.wav'); + beepObj.addEventListener("ended", callback); + beepObj.play(); + } + count += quantity || 1; if (count > 0) { play(); diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/notification-beep.wav b/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/notification-beep.wav Binary files differindex d0ad085f..d0ad085f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/notification-beep.wav +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/blackberry10/notification-beep.wav diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/browser/notification.js b/StoneIsland/plugins/cordova-plugin-dialogs/www/browser/notification.js index e8753093..1fdfafd7 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/browser/notification.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/browser/notification.js @@ -65,6 +65,21 @@ module.exports.prompt = window.navigator.notification.prompt = function(message, }; +var audioContext = (function() { + // Determine if the Audio API is supported by this browser + var AudioApi = window.AudioContext; + if (!AudioApi) { + AudioApi = window.webkitAudioContext; + } + + if (AudioApi) { + // The Audio API is supported, so create a singleton instance of the AudioContext + return new AudioApi(); + } + + return undefined; +}()); + module.exports.beep = window.navigator.notification.beep = function(times) { if (times > 0) { var BEEP_DURATION = 700; @@ -98,18 +113,3 @@ module.exports.beep = window.navigator.notification.beep = function(times) { } } }; - -var audioContext = (function() { - // Determine if the Audio API is supported by this browser - var AudioApi = window.AudioContext; - if (!AudioApi) { - AudioApi = window.webkitAudioContext; - } - - if (AudioApi) { - // The Audio API is supported, so create a singleton instance of the AudioContext - return new AudioApi(); - } - - return undefined; -}()); diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger-press.png b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger-press.png Binary files differindex d7529b5b..d7529b5b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger-press.png +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger-press.png diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger.png b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger.png Binary files differindex 400e3ae3..400e3ae3 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger.png +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/danger.png diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/default.png b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/default.png Binary files differindex 2ff298a1..2ff298a1 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/default.png +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/default.png diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/gradient.png b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/gradient.png Binary files differindex b2885450..b2885450 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/gradient.png +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/gradient.png diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/notification.css b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/notification.css index 34d92b88..34d92b88 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/notification.css +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/notification.css diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/pattern.png b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/pattern.png Binary files differindex af03f569..af03f569 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/pattern.png +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/pattern.png diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/recommend.png b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/recommend.png Binary files differindex 42aed390..42aed390 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/recommend.png +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/firefoxos/recommend.png diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/notification.js b/StoneIsland/plugins/cordova-plugin-dialogs/www/notification.js index c3f70d07..4db8f0f2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-dialogs/www/notification.js +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/notification.js @@ -37,9 +37,10 @@ module.exports = { * @param {String} buttonLabel Label of the close button (default: OK) */ alert: function(message, completeCallback, title, buttonLabel) { - var _title = (title || "Alert"); + var _message = (typeof message === "string" ? message : JSON.stringify(message)); + var _title = (typeof title === "string" ? title : "Alert"); var _buttonLabel = (buttonLabel || "OK"); - exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]); + exec(completeCallback, null, "Notification", "alert", [_message, _title, _buttonLabel]); }, /** @@ -52,7 +53,8 @@ module.exports = { * @param {Array} buttonLabels Array of the labels of the buttons (default: ['OK', 'Cancel']) */ confirm: function(message, resultCallback, title, buttonLabels) { - var _title = (title || "Confirm"); + var _message = (typeof message === "string" ? message : JSON.stringify(message)); + var _title = (typeof title === "string" ? title : "Confirm"); var _buttonLabels = (buttonLabels || ["OK", "Cancel"]); // Strings are deprecated! @@ -60,23 +62,9 @@ module.exports = { console.log("Notification.confirm(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); } - // Some platforms take an array of button label names. - // Other platforms take a comma separated list. - // For compatibility, we convert to the desired type based on the platform. - if (platform.id == "amazon-fireos" || platform.id == "android" || platform.id == "ios" || - platform.id == "windowsphone" || platform.id == "firefoxos" || platform.id == "ubuntu" || - platform.id == "windows8" || platform.id == "windows") { + _buttonLabels = convertButtonLabels(_buttonLabels); - if (typeof _buttonLabels === 'string') { - _buttonLabels = _buttonLabels.split(","); // not crazy about changing the var type here - } - } else { - if (Array.isArray(_buttonLabels)) { - var buttonLabelArray = _buttonLabels; - _buttonLabels = buttonLabelArray.toString(); - } - } - exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]); + exec(resultCallback, null, "Notification", "confirm", [_message, _title, _buttonLabels]); }, /** @@ -92,9 +80,17 @@ module.exports = { * @param {String} defaultText Textbox input value (default: empty string) */ prompt: function(message, resultCallback, title, buttonLabels, defaultText) { - var _message = (message || "Prompt message"); - var _title = (title || "Prompt"); + var _message = (typeof message === "string" ? message : JSON.stringify(message)); + var _title = (typeof title === "string" ? title : "Prompt"); var _buttonLabels = (buttonLabels || ["OK","Cancel"]); + + // Strings are deprecated! + if (typeof _buttonLabels === 'string') { + console.log("Notification.prompt(string, function, string, string) is deprecated. Use Notification.confirm(string, function, string, array)."); + } + + _buttonLabels = convertButtonLabels(_buttonLabels); + var _defaultText = (defaultText || ""); exec(resultCallback, null, "Notification", "prompt", [_message, _title, _buttonLabels, _defaultText]); }, @@ -110,3 +106,25 @@ module.exports = { exec(null, null, "Notification", "beep", [ defaultedCount ]); } }; + +function convertButtonLabels(buttonLabels) { + + // Some platforms take an array of button label names. + // Other platforms take a comma separated list. + // For compatibility, we convert to the desired type based on the platform. + if (platform.id == "amazon-fireos" || platform.id == "android" || platform.id == "ios" || + platform.id == "windowsphone" || platform.id == "firefoxos" || platform.id == "ubuntu" || + platform.id == "windows8" || platform.id == "windows") { + + if (typeof buttonLabels === 'string') { + buttonLabels = buttonLabels.split(","); // not crazy about changing the var type here + } + } else { + if (Array.isArray(buttonLabels)) { + var buttonLabelArray = buttonLabels; + buttonLabels = buttonLabelArray.toString(); + } + } + + return buttonLabels; +} diff --git a/StoneIsland/plugins/cordova-plugin-dialogs/www/windows/notification.css b/StoneIsland/plugins/cordova-plugin-dialogs/www/windows/notification.css new file mode 100644 index 00000000..785039ba --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-dialogs/www/windows/notification.css @@ -0,0 +1,84 @@ +/* + * + * 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. + * +*/ + +.dlgWrap { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.25); + z-index: 100000; + top: 0; +} + +.dlgContainer { + width: 100%; + min-height: 180px; + height: auto; + overflow: auto; + background-color: white; + position: relative; + line-height: 2; + top: 50%; + transform: translateY(-50%); + padding: 0 30%; +} + +.dlgContainer #lbl-title { + font-size: 24pt; +} + +.dlgContainer #prompt-input { + width: 100%; +} + +.dlgButton { + margin: 8px 0 0 16px; + float: right; + font-size: 11pt; + background-color: #cccccc; + border: none; + font-weight: 600; + font-family: "Segoe UI", Arial, sans-serif; + padding: 0 22px; +} + +.dlgButton.dlgButtonFirst { + color: white; + background-color: #464646; +} + +.dlgContainer.dlgContainer-windows { + width: 50%; + max-width: 680px; + padding: 0 5%; + top: 50%; + left: 50%; + position: fixed; + transform: translate(-50%, -50%); + border: 1px solid rgb(24, 160, 191); + border-image: none; + box-shadow: 0 0 14px 6px rgba(0,0,0,0.16); + text-transform: none; +} + +.dlgContainer.dlgContainer-phone { + padding: 0 5%; +} diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/CONTRIBUTING.md b/StoneIsland/plugins/cordova-plugin-geolocation/CONTRIBUTING.md index f7dbcaba..4c8e6a5e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/CONTRIBUTING.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/CONTRIBUTING.md @@ -27,7 +27,7 @@ There are multiple ways to contribute: report bugs, improve the docs, and contribute code. For instructions on this, start with the -[contribution overview](http://cordova.apache.org/#contribute). +[contribution overview](http://cordova.apache.org/contribute/). The details are explained there, but the important items are: - Sign and submit an Apache ICLA (Contributor License Agreement). diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/LICENSE b/StoneIsland/plugins/cordova-plugin-geolocation/LICENSE index 7a4a3ea2..7a4a3ea2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/LICENSE +++ b/StoneIsland/plugins/cordova-plugin-geolocation/LICENSE diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/NOTICE b/StoneIsland/plugins/cordova-plugin-geolocation/NOTICE index 8ec56a52..8ec56a52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/NOTICE +++ b/StoneIsland/plugins/cordova-plugin-geolocation/NOTICE diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/README.md index eb10b9f8..77a3c9a7 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/README.md @@ -1,3 +1,7 @@ +--- +title: Geolocation +description: Access GPS data. +--- <!-- # license: Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,17 +21,23 @@ # under the License. --> -# cordova-plugin-geolocation +|Android|iOS| Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI | +|:-:|:-:|:-:|:-:|:-:|:-:| +|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=android,PLUGIN=cordova-plugin-geolocation/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=ios,PLUGIN=cordova-plugin-geolocation/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-store,PLUGIN=cordova-plugin-geolocation/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-phone,PLUGIN=cordova-plugin-geolocation/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-10-store,PLUGIN=cordova-plugin-geolocation/)|[](https://travis-ci.org/apache/cordova-plugin-geolocation)| -[](https://travis-ci.org/apache/cordova-plugin-geolocation) +# cordova-plugin-geolocation This plugin provides information about the device's location, such as -latitude and longitude. Common sources of location information include +latitude and longitude. + +Common sources of location information include Global Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs. There is no guarantee that the API returns the device's actual location. +> To get a few ideas, check out the [sample](#sample) at the bottom of this page or go straight to the [reference](#reference) content. + This API is based on the [W3C Geolocation API Specification](http://dev.w3.org/geo/api/spec-source.html), and only executes on devices that don't already provide an implementation. @@ -45,7 +55,7 @@ accesses geolocation data (if the device operating system doesn't do so already). That notice should provide the same information noted above, as well as obtaining the user's permission (e.g., by presenting choices for __OK__ and __No Thanks__). For more information, please -see the Privacy Guide. +see the [Privacy Guide](http://cordova.apache.org/docs/en/latest/guide/appdev/privacy/index.html). This plugin defines a global `navigator.geolocation` object (for platforms where it is otherwise missing). @@ -53,11 +63,15 @@ where it is otherwise missing). Although the object is in the global scope, features provided by this plugin are not available until after the `deviceready` event. +```javascript + document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { console.log("navigator.geolocation works well"); } +``` +## <a id="reference"></a>Reference ## Installation This requires cordova 5.0+ ( current stable 1.0.0 ) @@ -81,7 +95,6 @@ It is also possible to install via repo url directly ( unstable ) - iOS - Tizen - Windows Phone 7 and 8 -- Windows 8 - Windows ## Methods @@ -118,6 +131,8 @@ error, the `geolocationError` callback is passed a ### Example +```javascript + // onSuccess Callback // This method accepts a Position object, which contains the // current GPS coordinates @@ -142,6 +157,13 @@ error, the `geolocationError` callback is passed a navigator.geolocation.getCurrentPosition(onSuccess, onError); +``` + +### Android Quirks + +If Geolocation service is turned off the `onError` callback is invoked after `timeout` interval (if specified). +If `timeout` parameter is not specified then no callback is called. + ## navigator.geolocation.watchPosition Returns the device's current position when a change in position is detected. @@ -168,6 +190,8 @@ there is an error, the `geolocationError` callback executes with a ### Example +```javascript + // onSuccess Callback // This method accepts a `Position` object, which contains // the current GPS coordinates @@ -190,6 +214,7 @@ there is an error, the `geolocationError` callback executes with a // var watchID = navigator.geolocation.watchPosition(onSuccess, onError, { timeout: 30000 }); +``` ## geolocationOptions @@ -208,7 +233,8 @@ Optional parameters to customize the retrieval of the geolocation ### Android Quirks -Android 2.x emulators do not return a geolocation result unless the `enableHighAccuracy` option is set to `true`. +If Geolocation service is turned off the `onError` callback is invoked after `timeout` interval (if specified). +If `timeout` parameter is not specified then no callback is called. ## navigator.geolocation.clearWatch @@ -223,6 +249,8 @@ Stop watching for changes to the device's location referenced by the ### Example +```javascript + // Options: watch for changes in position, and use the most // accurate position acquisition method available. // @@ -232,6 +260,8 @@ Stop watching for changes to the device's location referenced by the navigator.geolocation.clearWatch(watchID); +``` + ## Position Contains `Position` coordinates and timestamp, created by the geolocation API. @@ -240,7 +270,7 @@ Contains `Position` coordinates and timestamp, created by the geolocation API. - __coords__: A set of geographic coordinates. _(Coordinates)_ -- __timestamp__: Creation timestamp for `coords`. _(Date)_ +- __timestamp__: Creation timestamp for `coords`. _(DOMTimeStamp)_ ## Coordinates @@ -291,3 +321,438 @@ callback function when an error occurs with navigator.geolocation. - Returned when the device is unable to retrieve a position. In general, this means the device is not connected to a network or can't get a satellite fix. - `PositionError.TIMEOUT` - Returned when the device is unable to retrieve a position within the time specified by the `timeout` included in `geolocationOptions`. When used with `navigator.geolocation.watchPosition`, this error could be repeatedly passed to the `geolocationError` callback every `timeout` milliseconds. + + +## <a id="sample"></a>Sample: Get the weather, find stores, and see photos of things nearby with Geolocation ## + +Use this plugin to help users find things near them such as Groupon deals, houses for sale, movies playing, sports and entertainment events and more. + +Here's a "cookbook" of ideas to get you started. In the snippets below, we'll show you some basic ways to add these features to your app. + +* [Get your coordinates](#coords). +* [Get the weather forecast](#weather). +* [Receive updated weather forecasts as you drive around](#receive). +* [See where you are on a map](#see). +* [Find stores near you](#find). +* [See pictures of things around you](#see). + +## <a id="coord"></a>Get your geolocation coordinates + +```javascript + +function getWeatherLocation() { + + navigator.geolocation.getCurrentPosition + (onWeatherSuccess, onWeatherError, { enableHighAccuracy: true }); +} + +``` +## <a id="weather"></a>Get the weather forecast + +```javascript + +// Success callback for get geo coordinates + +var onWeatherSuccess = function (position) { + + Latitude = position.coords.latitude; + Longitude = position.coords.longitude; + + getWeather(Latitude, Longitude); +} + +// Get weather by using coordinates + +function getWeather(latitude, longitude) { + + // Get a free key at http://openweathermap.org/. Replace the "Your_Key_Here" string with that key. + var OpenWeatherAppKey = "Your_Key_Here"; + + var queryString = + 'http://api.openweathermap.org/data/2.5/weather?lat=' + + latitude + '&lon=' + longitude + '&appid=' + OpenWeatherAppKey + '&units=imperial'; + + $.getJSON(queryString, function (results) { + + if (results.weather.length) { + + $.getJSON(queryString, function (results) { + + if (results.weather.length) { + + $('#description').text(results.name); + $('#temp').text(results.main.temp); + $('#wind').text(results.wind.speed); + $('#humidity').text(results.main.humidity); + $('#visibility').text(results.weather[0].main); + + var sunriseDate = new Date(results.sys.sunrise); + $('#sunrise').text(sunriseDate.toLocaleTimeString()); + + var sunsetDate = new Date(results.sys.sunrise); + $('#sunset').text(sunsetDate.toLocaleTimeString()); + } + + }); + } + }).fail(function () { + console.log("error getting location"); + }); +} + +// Error callback + +function onWeatherError(error) { + console.log('code: ' + error.code + '\n' + + 'message: ' + error.message + '\n'); +} + +``` + +## <a id="receive"></a>Receive updated weather forecasts as you drive around + +```javascript + +// Watch your changing position + +function watchWeatherPosition() { + + return navigator.geolocation.watchPosition + (onWeatherWatchSuccess, onWeatherError, { enableHighAccuracy: true }); +} + +// Success callback for watching your changing position + +var onWeatherWatchSuccess = function (position) { + + var updatedLatitude = position.coords.latitude; + var updatedLongitude = position.coords.longitude; + + if (updatedLatitude != Latitude && updatedLongitude != Longitude) { + + Latitude = updatedLatitude; + Longitude = updatedLongitude; + + // Calls function we defined earlier. + getWeather(updatedLatitude, updatedLongitude); + } +} + +``` + +## <a id="see"></a>See where you are on a map + +Both Bing and Google have map services. We'll use Google's. You'll need a key but it's free if you're just trying things out. + +Add a reference to the **maps** service. + +```HTML + + <script src="https://maps.googleapis.com/maps/api/js?key=Your_API_Key"></script> + +``` +Then, add code to use it. + +```javascript + +var Latitude = undefined; +var Longitude = undefined; + +// Get geo coordinates + +function getMapLocation() { + + navigator.geolocation.getCurrentPosition + (onMapSuccess, onMapError, { enableHighAccuracy: true }); +} + +// Success callback for get geo coordinates + +var onMapSuccess = function (position) { + + Latitude = position.coords.latitude; + Longitude = position.coords.longitude; + + getMap(Latitude, Longitude); + +} + +// Get map by using coordinates + +function getMap(latitude, longitude) { + + var mapOptions = { + center: new google.maps.LatLng(0, 0), + zoom: 1, + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + + map = new google.maps.Map + (document.getElementById("map"), mapOptions); + + + var latLong = new google.maps.LatLng(latitude, longitude); + + var marker = new google.maps.Marker({ + position: latLong + }); + + marker.setMap(map); + map.setZoom(15); + map.setCenter(marker.getPosition()); +} + +// Success callback for watching your changing position + +var onMapWatchSuccess = function (position) { + + var updatedLatitude = position.coords.latitude; + var updatedLongitude = position.coords.longitude; + + if (updatedLatitude != Latitude && updatedLongitude != Longitude) { + + Latitude = updatedLatitude; + Longitude = updatedLongitude; + + getMap(updatedLatitude, updatedLongitude); + } +} + +// Error callback + +function onMapError(error) { + console.log('code: ' + error.code + '\n' + + 'message: ' + error.message + '\n'); +} + +// Watch your changing position + +function watchMapPosition() { + + return navigator.geolocation.watchPosition + (onMapWatchSuccess, onMapError, { enableHighAccuracy: true }); +} + +``` + +## <a id="find"></a>Find stores near you + +You can use the same Google key for this. + +Add a reference to the **places** service. + +```HTML + +<script src= +"https://maps.googleapis.com/maps/api/js?key=Your_API_Key&libraries=places"> +</script> + +``` + +Then, add code to use it. + +```javascript + +var Map; +var Infowindow; +var Latitude = undefined; +var Longitude = undefined; + +// Get geo coordinates + +function getPlacesLocation() { + navigator.geolocation.getCurrentPosition + (onPlacesSuccess, onPlacesError, { enableHighAccuracy: true }); +} + +// Success callback for get geo coordinates + +var onPlacesSuccess = function (position) { + + Latitude = position.coords.latitude; + Longitude = position.coords.longitude; + + getPlaces(Latitude, Longitude); + +} + +// Get places by using coordinates + +function getPlaces(latitude, longitude) { + + var latLong = new google.maps.LatLng(latitude, longitude); + + var mapOptions = { + + center: new google.maps.LatLng(latitude, longitude), + zoom: 15, + mapTypeId: google.maps.MapTypeId.ROADMAP + + }; + + Map = new google.maps.Map(document.getElementById("places"), mapOptions); + + Infowindow = new google.maps.InfoWindow(); + + var service = new google.maps.places.PlacesService(Map); + service.nearbySearch({ + + location: latLong, + radius: 500, + type: ['store'] + }, foundStoresCallback); + +} + +// Success callback for watching your changing position + +var onPlacesWatchSuccess = function (position) { + + var updatedLatitude = position.coords.latitude; + var updatedLongitude = position.coords.longitude; + + if (updatedLatitude != Latitude && updatedLongitude != Longitude) { + + Latitude = updatedLatitude; + Longitude = updatedLongitude; + + getPlaces(updatedLatitude, updatedLongitude); + } +} + +// Success callback for locating stores in the area + +function foundStoresCallback(results, status) { + + if (status === google.maps.places.PlacesServiceStatus.OK) { + + for (var i = 0; i < results.length; i++) { + + createMarker(results[i]); + + } + } +} + +// Place a pin for each store on the map + +function createMarker(place) { + + var placeLoc = place.geometry.location; + + var marker = new google.maps.Marker({ + map: Map, + position: place.geometry.location + }); + + google.maps.event.addListener(marker, 'click', function () { + + Infowindow.setContent(place.name); + Infowindow.open(Map, this); + + }); +} + +// Error callback + +function onPlacesError(error) { + console.log('code: ' + error.code + '\n' + + 'message: ' + error.message + '\n'); +} + +// Watch your changing position + +function watchPlacesPosition() { + + return navigator.geolocation.watchPosition + (onPlacesWatchSuccess, onPlacesError, { enableHighAccuracy: true }); +} + +``` + +## <a id="pictures"></a>See pictures of things around you + +Digital photos can contain geo coordinates that identify where the picture was taken. + +Use Flickr API's to find pictures that folks have taken near you. Like Google services, you'll need a key, but it's free if you just want to try things out. + +```javascript + +var Latitude = undefined; +var Longitude = undefined; + +// Get geo coordinates + +function getPicturesLocation() { + + navigator.geolocation.getCurrentPosition + (onPicturesSuccess, onPicturesError, { enableHighAccuracy: true }); + +} + +// Success callback for get geo coordinates + +var onPicturesSuccess = function (position) { + + Latitude = position.coords.latitude; + Longitude = position.coords.longitude; + + getPictures(Latitude, Longitude); +} + +// Get pictures by using coordinates + +function getPictures(latitude, longitude) { + + $('#pictures').empty(); + + var queryString = + "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=Your_API_Key&lat=" + + latitude + "&lon=" + longitude + "&format=json&jsoncallback=?"; + + $.getJSON(queryString, function (results) { + $.each(results.photos.photo, function (index, item) { + + var photoURL = "http://farm" + item.farm + ".static.flickr.com/" + + item.server + "/" + item.id + "_" + item.secret + "_m.jpg"; + + $('#pictures').append($("<img />").attr("src", photoURL)); + + }); + } + ); +} + +// Success callback for watching your changing position + +var onPicturesWatchSuccess = function (position) { + + var updatedLatitude = position.coords.latitude; + var updatedLongitude = position.coords.longitude; + + if (updatedLatitude != Latitude && updatedLongitude != Longitude) { + + Latitude = updatedLatitude; + Longitude = updatedLongitude; + + getPictures(updatedLatitude, updatedLongitude); + } +} + +// Error callback + +function onPicturesError(error) { + + console.log('code: ' + error.code + '\n' + + 'message: ' + error.message + '\n'); +} + +// Watch your changing position + +function watchPicturePosition() { + + return navigator.geolocation.watchPosition + (onPicturesWatchSuccess, onPicturesError, { enableHighAccuracy: true }); +} + +``` diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-geolocation/RELEASENOTES.md index 197b28e5..f622086b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/RELEASENOTES.md @@ -20,110 +20,152 @@ --> # Release Notes -### 0.3.0 (Sept 5, 2013) -* Added support for windows 8 (Adds required permission) +### 2.4.0 (Sep 26, 2016) +* **Ubuntu** Fix altitude & accuracies retrieval +* [CB-11875](https://issues.apache.org/jira/browse/CB-11875) added `android.hardware.location.gps` `uses-feature`. -### 0.3.2 (Sept 25, 2013) -* CB-4889 bumping&resetting version -* [BlackBerry10] removed uneeded permission tags in plugin.xml -* CB-4889 renaming org.apache.cordova.core.geolocation to org.apache.cordova.geolocation +### 2.3.0 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* Plugin uses `Android Log class` and not `Cordova LOG class` +* Add badges for paramedic builds on Jenkins +* Add pull request template. +* Adding links to reference content and sample content to the top of the readme file +* Update **iOS** geolocation plugin to avoid `THREAD WARNING: ['Geolocation']`, operation occurs in new Thread +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md -### 0.3.3 (Oct 28, 2013) -* CB-5128: add repo + issue tag to plugin.xml for geolocation plugin -* [CB-4915] Incremented plugin version on dev branch. +### 2.2.0 (Apr 15, 2016) +* Replace `PermissionHelper.java` with `cordova-plugin-compat` +* [CB-10691](https://issues.apache.org/jira/browse/CB-10691) Check the context to avoid null errors +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add `JSHint` for plugins +* Using a fallback epsilon in case `Number.EPSILON` is not defined. +* [CB-10574](https://issues.apache.org/jira/browse/CB-10574) MobileSpec can't get results for **WP8.1** Builds -### 0.3.4 (Dec 4, 2013) -* Append proxy to platform definition in plugin.xml -* Append windows 8 Geolocation proxy -* Code clean-up for android src. -* Updated amazon-fireos platform + reverting some of the fixes in android code. -* Added amazon-fireos platform + some of the fixes in android code. -* CB-5334 [BlackBerry10] Use command proxy -* call FxOS's getCurrentProxy added -* pass by only coords -* proper implementation for firefoxos - -### 0.3.5 (Jan 02, 2014) -* CB-5658 Add doc/index.md for Geolocation plugin -* windows8: adds missing reference to PositionError (w/o it the app crashes) -* Removing incorrectly added closing comments for wp7 platform in plugin.xml +### 2.1.0 (Jan 15, 2016) +* [CB-10319](https://issues.apache.org/jira/browse/CB-10319) **Android** Adding reflective helper methods for permission requests +* [CB-8523](https://issues.apache.org/jira/browse/CB-8523) Fixed accuracy when `enableHighAccuracy: false` on **iOS**. +* [CB-10286](https://issues.apache.org/jira/browse/CB-10286) Don't skip automatic tests on **Android** devices +* [CB-10277](https://issues.apache.org/jira/browse/CB-10277) Error callback should be called w/ `PositionError` when location access is denied +* [CB-10285](https://issues.apache.org/jira/browse/CB-10285) Added tests for `PositionError` constants +* [CB-10278](https://issues.apache.org/jira/browse/CB-10278) geolocation `watchPosition` doesn't return `watchID` string +* [CB-8443](https://issues.apache.org/jira/browse/CB-8443) **Android** nothing happens if `GPS` is turned off +* [CB-10204](https://issues.apache.org/jira/browse/CB-10204) Fix `getCurrentPosition` options on **Android** +* [CB-7146](https://issues.apache.org/jira/browse/CB-7146) Remove built-in `WebView navigator.geolocation` manual tests +* [CB-2845](https://issues.apache.org/jira/browse/CB-2845) `PositionError` constants not attached to prototype as specified in W3C document -### 0.3.6 (Feb 05, 2014) -* add ubuntu platform support -* CB-5326 adding FFOS permission and updating supported platforms -* CB-5729 [BlackBerry10] Update GeolocationProxy to return collapsed object +### 2.0.0 (Nov 18, 2015) +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest +* [CB-9907](https://issues.apache.org/jira/browse/CB-9907) Handle **iOS** tests that fail when ios simulator does not have a location +* [CB-8826](https://issues.apache.org/jira/browse/CB-8826) Check for `NSLocationWhenInUseUsageDescription` first +* [CB-9105](https://issues.apache.org/jira/browse/CB-9105): Fixing `JS` errors in the shim +* Added support for new permissions model for **Android 6.0** aka **Marshmallow** +* Expect `lastPosition` to have a `timestamp` that is already in `msecs` +* [CB-4596](https://issues.apache.org/jira/browse/CB-4596) Date objects are supposed to be `DOMTimeStamp` +* Fixing contribute link. +* [CB-9355](https://issues.apache.org/jira/browse/CB-9355) Fix Geolocation plugin start watch fail related to unset `MovementThreshold` on **Windows 10** -### 0.3.7 (Apr 17, 2014) -* CB-6422: [windows8] use cordova/exec/proxy -* CB-6212: [iOS] fix warnings compiled under arm64 64-bit -* CB-5977: [android] Removing the Android Geolocation Code. Mission Accomplished. -* CB-6460: Update license headers -* Add NOTICE file +### 1.0.1 (Jun 17, 2015) +* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-geolocation documentation translation: cordova-plugin-geolocation +* fix npm md issue +* [CB-8845](https://issues.apache.org/jira/browse/CB-8845) Updated comment why Android tests are currently pended +* [CB-8845](https://issues.apache.org/jira/browse/CB-8845) Pended tests for Android +* Add more install text for legacy versions of cordova tools. This closes #36 -### 0.3.8 (Jun 05, 2014) -* CB-6127 Spanish and French Translations added. Github close #14 -* CB-6804 Add license -* CB-5416 - Adding support for auto-managing permissions -* CB-6491 add CONTRIBUTING.md -* pass by only coords -* proper implementation for firefoxos -* call FxOS's getCurrentProxy added +### 1.0.0 (Apr 15, 2015) +* [CB-8746](https://issues.apache.org/jira/browse/CB-8746) gave plugin major version bump +* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) changed plugin-id to pacakge-name +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) properly updated translated docs to use new id +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) updated translated docs to use new id +* Use TRAVIS_BUILD_DIR, install paramedic by npm +* [CB-8681](https://issues.apache.org/jira/browse/CB-8681) Fixed occasional test failures +* docs: added Windows to supported platforms +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) Updated Readme +* [CB-8659](https://issues.apache.org/jira/browse/CB-8659): ios: 4.0.x Compatibility: Remove use of initWebView method +* [CB-8659](https://issues.apache.org/jira/browse/CB-8659): ios: 4.0.x Compatibility: Remove use of deprecated headers +* Wrong parameter in Firefox OS plugin +* [CB-8568](https://issues.apache.org/jira/browse/CB-8568) Integrate TravisCI +* [CB-8438](https://issues.apache.org/jira/browse/CB-8438) cordova-plugin-geolocation documentation translation: cordova-plugin-geolocation +* [CB-8538](https://issues.apache.org/jira/browse/CB-8538) Added package.json file +* [CB-8443](https://issues.apache.org/jira/browse/CB-8443) Geolocation tests fail on Windows due to done is called multiple times -### 0.3.9 (Aug 06, 2014) -* **FFOS** update GeolocationProxy.js -* CB-7187 ios: Add explicit dependency on CoreLocation.framework -* CB-7187 Delete unused #import of CDVShared.h -* CB-6127 Updated translations for docs -* ios: Changed distanceFilter from none to 5 meters, prevents it from spamming the callback even though nothing changed. +### 0.3.12 (Feb 04, 2015) +* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) ios: Use argumentForIndex rather than NSArray extension +### 0.3.11 (Dec 02, 2014) +* Do not stop updating location when the error is `kCLErrorLocationUnknown` +* [CB-8094](https://issues.apache.org/jira/browse/CB-8094) Pended auto tests for **Windows** Store since they require user interaction +* [CB-8085](https://issues.apache.org/jira/browse/CB-8085) Fix geolocation plugin on **Windows** +* [CB-7977](https://issues.apache.org/jira/browse/CB-7977) Mention `deviceready` in plugin docs +* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-geolocation documentation translation: cordova-plugin-geolocation ### 0.3.10 (Sep 17, 2014) -* CB-7556 iOS: Clearing all Watches does not stop Location Services -* CB-7158 Fix geolocation for ios 8 -* Revert CB-6911 partially (keeping Info.plist key installation for iOS 8) -* CB-6911 Geolocation fails in iOS 8 -* CB-5114 Windows 8.1 - Use a new proxy as old geolocation methods is deprecated -* CB-5114 Append Windows 8.1 into plugin.xml + Optimize Windows 8 Geolocation proxy +* [CB-7556](https://issues.apache.org/jira/browse/CB-7556) iOS: Clearing all Watches does not stop Location Services +* [CB-7158](https://issues.apache.org/jira/browse/CB-7158) Fix geolocation for ios 8 +* Revert [CB-6911](https://issues.apache.org/jira/browse/CB-6911) partially (keeping Info.plist key installation for iOS 8) +* [CB-6911](https://issues.apache.org/jira/browse/CB-6911) Geolocation fails in iOS 8 +* [CB-5114](https://issues.apache.org/jira/browse/CB-5114) Windows 8.1 - Use a new proxy as old geolocation methods is deprecated +* [CB-5114](https://issues.apache.org/jira/browse/CB-5114) Append Windows 8.1 into plugin.xml + Optimize Windows 8 Geolocation proxy * Renamed test dir, added nested plugin.xml * added documentation for manual tests -* CB-7146 Added manual tests +* [CB-7146](https://issues.apache.org/jira/browse/CB-7146) Added manual tests * Removed js-module for tests from plugin.xml * Changing cdvtest format to use module exports * register tests using new style * Convert tests to new style * Removed amazon-fireos code for geolocation. -* CB-7571 Bump version of nested plugin to match parent plugin +* [CB-7571](https://issues.apache.org/jira/browse/CB-7571) Bump version of nested plugin to match parent plugin -### 0.3.11 (Dec 02, 2014) -* Do not stop updating location when the error is `kCLErrorLocationUnknown` -* CB-8094 Pended auto tests for **Windows** Store since they require user interaction -* CB-8085 Fix geolocation plugin on **Windows** -* CB-7977 Mention `deviceready` in plugin docs -* CB-7700 cordova-plugin-geolocation documentation translation: cordova-plugin-geolocation +### 0.3.9 (Aug 06, 2014) +* **FFOS** update GeolocationProxy.js +* [CB-7187](https://issues.apache.org/jira/browse/CB-7187) ios: Add explicit dependency on CoreLocation.framework +* [CB-7187](https://issues.apache.org/jira/browse/CB-7187) Delete unused #import of CDVShared.h +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Updated translations for docs +* ios: Changed distanceFilter from none to 5 meters, prevents it from spamming the callback even though nothing changed. -### 0.3.12 (Feb 04, 2015) -* CB-8351 ios: Use argumentForIndex rather than NSArray extension +### 0.3.8 (Jun 05, 2014) +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Spanish and French Translations added. Github close #14 +* [CB-6804](https://issues.apache.org/jira/browse/CB-6804) Add license +* [CB-5416](https://issues.apache.org/jira/browse/CB-5416) - Adding support for auto-managing permissions +* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md +* pass by only coords +* proper implementation for firefoxos +* call FxOS's getCurrentProxy added -### 1.0.0 (Apr 15, 2015) -* CB-8746 gave plugin major version bump -* CB-8683 changed plugin-id to pacakge-name -* CB-8653 properly updated translated docs to use new id -* CB-8653 updated translated docs to use new id -* Use TRAVIS_BUILD_DIR, install paramedic by npm -* CB-8681 Fixed occasional test failures -* docs: added Windows to supported platforms -* CB-8653 Updated Readme -* CB-8659: ios: 4.0.x Compatibility: Remove use of initWebView method -* CB-8659: ios: 4.0.x Compatibility: Remove use of deprecated headers -* Wrong parameter in Firefox OS plugin -* CB-8568 Integrate TravisCI -* CB-8438 cordova-plugin-geolocation documentation translation: cordova-plugin-geolocation -* CB-8538 Added package.json file -* CB-8443 Geolocation tests fail on Windows due to done is called multiple times +### 0.3.7 (Apr 17, 2014) +* [CB-6422](https://issues.apache.org/jira/browse/CB-6422): [windows8] use cordova/exec/proxy +* [CB-6212](https://issues.apache.org/jira/browse/CB-6212): [iOS] fix warnings compiled under arm64 64-bit +* [CB-5977](https://issues.apache.org/jira/browse/CB-5977): [android] Removing the Android Geolocation Code. Mission Accomplished. +* [CB-6460](https://issues.apache.org/jira/browse/CB-6460): Update license headers +* Add NOTICE file -### 1.0.1 (Jun 17, 2015) -* CB-9128 cordova-plugin-geolocation documentation translation: cordova-plugin-geolocation -* fix npm md issue -* CB-8845 Updated comment why Android tests are currently pended -* CB-8845 Pended tests for Android -* Add more install text for legacy versions of cordova tools. This closes #36 +### 0.3.6 (Feb 05, 2014) +* add ubuntu platform support +* [CB-5326](https://issues.apache.org/jira/browse/CB-5326) adding FFOS permission and updating supported platforms +* [CB-5729](https://issues.apache.org/jira/browse/CB-5729) [BlackBerry10] Update GeolocationProxy to return collapsed object + +### 0.3.5 (Jan 02, 2014) +* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Add doc/index.md for Geolocation plugin +* windows8: adds missing reference to PositionError (w/o it the app crashes) +* Removing incorrectly added closing comments for wp7 platform in plugin.xml + +### 0.3.4 (Dec 4, 2013) +* Append proxy to platform definition in plugin.xml +* Append windows 8 Geolocation proxy +* Code clean-up for android src. +* Updated amazon-fireos platform + reverting some of the fixes in android code. +* Added amazon-fireos platform + some of the fixes in android code. +* [CB-5334](https://issues.apache.org/jira/browse/CB-5334) [BlackBerry10] Use command proxy +* call FxOS's getCurrentProxy added +* pass by only coords +* proper implementation for firefoxos + +### 0.3.3 (Oct 28, 2013) +* [CB-5128](https://issues.apache.org/jira/browse/CB-5128): add repo + issue tag to plugin.xml for geolocation plugin +* [CB-4915](https://issues.apache.org/jira/browse/CB-4915) Incremented plugin version on dev branch. + +### 0.3.2 (Sept 25, 2013) +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) bumping&resetting version +* [BlackBerry10] removed uneeded permission tags in plugin.xml +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming org.apache.cordova.core.geolocation to org.apache.cordova.geolocation + +### 0.3.0 (Sept 5, 2013) +* Added support for windows 8 (Adds required permission) diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/README.md index 9cf693e5..17e14a53 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/README.md @@ -218,7 +218,7 @@ Enthält `Position` koordinaten und Timestamp, erstellt von der Geolocation API. * **coords**: eine Reihe von geographischen Koordinaten. *(Coordinates)* - * **timestamp**: Zeitstempel der Erstellung für `coords` . *(Date)* + * **timestamp**: Zeitstempel der Erstellung für `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/index.md index 3fe4e4a8..92b2079b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/de/index.md @@ -205,7 +205,7 @@ Enthält `Position` koordinaten und Timestamp, erstellt von der Geolocation API. * **coords**: eine Reihe von geographischen Koordinaten. *(Coordinates)* -* **timestamp**: Zeitstempel der Erstellung für `coords` . *(Date)* +* **timestamp**: Zeitstempel der Erstellung für `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/README.md index 1a4bf006..7808a0e3 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/README.md @@ -216,7 +216,7 @@ Contiene `Position` coordenadas y timestamp, creado por la API de geolocalizacià * **coordenadas**: un conjunto de coordenadas geográficas. *(Coordenadas)* - * **timestamp**: fecha y hora de creación `coords` . *(Fecha)* + * **timestamp**: fecha y hora de creación `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/index.md index 043e9294..041f3f82 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/es/index.md @@ -164,7 +164,7 @@ Contiene `Position` coordenadas y timestamp, creado por la API de geolocalizacià * **coordenadas**: un conjunto de coordenadas geográficas. *(Coordenadas)* -* **timestamp**: fecha y hora de creación `coords` . *(Fecha)* +* **timestamp**: fecha y hora de creación `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/README.md index f9865dc6..775a487f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/README.md @@ -177,7 +177,7 @@ Contient `Position` coordonnées et timestamp, créé par l'API de géolocalisat * **coords** : un ensemble de coordonnées géographiques. *(Coordinates)* - * **timestamp** : horodatage de la création de `coords`. *(Date)* + * **timestamp** : horodatage de la création de `coords`. *(DOMTimeStamp)* ## Coordonnées diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/index.md index bea18ddc..4d486375 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/fr/index.md @@ -164,7 +164,7 @@ Contient `Position` coordonnées et timestamp, créé par l'API de géolocalisat * **coords** : un ensemble de coordonnées géographiques. *(Coordinates)* -* **timestamp** : horodatage de la création de `coords`. *(Date)* +* **timestamp** : horodatage de la création de `coords`. *(DOMTimeStamp)* ## Coordonnées diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/README.md index 8eb44be9..ffa472b3 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/README.md @@ -218,7 +218,7 @@ Contiene le coordinate della `Position` e timestamp, creato da geolocation API. * **CoOrds**: un insieme di coordinate geografiche. *(Coordinate)* - * **timestamp**: timestamp di creazione per `coords` . *(Data)* + * **timestamp**: timestamp di creazione per `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/index.md index 41412a07..7ba7c5c6 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/it/index.md @@ -205,7 +205,7 @@ Contiene le coordinate della `Position` e timestamp, creato da geolocation API. * **CoOrds**: un insieme di coordinate geografiche. *(Coordinate)* -* **timestamp**: timestamp di creazione per `coords` . *(Data)* +* **timestamp**: timestamp di creazione per `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/README.md index a519d2c2..59c5ed6c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/README.md @@ -218,7 +218,7 @@ * **coords**: 地ç†çš„座標ã®ã‚»ãƒƒãƒˆã€‚*(座標)* - * **timestamp**: 作æˆã®ã‚¿ã‚¤ãƒ スタンプを `coords` 。*(日)* + * **timestamp**: 作æˆã®ã‚¿ã‚¤ãƒ スタンプを `coords` 。*(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/index.md index 3a8b73a5..3a8b73a5 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ja/index.md diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/README.md index 1c032293..dab50057 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/README.md @@ -218,7 +218,7 @@ * **coords**: 지리ì 좌표 ì§‘í•©. *(좌표)* - * **timestamp**: ìƒì„± 타임 ìŠ¤íƒ¬í”„ì— ëŒ€ 한 `coords` . *(ë‚ ì§œ)* + * **timestamp**: ìƒì„± 타임 ìŠ¤íƒ¬í”„ì— ëŒ€ 한 `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/index.md index 2a3e7349..19f47c72 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ko/index.md @@ -205,7 +205,7 @@ * **coords**: 지리ì 좌표 ì§‘í•©. *(좌표)* -* **timestamp**: ìƒì„± 타임 ìŠ¤íƒ¬í”„ì— ëŒ€ 한 `coords` . *(ë‚ ì§œ)* +* **timestamp**: ìƒì„± 타임 ìŠ¤íƒ¬í”„ì— ëŒ€ 한 `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/README.md index 8d6717fd..0ef35c4e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/README.md @@ -218,7 +218,7 @@ Zawiera współrzÄ™dne `Position` i sygnatury czasowej, stworzony przez geolocat * **coords**: zestaw współrzÄ™dnych geograficznych. *(WspółrzÄ™dne)* - * **timestamp**: Sygnatura czasowa utworzenia dla `coords` . *(Data)* + * **timestamp**: Sygnatura czasowa utworzenia dla `coords` . *(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/index.md index 6d08320e..6d08320e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/pl/index.md diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ru/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ru/index.md index 3d9c766e..3d9c766e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/ru/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/ru/index.md diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/README.md index 1ad9931e..b2afea51 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/README.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/README.md @@ -218,7 +218,7 @@ Android 2.x 模擬器ä¸é™¤éž `enableHighAccuracy` é¸é …è¨ç½®ç‚º `true`ï¼Œå¦ * **coords**: 一組的地ç†åº§æ¨™ã€‚*(座標)* - * **timestamp**: 創建時間戳記為 `coords` 。*(日期)* + * **timestamp**: 創建時間戳記為 `coords` 。*(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/index.md b/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/index.md index d6d831e7..c78a9f79 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/index.md +++ b/StoneIsland/plugins/cordova-plugin-geolocation/doc/zh/index.md @@ -205,7 +205,7 @@ Android 2.x 模擬器ä¸é™¤éž `enableHighAccuracy` é¸é …è¨ç½®ç‚º `true`ï¼Œå¦ * **coords**: 一組的地ç†åº§æ¨™ã€‚*(座標)* -* **timestamp**: 創建時間戳記為 `coords` 。*(日期)* +* **timestamp**: 創建時間戳記為 `coords` 。*(DOMTimeStamp)* ## Coordinates diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/package.json b/StoneIsland/plugins/cordova-plugin-geolocation/package.json index dee3543b..a043d278 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/package.json +++ b/StoneIsland/plugins/cordova-plugin-geolocation/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-geolocation", - "version": "1.0.1", + "version": "2.4.0", "description": "Cordova Geolocation Plugin", "cordova": { "id": "cordova-plugin-geolocation", @@ -36,6 +36,20 @@ "cordova-windows", "cordova-firefoxos" ], + "scripts": { + "test": "npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests" + }, "author": "Apache Software Foundation", - "license": "Apache 2.0" + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + }, + "devDependencies": { + "jshint": "^2.6.0" + } } diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/plugin.xml b/StoneIsland/plugins/cordova-plugin-geolocation/plugin.xml index 4c0a41d1..48abcafc 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-geolocation/plugin.xml @@ -22,7 +22,7 @@ xmlns:rim="http://www.blackberry.com/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-geolocation" - version="1.0.1"> + version="2.4.0"> <name>Geolocation</name> <description>Cordova Geolocation Plugin</description> @@ -31,14 +31,34 @@ xmlns:android="http://schemas.android.com/apk/res/android" <repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git</repo> <issue>https://issues.apache.org/jira/browse/CB/component/12320638</issue> + <dependency id="cordova-plugin-compat" version="^1.0.0" /> + <!-- android --> <platform name="android"> <config-file target="AndroidManifest.xml" parent="/*"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-feature android:name="android.hardware.location.gps" /> + </config-file> + + <config-file target="res/xml/config.xml" parent="/*"> + <feature name="Geolocation"> + <param name="android-package" value="org.apache.cordova.geolocation.Geolocation" /> + </feature> </config-file> + <source-file src="src/android/Geolocation.java" target-dir="src/org/apache/cordova/geolocation/" /> + + <js-module src="www/android/geolocation.js" name="geolocation"> + <clobbers target="navigator.geolocation" /> + </js-module> + + <!-- We don't expose PositionError via clobber on Android as we use it internally only --> + <js-module src="www/PositionError.js" name="PositionError"> + <runs /> + </js-module> + </platform> <!-- amazon-fireos --> @@ -48,9 +68,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </config-file> - + </platform> - + <!-- ios --> <platform name="ios"> @@ -71,18 +91,18 @@ xmlns:android="http://schemas.android.com/apk/res/android" </js-module> <config-file target="config.xml" parent="/*"> - <feature name="Geolocation"> - <param name="ios-package" value="CDVLocation"/> - </feature> + <feature name="Geolocation"> + <param name="ios-package" value="CDVLocation"/> + </feature> </config-file> <header-file src="src/ios/CDVLocation.h" /> <source-file src="src/ios/CDVLocation.m" /> <framework src="CoreLocation.framework" /> - + <config-file target="*-Info.plist" parent="NSLocationWhenInUseUsageDescription"> <string></string> </config-file> - + </platform> <!-- blackberry10 --> @@ -218,7 +238,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" <clobbers target="navigator.geolocation" /> </js-module> </platform> - + <!-- firefoxos --> <platform name="firefoxos"> <config-file target="config.xml" parent="/*"> diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/android/Geolocation.java b/StoneIsland/plugins/cordova-plugin-geolocation/src/android/Geolocation.java new file mode 100644 index 00000000..6452170a --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/android/Geolocation.java @@ -0,0 +1,107 @@ +/* + 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. + */ + + +package org.apache.cordova.geolocation; + +import android.content.pm.PackageManager; +import android.Manifest; +import android.os.Build; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaArgs; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PermissionHelper; +import org.apache.cordova.PluginResult; +import org.apache.cordova.LOG; +import org.json.JSONArray; +import org.json.JSONException; + +import javax.security.auth.callback.Callback; + +public class Geolocation extends CordovaPlugin { + + String TAG = "GeolocationPlugin"; + CallbackContext context; + + String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; + + + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + LOG.d(TAG, "We are entering execute"); + context = callbackContext; + if(action.equals("getPermission")) + { + if(hasPermisssion()) + { + PluginResult r = new PluginResult(PluginResult.Status.OK); + context.sendPluginResult(r); + return true; + } + else { + PermissionHelper.requestPermissions(this, 0, permissions); + } + return true; + } + return false; + } + + + public void onRequestPermissionResult(int requestCode, String[] permissions, + int[] grantResults) throws JSONException + { + PluginResult result; + //This is important if we're using Cordova without using Cordova, but we have the geolocation plugin installed + if(context != null) { + for (int r : grantResults) { + if (r == PackageManager.PERMISSION_DENIED) { + LOG.d(TAG, "Permission Denied!"); + result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION); + context.sendPluginResult(result); + return; + } + + } + result = new PluginResult(PluginResult.Status.OK); + context.sendPluginResult(result); + } + } + + public boolean hasPermisssion() { + for(String p : permissions) + { + if(!PermissionHelper.hasPermission(this, p)) + { + return false; + } + } + return true; + } + + /* + * We override this so that we can access the permissions variable, which no longer exists in + * the parent class, since we can't initialize it reliably in the constructor! + */ + + public void requestPermissions(int requestCode) + { + PermissionHelper.requestPermissions(this, requestCode, permissions); + } + + + +} diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/firefoxos/GeolocationProxy.js b/StoneIsland/plugins/cordova-plugin-geolocation/src/firefoxos/GeolocationProxy.js index e4b40529..e4b40529 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/src/firefoxos/GeolocationProxy.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/firefoxos/GeolocationProxy.js diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.h b/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.h index cce2738f..cce2738f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.h +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.h diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.m b/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.m index 8b543c8e..e4b34a11 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.m +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/ios/CDVLocation.m @@ -122,17 +122,17 @@ NSUInteger code = [CLLocationManager authorizationStatus]; if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) { //iOS8+ __highAccuracyEnabled = enableHighAccuracy; - if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){ - [self.locationManager requestAlwaysAuthorization]; - } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) { - [self.locationManager requestWhenInUseAuthorization]; + if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]){ + [self.locationManager requestWhenInUseAuthorization]; + } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]) { + [self.locationManager requestAlwaysAuthorization]; } else { NSLog(@"[Warning] No NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription key is defined in the Info.plist file."); } return; } #endif - + // Tell the location manager to start notifying us of location updates. We // first stop, and then start the updating to ensure we get at least one // update, even if our location did not change. @@ -148,9 +148,8 @@ self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; } else { __highAccuracyEnabled = NO; - // TODO: Set distance filter to 10 meters? and desired accuracy to nearest ten meters? arbitrary. self.locationManager.distanceFilter = 10; - self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; + self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; } } @@ -193,35 +192,37 @@ - (void)getLocation:(CDVInvokedUrlCommand*)command { - NSString* callbackId = command.callbackId; - BOOL enableHighAccuracy = [[command argumentAtIndex:0] boolValue]; + [self.commandDelegate runInBackground:^{ + NSString* callbackId = command.callbackId; + BOOL enableHighAccuracy = [[command argumentAtIndex:0] boolValue]; - if ([self isLocationServicesEnabled] == NO) { - NSMutableDictionary* posError = [NSMutableDictionary dictionaryWithCapacity:2]; - [posError setObject:[NSNumber numberWithInt:PERMISSIONDENIED] forKey:@"code"]; - [posError setObject:@"Location services are disabled." forKey:@"message"]; - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:posError]; - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; - } else { - if (!self.locationData) { - self.locationData = [[CDVLocationData alloc] init]; - } - CDVLocationData* lData = self.locationData; - if (!lData.locationCallbacks) { - lData.locationCallbacks = [NSMutableArray arrayWithCapacity:1]; - } + if ([self isLocationServicesEnabled] == NO) { + NSMutableDictionary* posError = [NSMutableDictionary dictionaryWithCapacity:2]; + [posError setObject:[NSNumber numberWithInt:PERMISSIONDENIED] forKey:@"code"]; + [posError setObject:@"Location services are disabled." forKey:@"message"]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:posError]; + [self.commandDelegate sendPluginResult:result callbackId:callbackId]; + } else { + if (!self.locationData) { + self.locationData = [[CDVLocationData alloc] init]; + } + CDVLocationData* lData = self.locationData; + if (!lData.locationCallbacks) { + lData.locationCallbacks = [NSMutableArray arrayWithCapacity:1]; + } - if (!__locationStarted || (__highAccuracyEnabled != enableHighAccuracy)) { - // add the callbackId into the array so we can call back when get data - if (callbackId != nil) { - [lData.locationCallbacks addObject:callbackId]; + if (!__locationStarted || (__highAccuracyEnabled != enableHighAccuracy)) { + // add the callbackId into the array so we can call back when get data + if (callbackId != nil) { + [lData.locationCallbacks addObject:callbackId]; + } + // Tell the location manager to start notifying us of heading updates + [self startLocation:enableHighAccuracy]; + } else { + [self returnLocationInfo:callbackId andKeepCallback:NO]; } - // Tell the location manager to start notifying us of heading updates - [self startLocation:enableHighAccuracy]; - } else { - [self returnLocationInfo:callbackId andKeepCallback:NO]; } - } + }]; } - (void)addWatch:(CDVInvokedUrlCommand*)command diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.cpp b/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.cpp index c820cfef..3d40ab4c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.cpp +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.cpp @@ -1,6 +1,6 @@ /* * - * Copyright 2013 Canonical Ltd. + * Copyright 2013-2016 Canonical Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,11 +21,19 @@ #include "geolocation.h" -Geolocation::Geolocation(Cordova *cordova): CPlugin(cordova), - _geoPositionInfoSource(QGeoPositionInfoSource::createDefaultSource(this)) { +Geolocation::Geolocation(Cordova *cordova) + : CPlugin(cordova), + _geoPositionInfoSource(QGeoPositionInfoSource::createDefaultSource(this)) { if (_geoPositionInfoSource.data() != 0) { - QObject::connect(_geoPositionInfoSource.data(), SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo))); - QObject::connect(_geoPositionInfoSource.data(), SIGNAL(updateTimeout()), this, SLOT(updateTimeout())); + QObject::connect(_geoPositionInfoSource.data(), + SIGNAL(positionUpdated(QGeoPositionInfo)), + this, + SLOT(positionUpdated(QGeoPositionInfo))); + + QObject::connect(_geoPositionInfoSource.data(), + SIGNAL(updateTimeout()), + this, + SLOT(updateTimeout())); } } @@ -81,16 +89,22 @@ void Geolocation::positionUpdated(const QGeoPositionInfo &update) { p.insert("latitude", coordinate.latitude()); p.insert("longitude", coordinate.longitude()); - p.insert("altitude", coordinate.altitude()); - if (update.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) - p.insert("accuracy", update.attribute(QGeoPositionInfo::VerticalAccuracy)); + if (coordinate.type() == QGeoCoordinate::Coordinate3D) + p.insert("altitude", coordinate.altitude()); + + if (update.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + p.insert("accuracy", update.attribute(QGeoPositionInfo::HorizontalAccuracy)); + if (update.hasAttribute(QGeoPositionInfo::Direction)) p.insert("heading", update.attribute(QGeoPositionInfo::Direction)); + if (update.hasAttribute(QGeoPositionInfo::GroundSpeed)) p.insert("velocity", update.attribute(QGeoPositionInfo::GroundSpeed)); - if (update.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) - p.insert("altitudeAccuracy", update.attribute(QGeoPositionInfo::HorizontalAccuracy)); + + if (update.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) + p.insert("altitudeAccuracy", update.attribute(QGeoPositionInfo::VerticalAccuracy)); + p.insert("timestamp", update.timestamp().toMSecsSinceEpoch()); for (const QString &id: _id2sc.keys()) { diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.h b/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.h index 7345bec9..7345bec9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.h +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/ubuntu/geolocation.h diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/windows/GeolocationProxy.js b/StoneIsland/plugins/cordova-plugin-geolocation/src/windows/GeolocationProxy.js index 9cab6a4d..03ed4950 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/src/windows/GeolocationProxy.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/windows/GeolocationProxy.js @@ -14,27 +14,48 @@ * limitations under the License. */ -var PositionError = require('./PositionError'), - ids = {}, - loc; +/* global Windows, WinJS */ -function ensureLocator() { - if (loc == null) - loc = new Windows.Devices.Geolocation.Geolocator(); +var PositionError = require('./PositionError'); +var callbacks = {}; +var locs = {}; - return loc; +// constants +var FALLBACK_EPSILON = 0.001; + +function ensureAndCreateLocator() { + var deferral; + + var loc = new Windows.Devices.Geolocation.Geolocator(); + + if (typeof Windows.Devices.Geolocation.Geolocator.requestAccessAsync === 'function') { + deferral = Windows.Devices.Geolocation.Geolocator.requestAccessAsync().then(function (result) { + if (result === Windows.Devices.Geolocation.GeolocationAccessStatus.allowed) { + return loc; + } + + return WinJS.Promise.wrapError({ + code: PositionError.PERMISSION_DENIED, + message: 'Geolocation access has not been allowed by user.' + }); + }); + } else { + deferral = WinJS.Promise.wrap(loc); + } + + return deferral; } -function createErrorCode() { +function createErrorCode(loc) { switch (loc.locationStatus) { case Windows.Devices.Geolocation.PositionStatus.initializing: // This status indicates that a location device is still initializing case Windows.Devices.Geolocation.PositionStatus.noData: - // No location data is currently available + // No location data is currently available case Windows.Devices.Geolocation.PositionStatus.notInitialized: // This status indicates that the app has not yet requested - // location data by calling GetGeolocationAsync() or - // registering an event handler for the positionChanged event. + // location data by calling GetGeolocationAsync() or + // registering an event handler for the positionChanged event. case Windows.Devices.Geolocation.PositionStatus.notAvailable: // Location is not available on this version of Windows return PositionError.POSITION_UNAVAILABLE; @@ -55,8 +76,8 @@ function createResult(pos) { velocity: pos.coordinate.speed, altitudeAccuracy: pos.coordinate.altitudeAccuracy, timestamp: pos.coordinate.timestamp - } - + }; + if (pos.coordinate.point) { res.latitude = pos.coordinate.point.position.latitude; res.longitude = pos.coordinate.point.position.longitude; @@ -66,55 +87,54 @@ function createResult(pos) { res.longitude = pos.coordinate.longitude; res.altitude = pos.coordinate.altitude; } - + return res; } module.exports = { getLocation: function (success, fail, args, env) { - ensureLocator(); - if (loc != null) - { - var highAccuracy = args[0], - maxAge = args[1]; + ensureAndCreateLocator().done(function (loc) { + if (loc) { + var highAccuracy = args[0], + maxAge = args[1]; - loc.desiredAccuracy = highAccuracy ? - Windows.Devices.Geolocation.PositionAccuracy.high : - Windows.Devices.Geolocation.PositionAccuracy.default; + loc.desiredAccuracy = highAccuracy ? + Windows.Devices.Geolocation.PositionAccuracy.high : + Windows.Devices.Geolocation.PositionAccuracy.default; - loc.reportInterval = maxAge ? maxAge : 0; + loc.reportInterval = maxAge ? maxAge : 0; - loc.getGeopositionAsync().then( - function (pos) { - success(createResult(pos)); - }, - function (err) { - fail({ - code: createErrorCode(), - message: err.message - }); - } - ); - } - else - { - fail({ - code: PositionError.POSITION_UNAVAILABLE, - message: "You do not have the required location services present on your system." - }); - } + loc.getGeopositionAsync().then( + function (pos) { + success(createResult(pos)); + }, + function (err) { + fail({ + code: createErrorCode(loc), + message: err.message + }); + } + ); + } + else { + fail({ + code: PositionError.POSITION_UNAVAILABLE, + message: "You do not have the required location services present on your system." + }); + } + }, fail); }, addWatch: function (success, fail, args, env) { - ensureLocator(); - var clientId = args[0], - highAccuracy = args[1], + ensureAndCreateLocator().done(function (loc) { + var clientId = args[0]; + var highAccuracy = args[1]; - onPositionChanged = function (e) { - success(createResult(e.position), {keepCallback: true}); - }, + var onPositionChanged = function (e) { + success(createResult(e.position), { keepCallback: true }); + }; - onStatusChanged = function (e) { + var onStatusChanged = function (e) { switch (e.status) { case Windows.Devices.Geolocation.PositionStatus.noData: case Windows.Devices.Geolocation.PositionStatus.notAvailable: @@ -131,44 +151,52 @@ module.exports = { }); break; - case Windows.Devices.Geolocation.PositionStatus.initializing: - case Windows.Devices.Geolocation.PositionStatus.ready: + // case Windows.Devices.Geolocation.PositionStatus.initializing: + // case Windows.Devices.Geolocation.PositionStatus.ready: default: break; } }; - loc.desiredAccuracy = highAccuracy ? - Windows.Devices.Geolocation.PositionAccuracy.high : - Windows.Devices.Geolocation.PositionAccuracy.default; + loc.desiredAccuracy = highAccuracy ? + Windows.Devices.Geolocation.PositionAccuracy.high : + Windows.Devices.Geolocation.PositionAccuracy.default; - if (cordova.platformId == 'windows' && WinJS.Utilities.isPhone) { - // on Windows Phone 8.1 'positionchanged' event fails with error below if movementThreshold is not set - // JavaScript runtime error: Operation aborted - // You must set the MovementThreshold property or the ReportInterval property before adding event handlers. - // WinRT information: You must set the MovementThreshold property or the ReportInterval property before adding event handlers - loc.movementThreshold = loc.movementThreshold || 1; // 1 meter - } + if (cordova.platformId == 'windows') { + // 'positionchanged' event fails with error below if movementThreshold is not set + // JavaScript runtime error: Operation aborted + // You must set the MovementThreshold property or the ReportInterval property before adding event handlers. + // WinRT information: You must set the MovementThreshold property or the ReportInterval property before adding event handlers + if (Number.EPSILON) { + loc.movementThreshold = Number.EPSILON; + } else { + loc.movementThreshold = FALLBACK_EPSILON; + } + } - loc.addEventListener("positionchanged", onPositionChanged); - loc.addEventListener("statuschanged", onStatusChanged); + loc.addEventListener("positionchanged", onPositionChanged); + loc.addEventListener("statuschanged", onStatusChanged); - ids[clientId] = { pos: onPositionChanged, status: onStatusChanged }; + callbacks[clientId] = { pos: onPositionChanged, status: onStatusChanged }; + locs[clientId] = loc; + }, fail); }, clearWatch: function (success, fail, args, env) { - var clientId = args[0], - callbacks = ids[clientId]; + var clientId = args[0]; + var callback = callbacks[clientId]; + var loc = locs[clientId]; - if (callbacks) { - loc.removeEventListener("positionchanged", callbacks.pos); - loc.removeEventListener("statuschanged", callbacks.status); + if (callback && loc) { + loc.removeEventListener("positionchanged", callback.pos); + loc.removeEventListener("statuschanged", callback.status); - delete ids[clientId]; + delete callbacks[clientId]; + delete locs[clientId]; } - success && success(); + success(); } }; -require("cordova/exec/proxy").add("Geolocation", module.exports);
\ No newline at end of file +require("cordova/exec/proxy").add("Geolocation", module.exports); diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/src/wp/GeoLocation.cs b/StoneIsland/plugins/cordova-plugin-geolocation/src/wp/GeoLocation.cs index 42af72de..42af72de 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/src/wp/GeoLocation.cs +++ b/StoneIsland/plugins/cordova-plugin-geolocation/src/wp/GeoLocation.cs diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-geolocation/tests/plugin.xml index edeb62e1..cf0f2f6d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-geolocation/tests/plugin.xml @@ -22,10 +22,11 @@ xmlns:rim="http://www.blackberry.com/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-geolocation-tests" - version="1.0.1"> + version="2.4.0"> <name>Cordova Geolocation Plugin Tests</name> <license>Apache 2.0</license> + <dependency id="cordova-plugin-device" url="https://github.com/apache/cordova-plugin-device" /> <js-module src="tests.js" name="tests"> </js-module> </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/tests/tests.js b/StoneIsland/plugins/cordova-plugin-geolocation/tests/tests.js index e07caf88..50c5bfb2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/tests/tests.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/tests/tests.js @@ -18,43 +18,59 @@ * under the License. * */ + +/* jshint jasmine: true */ +/* global WinJS, device */ + exports.defineAutoTests = function () { var fail = function (done, context, message) { - // prevents done() to be called several times - if (context) { - if (context.done) return; - context.done = true; - } + // prevents done() to be called several times + if (context) { + if (context.done) return; + context.done = true; + } - if (message) { - expect(false).toBe(true, message); - } else { - expect(false).toBe(true); - } + if (message) { + expect(false).toBe(true, message); + } else { + expect(false).toBe(true); + } - // watchPosition could call its callback sync (before returning the value) - // so we invoke done async to make sure we know watcher id to .clear in afterEach - setTimeout(function () { - done(); - }); - }, - succeed = function (done, context) { - // prevents done() to be called several times - if (context) { - if (context.done) return; - context.done = true; - } + // watchPosition could call its callback sync (before returning the value) + // so we invoke done async to make sure we know watcher id to .clear in afterEach + setTimeout(function () { + done(); + }); + }; + + var succeed = function (done, context) { + // prevents done() to be called several times + if (context) { + if (context.done) return; + context.done = true; + } - expect(true).toBe(true); + expect(true).toBe(true); + + // watchPosition could call its callback sync (before returning the value) + // so we invoke done async to make sure we know watcher id to .clear in afterEach + setTimeout(function () { + done(); + }); + }; + + // On Windows, some tests prompt user for permission to use geolocation and interrupt autotests run + var isWindowsStore = (cordova.platformId == "windows8") || (cordova.platformId == "windows" && !WinJS.Utilities.isPhone); + var majorDeviceVersion = null; + var versionRegex = /(\d)\..+/.exec(device.version); + if (versionRegex !== null) { + majorDeviceVersion = Number(versionRegex[1]); + } + // Starting from Android 6.0 there are confirmation dialog which prevents us from running auto tests in silent mode (user interaction needed) + // Also, Android emulator doesn't provide geo fix without manual interactions or mocks + var skipAndroid = cordova.platformId == "android" && (device.isVirtual || majorDeviceVersion >= 6); + var isIOSSim = false; // if iOS simulator does not have a location set, it will fail. - // watchPosition could call its callback sync (before returning the value) - // so we invoke done async to make sure we know watcher id to .clear in afterEach - setTimeout(function () { - done(); - }); - }, - isWindowsStore = (cordova.platformId == "windows8") || (cordova.platformId == "windows" && !WinJS.Utilities.isPhone), - isAndroid = cordova.platformId == "android"; describe('Geolocation (navigator.geolocation)', function () { @@ -84,10 +100,7 @@ exports.defineAutoTests = function () { describe('error callback', function () { it("geolocation.spec.5 should be called if we set timeout to 0 and maximumAge to a very small number", function (done) { - // On Windows, this test prompts user for permission to use geolocation and interrupts autotests running. - // On Android geolocation Api is not available on emulator so we pended tests until we found the way to detect - // whether we run on emulator or real device from JavaScript. You can still run the tests on Android manually. - if (isWindowsStore || isAndroid) { + if (isWindowsStore || skipAndroid) { pending(); } @@ -100,15 +113,32 @@ exports.defineAutoTests = function () { }); }); + it("geolocation.spec.9 on failure should return PositionError object with error code constants", function (done) { + if (isWindowsStore || skipAndroid) { + pending(); + } + + navigator.geolocation.getCurrentPosition( + fail.bind(this, done), + function(gpsError) { + // W3C specs: http://dev.w3.org/geo/api/spec-source.html#position_error_interface + expect(gpsError.PERMISSION_DENIED).toBe(1); + expect(gpsError.POSITION_UNAVAILABLE).toBe(2); + expect(gpsError.TIMEOUT).toBe(3); + done(); + }, + { + maximumAge: 0, + timeout: 0 + }); + }); + }); describe('success callback', function () { it("geolocation.spec.6 should be called with a Position object", function (done) { - // On Windows, this test prompts user for permission to use geolocation and interrupts autotests running. - // On Android geolocation Api is not available on emulator so we pended tests until we found the way to detect - // whether we run on emulator or real device from JavaScript. You can still run the tests on Android manually. - if (isWindowsStore || isAndroid) { + if (isWindowsStore || skipAndroid) { pending(); } @@ -116,8 +146,17 @@ exports.defineAutoTests = function () { expect(p.coords).toBeDefined(); expect(p.timestamp).toBeDefined(); done(); + }, function(err){ + if(err.message && err.message.indexOf('kCLErrorDomain') > -1){ + console.log("Error: Location not set in simulator, tests will fail."); + expect(true).toBe(true); + isIOSSim = true; + done(); + } + else { + fail(done); + } }, - fail.bind(null, done), { maximumAge: (5 * 60 * 1000) // 5 minutes maximum age of cached position }); @@ -144,10 +183,7 @@ exports.defineAutoTests = function () { }); it("geolocation.spec.7 should be called if we set timeout to 0 and maximumAge to a very small number", function (done) { - // On Windows, this test prompts user for permission to use geolocation and interrupts autotests running. - // On Android geolocation Api is not available on emulator so we pended tests until we found the way to detect - // whether we run on emulator or real device from JavaScript. You can still run the tests on Android manually. - if (isWindowsStore || isAndroid) { + if (isWindowsStore || skipAndroid) { pending(); } @@ -161,6 +197,31 @@ exports.defineAutoTests = function () { }); }); + it("geolocation.spec.10 on failure should return PositionError object with error code constants", function (done) { + if (isWindowsStore || skipAndroid) { + pending(); + } + + var context = this; + errorWatch = navigator.geolocation.watchPosition( + fail.bind(this, done, context, 'Unexpected win'), + function(gpsError) { + if (context.done) return; + context.done = true; + + // W3C specs: http://dev.w3.org/geo/api/spec-source.html#position_error_interface + expect(gpsError.PERMISSION_DENIED).toBe(1); + expect(gpsError.POSITION_UNAVAILABLE).toBe(2); + expect(gpsError.TIMEOUT).toBe(3); + + done(); + }, + { + maximumAge: 0, + timeout: 0 + }); + }); + }); describe('success callback', function () { @@ -171,10 +232,7 @@ exports.defineAutoTests = function () { }); it("geolocation.spec.8 should be called with a Position object", function (done) { - // On Windows, this test prompts user for permission to use geolocation and interrupts autotests running. - // On Android geolocation Api is not available on emulator so we pended tests until we found the way to detect - // whether we run on emulator or real device from JavaScript. You can still run the tests on Android manually. - if (isWindowsStore || isAndroid) { + if (isWindowsStore || skipAndroid || isIOSSim) { pending(); } @@ -196,6 +254,7 @@ exports.defineAutoTests = function () { { maximumAge: (5 * 60 * 1000) // 5 minutes maximum age of cached position }); + expect(successWatch).toBeDefined(); }); }); @@ -209,23 +268,49 @@ exports.defineAutoTests = function () { /******************************************************************************/ exports.defineManualTests = function (contentEl, createActionButton) { - var newGeolocation = navigator.geolocation; - var origGeolocation = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation'); - if (!origGeolocation) { - origGeolocation = newGeolocation; - newGeolocation = null; + var watchLocationId = null; + + /** + * Set location status + */ + function setLocationStatus(status) { + document.getElementById('location_status').innerHTML = status; + } + function setLocationDetails(p) { + var date = (new Date(p.timestamp)); + document.getElementById('latitude').innerHTML = p.coords.latitude; + document.getElementById('longitude').innerHTML = p.coords.longitude; + document.getElementById('altitude').innerHTML = p.coords.altitude; + document.getElementById('accuracy').innerHTML = p.coords.accuracy; + document.getElementById('heading').innerHTML = p.coords.heading; + document.getElementById('speed').innerHTML = p.coords.speed; + document.getElementById('altitude_accuracy').innerHTML = p.coords.altitudeAccuracy; + document.getElementById('timestamp').innerHTML = date.toDateString() + " " + date.toTimeString(); } - var watchLocationId = null; + /** + * Stop watching the location + */ + function stopLocation() { + var geo = navigator.geolocation; + if (!geo) { + alert('navigator.geolocation object is missing.'); + return; + } + setLocationStatus("Stopped"); + if (watchLocationId) { + geo.clearWatch(watchLocationId); + watchLocationId = null; + } + } /** * Start watching location */ - var watchLocation = function (usePlugin) { - console.log("watchLocation()"); - var geo = usePlugin ? newGeolocation : origGeolocation; + var watchLocation = function () { + var geo = navigator.geolocation; if (!geo) { - alert('geolocation object is missing. usePlugin = ' + usePlugin); + alert('navigator.geolocation object is missing.'); return; } @@ -246,30 +331,12 @@ exports.defineManualTests = function (contentEl, createActionButton) { }; /** - * Stop watching the location - */ - var stopLocation = function (usePlugin) { - console.log("stopLocation()"); - var geo = usePlugin ? newGeolocation : origGeolocation; - if (!geo) { - alert('geolocation object is missing. usePlugin = ' + usePlugin); - return; - } - setLocationStatus("Stopped"); - if (watchLocationId) { - geo.clearWatch(watchLocationId); - watchLocationId = null; - } - }; - - /** * Get current location */ - var getLocation = function (usePlugin, opts) { - console.log("getLocation()"); - var geo = usePlugin ? newGeolocation : origGeolocation; + var getLocation = function (opts) { + var geo = navigator.geolocation; if (!geo) { - alert('geolocation object is missing. usePlugin = ' + usePlugin); + alert('navigator.geolocation object is missing.'); return; } @@ -295,24 +362,6 @@ exports.defineManualTests = function (contentEl, createActionButton) { }; - /** - * Set location status - */ - var setLocationStatus = function (status) { - document.getElementById('location_status').innerHTML = status; - }; - var setLocationDetails = function (p) { - var date = (new Date(p.timestamp)); - document.getElementById('latitude').innerHTML = p.coords.latitude; - document.getElementById('longitude').innerHTML = p.coords.longitude; - document.getElementById('altitude').innerHTML = p.coords.altitude; - document.getElementById('accuracy').innerHTML = p.coords.accuracy; - document.getElementById('heading').innerHTML = p.coords.heading; - document.getElementById('speed').innerHTML = p.coords.speed; - document.getElementById('altitude_accuracy').innerHTML = p.coords.altitudeAccuracy; - document.getElementById('timestamp').innerHTML = date.toDateString() + " " + date.toTimeString(); - } - /******************************************************************************/ var location_div = '<div id="info">' + @@ -365,16 +414,6 @@ exports.defineManualTests = function (contentEl, createActionButton) { '</table>' + '</div>', actions = - '<h2>Use Built-in WebView navigator.geolocation</h2>' + - '<div id="built-in-getLocation"></div>' + - 'Expected result: Will update all applicable values in status box for current location. Status will read Retrieving Location (may not see this if location is retrieved immediately) then Done.' + - '<p/> <div id="built-in-watchLocation"></div>' + - 'Expected result: Will update all applicable values in status box for current location and update as location changes. Status will read Running.' + - '<p/> <div id="built-in-stopLocation"></div>' + - 'Expected result: Will stop watching the location so values will not be updated. Status will read Stopped.' + - '<p/> <div id="built-in-getOld"></div>' + - 'Expected result: Will update location values with a cached position that is up to 30 seconds old. Verify with time value. Status will read Done.' + - '<h2>Use Cordova Geolocation Plugin</h2>' + '<div id="cordova-getLocation"></div>' + 'Expected result: Will update all applicable values in status box for current location. Status will read Retrieving Location (may not see this if location is retrieved immediately) then Done.' + '<p/> <div id="cordova-watchLocation"></div>' + @@ -388,38 +427,22 @@ exports.defineManualTests = function (contentEl, createActionButton) { note = '<h3>Allow use of current location, if prompted</h3>'; - contentEl.innerHTML = values_info + location_div + latitude + longitude + altitude + accuracy + heading + speed - + altitude_accuracy + time + note + actions; - - createActionButton('Get Location', function () { - getLocation(false); - }, 'built-in-getLocation'); - - createActionButton('Start Watching Location', function () { - watchLocation(false); - }, 'built-in-watchLocation'); - - createActionButton('Stop Watching Location', function () { - stopLocation(false); - }, 'built-in-stopLocation'); - - createActionButton('Get Location Up to 30 Sec Old', function () { - getLocation(false, { maximumAge: 30000 }); - }, 'built-in-getOld'); + contentEl.innerHTML = values_info + location_div + latitude + longitude + altitude + accuracy + heading + speed + + altitude_accuracy + time + note + actions; createActionButton('Get Location', function () { - getLocation(true); + getLocation(); }, 'cordova-getLocation'); createActionButton('Start Watching Location', function () { - watchLocation(true); + watchLocation(); }, 'cordova-watchLocation'); createActionButton('Stop Watching Location', function () { - stopLocation(true); + stopLocation(); }, 'cordova-stopLocation'); createActionButton('Get Location Up to 30 Sec Old', function () { - getLocation(true, { maximumAge: 30000 }); + getLocation({ maximumAge: 30000 }); }, 'cordova-getOld'); }; diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/www/Coordinates.js b/StoneIsland/plugins/cordova-plugin-geolocation/www/Coordinates.js index 84fdd5b8..84fdd5b8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/www/Coordinates.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/www/Coordinates.js diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/www/Position.js b/StoneIsland/plugins/cordova-plugin-geolocation/www/Position.js index f0470dea..d6b2c0cc 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/www/Position.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/www/Position.js @@ -27,7 +27,7 @@ var Position = function(coords, timestamp) { } else { this.coords = new Coordinates(); } - this.timestamp = (timestamp !== undefined) ? timestamp : new Date(); + this.timestamp = (timestamp !== undefined) ? timestamp : new Date().getTime(); }; module.exports = Position; diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/www/PositionError.js b/StoneIsland/plugins/cordova-plugin-geolocation/www/PositionError.js index 9403f11f..94562407 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/www/PositionError.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/www/PositionError.js @@ -31,8 +31,8 @@ var PositionError = function(code, message) { this.message = message || ''; }; -PositionError.PERMISSION_DENIED = 1; -PositionError.POSITION_UNAVAILABLE = 2; -PositionError.TIMEOUT = 3; +PositionError.prototype.PERMISSION_DENIED = PositionError.PERMISSION_DENIED = 1; +PositionError.prototype.POSITION_UNAVAILABLE = PositionError.POSITION_UNAVAILABLE = 2; +PositionError.prototype.TIMEOUT = PositionError.TIMEOUT = 3; module.exports = PositionError; diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/www/android/geolocation.js b/StoneIsland/plugins/cordova-plugin-geolocation/www/android/geolocation.js new file mode 100644 index 00000000..7265bec0 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-geolocation/www/android/geolocation.js @@ -0,0 +1,71 @@ +/* + * + * 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. + * +*/ + +var exec = cordova.require('cordova/exec'); +var utils = require('cordova/utils'); +var PositionError = require('./PositionError'); + +// Native watchPosition method is called async after permissions prompt. +// So we use additional map and own ids to return watch id synchronously. +var pluginToNativeWatchMap = {}; + +module.exports = { + getCurrentPosition: function(success, error, args) { + var win = function() { + var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation'); + geo.getCurrentPosition(success, error, args); + }; + var fail = function() { + if (error) { + error(new PositionError (PositionError.PERMISSION_DENIED, 'Illegal Access')); + } + }; + exec(win, fail, "Geolocation", "getPermission", []); + }, + + watchPosition: function(success, error, args) { + var pluginWatchId = utils.createUUID(); + + var win = function() { + var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation'); + pluginToNativeWatchMap[pluginWatchId] = geo.watchPosition(success, error, args); + }; + + var fail = function() { + if (error) { + error(new PositionError(PositionError.PERMISSION_DENIED, 'Illegal Access')); + } + }; + exec(win, fail, "Geolocation", "getPermission", []); + + return pluginWatchId; + }, + + clearWatch: function(pluginWatchId) { + var win = function() { + var nativeWatchId = pluginToNativeWatchMap[pluginWatchId]; + var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation'); + geo.clearWatch(nativeWatchId); + }; + + exec(win, null, "Geolocation", "getPermission", []); + } +}; diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/www/blackberry10/GeolocationProxy.js b/StoneIsland/plugins/cordova-plugin-geolocation/www/blackberry10/GeolocationProxy.js index 0bba2263..0bba2263 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/www/blackberry10/GeolocationProxy.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/www/blackberry10/GeolocationProxy.js diff --git a/StoneIsland/plugins/cordova-plugin-geolocation/www/geolocation.js b/StoneIsland/plugins/cordova-plugin-geolocation/www/geolocation.js index 3814919a..f1f64456 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-geolocation/www/geolocation.js +++ b/StoneIsland/plugins/cordova-plugin-geolocation/www/geolocation.js @@ -102,7 +102,7 @@ var geolocation = { velocity:p.velocity, altitudeAccuracy:p.altitudeAccuracy }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + p.timestamp ); geolocation.lastPosition = pos; successCallback(pos); @@ -118,7 +118,7 @@ var geolocation = { // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just // fire the success callback with the cached position. - if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { + if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp) <= options.maximumAge)) { successCallback(geolocation.lastPosition); // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. } else if (options.timeout === 0) { @@ -184,7 +184,7 @@ var geolocation = { velocity:p.velocity, altitudeAccuracy:p.altitudeAccuracy }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) + p.timestamp ); geolocation.lastPosition = pos; successCallback(pos); diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/CONTRIBUTING.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/CONTRIBUTING.md index 4c8e6a5e..39378f26 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/CONTRIBUTING.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/CONTRIBUTING.md @@ -26,7 +26,7 @@ Anyone can contribute to Cordova. And we need your contributions. There are multiple ways to contribute: report bugs, improve the docs, and contribute code. -For instructions on this, start with the +For instructions on this, start with the [contribution overview](http://cordova.apache.org/contribute/). The details are explained there, but the important items are: @@ -35,3 +35,30 @@ The details are explained there, but the important items are: - Run the tests so your patch doesn't break existing functionality. We look forward to your contributions! + +The notes on [Commit Workflow](https://github.com/apache/cordova-coho/blob/master/docs/committer-workflow.md#commit-workflow) can be helpful even if you are not a committer. + +## Running plugin tests + +* clone and install [cordova-plugin-test-framework](https://github.com/apache/cordova-plugin-test-framework) +``` +git clone git@github.com:apache/cordova-plugin-test-framework.git +``` +* edit ```cordova-plugin-test-framework/www/assets/index.html``` and add the following line +``` +<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com http://cordova.apache.org http://google.co.uk https://google.co.uk 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *"> +``` +* create test project +``` +cordova create plugintest +cd plugintest +cordova platform add android +cordova plugin add ../cordova-plugin-inappbrowser +cordova plugin add ../cordova-plugin-inappbrowser/tests +cordova plugin add ../cordova-plugin-test-framework +``` +* edit ```config.xml``` and replace ```<content src="index.html" />``` with ```<content src="cdvtests/index.html" />``` +* run application +``` +cordova run +``` diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/LICENSE b/StoneIsland/plugins/cordova-plugin-inappbrowser/LICENSE index 7a4a3ea2..7a4a3ea2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/LICENSE +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/LICENSE diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/NOTICE b/StoneIsland/plugins/cordova-plugin-inappbrowser/NOTICE index 8ec56a52..8ec56a52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/NOTICE +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/NOTICE diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/README.md index f5c847d1..e7e96972 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/README.md @@ -1,3 +1,7 @@ +--- +title: Inappbrowser +description: Open an in-app browser window. +--- <!-- # license: Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,8 +21,16 @@ # under the License. --> +|Android|iOS| Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI | +|:-:|:-:|:-:|:-:|:-:|:-:| +|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=android,PLUGIN=cordova-plugin-inappbrowser/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=ios,PLUGIN=cordova-plugin-inappbrowser/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-store,PLUGIN=cordova-plugin-inappbrowser/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-phone,PLUGIN=cordova-plugin-inappbrowser/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-10-store,PLUGIN=cordova-plugin-inappbrowser/)|[](https://travis-ci.org/apache/cordova-plugin-inappbrowser)| + # cordova-plugin-inappbrowser +You can show helpful articles, videos, and web resources inside of your app. Users can view web pages without leaving your app. + +> To get a few ideas, check out the [sample](#sample) at the bottom of this page or go straight to the [reference](#reference) content. + This plugin provides a web browser view that displays when calling `cordova.InAppBrowser.open()`. var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes'); @@ -54,10 +66,10 @@ Although `window.open` is in the global scope, InAppBrowser is not available unt console.log("window.open works well"); } -:warning: Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20InAppBrowser%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) - +Report issues with this plugin on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20InAppBrowser%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) +## <a id="reference">Reference ## Installation cordova plugin add cordova-plugin-inappbrowser @@ -77,7 +89,7 @@ instance, or the system browser. var ref = cordova.InAppBrowser.open(url, target, options); -- __ref__: Reference to the `InAppBrowser` window. _(InAppBrowser)_ +- __ref__: Reference to the `InAppBrowser` window when the target is set to `'_blank'`. _(InAppBrowser)_ - __url__: The URL to load _(String)_. Call `encodeURI()` on this if the URL contains Unicode characters. @@ -100,6 +112,8 @@ instance, or the system browser. - __clearsessioncache__: set to `yes` to have the session cookie cache cleared before the new window is opened - __zoom__: set to `yes` to show Android browser's zoom controls, set to `no` to hide them. Default value is `yes`. - __hardwareback__: set to `yes` to use the hardware back button to navigate backwards through the `InAppBrowser`'s history. If there is no previous page, the `InAppBrowser` will close. The default value is `yes`, so you must set it to `no` if you want the back button to simply close the InAppBrowser. + - __mediaPlaybackRequiresUserAction__: Set to `yes` to prevent HTML5 audio or video from autoplaying (defaults to `no`). + - __shouldPauseOnSuspend__: Set to `yes` to make InAppBrowser WebView to pause/resume with the app to stop background audio (this may be required to avoid Google Play issues like described in [CB-11013](https://issues.apache.org/jira/browse/CB-11013)). iOS only: @@ -110,7 +124,7 @@ instance, or the system browser. - __clearsessioncache__: set to `yes` to have the session cookie cache cleared before the new window is opened - __toolbar__: set to `yes` or `no` to turn the toolbar on or off for the InAppBrowser (defaults to `yes`) - __enableViewportScale__: Set to `yes` or `no` to prevent viewport scaling through a meta tag (defaults to `no`). - - __mediaPlaybackRequiresUserAction__: Set to `yes` or `no` to prevent HTML5 audio or video from autoplaying (defaults to `no`). + - __mediaPlaybackRequiresUserAction__: Set to `yes` to prevent HTML5 audio or video from autoplaying (defaults to `no`). - __allowInlineMediaPlayback__: Set to `yes` or `no` to allow in-line HTML5 media playback, displaying within the browser window rather than a device-specific playback interface. The HTML's `video` element must also include the `webkit-playsinline` attribute (defaults to `no`) - __keyboardDisplayRequiresUserAction__: Set to `yes` or `no` to open the keyboard when form elements receive focus via JavaScript's `focus()` call (defaults to `yes`). - __suppressesIncrementalRendering__: Set to `yes` or `no` to wait until all new view content is received before being rendered (defaults to `no`). @@ -122,6 +136,7 @@ instance, or the system browser. - __hidden__: set to `yes` to create the browser and load the page, but not show it. The loadstop event fires when loading is complete. Omit or set to `no` (default) to have the browser open and load normally. - __fullscreen__: set to `yes` to create the browser control without a border around it. Please note that if __location=no__ is also specified, there will be no control presented to user to close IAB window. + - __hardwareback__: works the same way as on Android platform. ### Supported Platforms @@ -172,6 +187,10 @@ opened with `target='_blank'`. The rules might look like these ### Windows Quirks +Windows 8.0, 8.1 and Windows Phone 8.1 don't support remote urls to be opened in the Cordova WebView so remote urls are always showed in the system's web browser if opened with `target='_self'`. + +On Windows 10 if the URL is NOT in the white list and is opened with `target='_self'` it will be showed in the system's web browser instead of InAppBrowser popup. + Similar to Firefox OS IAB window visual behaviour can be overridden via `inAppBrowserWrap`/`inAppBrowserWrapFullscreen` CSS classes ### Browser Quirks @@ -182,7 +201,7 @@ Similar to Firefox OS IAB window visual behaviour can be overridden via `inAppBr ## InAppBrowser -The object returned from a call to `cordova.InAppBrowser.open`. +The object returned from a call to `cordova.InAppBrowser.open` when the target is set to `'_blank'`. ### Methods @@ -193,7 +212,7 @@ The object returned from a call to `cordova.InAppBrowser.open`. - executeScript - insertCSS -## addEventListener +## InAppBrowser.addEventListener > Adds a listener for an event from the `InAppBrowser`. @@ -210,6 +229,76 @@ The object returned from a call to `cordova.InAppBrowser.open`. - __callback__: the function that executes when the event fires. The function is passed an `InAppBrowserEvent` object as a parameter. +## Example + +```javascript + +var inAppBrowserRef; + +function showHelp(url) { + + var target = "_blank"; + + var options = "location=yes,hidden=yes"; + + inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); + + inAppBrowserRef.addEventListener('loadstart', loadStartCallBack); + + inAppBrowserRef.addEventListener('loadstop', loadStopCallBack); + + inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack); + +} + +function loadStartCallBack() { + + $('#status-message').text("loading please wait ..."); + +} + +function loadStopCallBack() { + + if (inAppBrowserRef != undefined) { + + inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" }); + + $('#status-message').text(""); + + inAppBrowserRef.show(); + } + +} + +function loadErrorCallBack(params) { + + $('#status-message').text(""); + + var scriptErrorMesssage = + "alert('Sorry we cannot open that page. Message from the server is : " + + params.message + "');" + + inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack); + + inAppBrowserRef.close(); + + inAppBrowserRef = undefined; + +} + +function executeScriptCallBack(params) { + + if (params[0] == null) { + + $('#status-message').text( + "Sorry we couldn't open that page. Message from the server is : '" + + params.message + "'"); + } + +} + +``` + ### InAppBrowserEvent Properties - __type__: the eventname, either `loadstart`, `loadstop`, `loaderror`, or `exit`. _(String)_ @@ -239,7 +328,7 @@ The object returned from a call to `cordova.InAppBrowser.open`. var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes'); ref.addEventListener('loadstart', function(event) { alert(event.url); }); -## removeEventListener +## InAppBrowser.removeEventListener > Removes a listener for an event from the `InAppBrowser`. @@ -273,7 +362,7 @@ The function is passed an `InAppBrowserEvent` object. ref.addEventListener('loadstart', myCallback); ref.removeEventListener('loadstart', myCallback); -## close +## InAppBrowser.close > Closes the `InAppBrowser` window. @@ -296,7 +385,7 @@ The function is passed an `InAppBrowserEvent` object. var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes'); ref.close(); -## show +## InAppBrowser.show > Displays an InAppBrowser window that was opened hidden. Calling this has no effect if the InAppBrowser was already visible. @@ -318,7 +407,7 @@ The function is passed an `InAppBrowserEvent` object. // some time later... ref.show(); -## executeScript +## InAppBrowser.executeScript > Injects JavaScript code into the `InAppBrowser` window @@ -360,7 +449,7 @@ The function is passed an `InAppBrowserEvent` object. Due to [MSDN docs](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.webview.invokescriptasync.aspx) the invoked script can return only string values, otherwise the parameter, passed to __callback__ will be `[null]`. -## insertCSS +## InAppBrowser.insertCSS > Injects CSS into the `InAppBrowser` window. @@ -387,3 +476,204 @@ Due to [MSDN docs](https://msdn.microsoft.com/en-us/library/windows.ui.xaml.cont ref.addEventListener('loadstop', function() { ref.insertCSS({file: "mystyles.css"}); }); +__ + +## <a id="sample"></a>Sample: Show help pages with an InAppBrowser + +You can use this plugin to show helpful documentation pages within your app. Users can view online help documents and then close them without leaving the app. + +Here's a few snippets that show how you do this. + +* [Give users a way to ask for help](#give). +* [Load a help page](#load). +* [Let users know that you're getting their page ready](#let). +* [Show the help page](#show). +* [Handle page errors](#handle). + +### <a id="give"></a>Give users a way to ask for help + +There's lots of ways to do this in your app. A drop down list is a simple way to do that. + +```html + +<select id="help-select"> + <option value="default">Need help?</option> + <option value="article">Show me a helpful article</option> + <option value="video">Show me a helpful video</option> + <option value="search">Search for other topics</option> +</select> + +``` + +Gather the users choice in the ``onDeviceReady`` function of the page and then send an appropriate URL to a helper function in some shared library file. Our helper function is named ``showHelp()`` and we'll write that function next. + +```javascript + +$('#help-select').on('change', function (e) { + + var url; + + switch (this.value) { + + case "article": + url = "https://cordova.apache.org/docs/en/latest/" + + "reference/cordova-plugin-inappbrowser/index.html"; + break; + + case "video": + url = "https://youtu.be/F-GlVrTaeH0"; + break; + + case "search": + url = "https://www.google.com/#q=inAppBrowser+plugin"; + break; + } + + showHelp(url); + +}); + +``` + +### <a id="load"></a>Load a help page + +We'll use the ``open`` function to load the help page. We're setting the ``hidden`` property to ``yes`` so that we can show the browser only after the page content has loaded. That way, users don't see a blank browser while they wait for content to appear. When the ``loadstop`` event is raised, we'll know when the content has loaded. We'll handle that event shortly. + +```javascript + +function showHelp(url) { + + var target = "_blank"; + + var options = "location=yes,hidden=yes"; + + inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); + + inAppBrowserRef.addEventListener('loadstart', loadStartCallBack); + + inAppBrowserRef.addEventListener('loadstop', loadStopCallBack); + + inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack); + +} + +``` + +### <a id="let"></a>Let users know that you're getting their page ready + +Because the browser doesn't immediately appear, we can use the ``loadstart`` event to show a status message, progress bar, or other indicator. This assures users that content is on the way. + +```javascript + +function loadStartCallBack() { + + $('#status-message').text("loading please wait ..."); + +} + +``` + +### <a id="show"></a>Show the help page + +When the ``loadstopcallback`` event is raised, we know that the content has loaded and we can make the browser visible. This sort of trick can create the impression of better performance. The truth is that whether you show the browser before content loads or not, the load times are exactly the same. + +```javascript + +function loadStopCallBack() { + + if (inAppBrowserRef != undefined) { + + inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" }); + + $('#status-message').text(""); + + inAppBrowserRef.show(); + } + +} + +``` +You might have noticed the call to the ``insertCSS`` function. This serves no particular purpose in our scenario. But it gives you an idea of why you might use it. In this case, we're just making sure that the font size of your pages have a certain size. You can use this function to insert any CSS style elements. You can even point to a CSS file in your project. + +### <a id="handle"></a>Handle page errors + +Sometimes a page no longer exists, a script error occurs, or a user lacks permission to view the resource. How or if you handle that situation is completely up to you and your design. You can let the browser show that message or you can present it in another way. + +We'll try to show that error in a message box. We can do that by injecting a script that calls the ``alert`` function. That said, this won't work in browsers on Windows devices so we'll have to look at the parameter of the ``executeScript`` callback function to see if our attempt worked. If it didn't work out for us, we'll just show the error message in a ``<div>`` on the page. + +```javascript + +function loadErrorCallBack(params) { + + $('#status-message').text(""); + + var scriptErrorMesssage = + "alert('Sorry we cannot open that page. Message from the server is : " + + params.message + "');" + + inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack); + + inAppBrowserRef.close(); + + inAppBrowserRef = undefined; + +} + +function executeScriptCallBack(params) { + + if (params[0] == null) { + + $('#status-message').text( + "Sorry we couldn't open that page. Message from the server is : '" + + params.message + "'"); + } + +} + +``` + +## More Usage Info + +### Local Urls ( source is in the app package ) +``` +var iab = cordova.InAppBrowser; + +iab.open('local-url.html'); // loads in the Cordova WebView +iab.open('local-url.html', '_self'); // loads in the Cordova WebView +iab.open('local-url.html', '_system'); // Security error: system browser, but url will not load (iOS) +iab.open('local-url.html', '_blank'); // loads in the InAppBrowser +iab.open('local-url.html', 'random_string'); // loads in the InAppBrowser +iab.open('local-url.html', 'random_string', 'location=no'); // loads in the InAppBrowser, no location bar + +``` + + + +### Whitelisted Content + +``` +var iab = cordova.InAppBrowser; + +iab.open('http://whitelisted-url.com'); // loads in the Cordova WebView +iab.open('http://whitelisted-url.com', '_self'); // loads in the Cordova WebView +iab.open('http://whitelisted-url.com', '_system'); // loads in the system browser +iab.open('http://whitelisted-url.com', '_blank'); // loads in the InAppBrowser +iab.open('http://whitelisted-url.com', 'random_string'); // loads in the InAppBrowser + +iab.open('http://whitelisted-url.com', 'random_string', 'location=no'); // loads in the InAppBrowser, no location bar + +``` + +### Urls that are not white-listed + +``` +var iab = cordova.InAppBrowser; + +iab.open('http://url-that-fails-whitelist.com'); // loads in the InAppBrowser +iab.open('http://url-that-fails-whitelist.com', '_self'); // loads in the InAppBrowser +iab.open('http://url-that-fails-whitelist.com', '_system'); // loads in the system browser +iab.open('http://url-that-fails-whitelist.com', '_blank'); // loads in the InAppBrowser +iab.open('http://url-that-fails-whitelist.com', 'random_string'); // loads in the InAppBrowser +iab.open('http://url-that-fails-whitelist.com', 'random_string', 'location=no'); // loads in the InAppBrowser, no location bar + +```
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/RELEASENOTES.md index 1e2005d8..5d8f3e71 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/RELEASENOTES.md @@ -20,6 +20,72 @@ --> # Release Notes +### 1.5.0 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* Add intent scheme to be handled by OS +* Plugin uses `Android Log class` and not `Cordova LOG class` +* Adding links to guide content and reference content at the top of the readme file Github: close #163 +* [CB-10973](https://issues.apache.org/jira/browse/CB-10973) **Browser**: wrong height of webview with `location=yes` +* Size and position in browser platform +* [CB-10973](https://issues.apache.org/jira/browse/CB-10973) **Windows**: wrong height of webview with `location=yes` +* [CB-11013](https://issues.apache.org/jira/browse/CB-11013) IAB enabling background play of YouTube videos? +* [CB-10467](https://issues.apache.org/jira/browse/CB-10467) Hardware back button, while `InAppBrowser` is opened, closes the app too in addition to closing `InAppBrowser` +* [CB-11178](https://issues.apache.org/jira/browse/CB-11178) allow to open other apps on **iOS 9** +* fix some calls which used api level 16 +* [CB-5402](https://issues.apache.org/jira/browse/CB-5402) added extra content from wiki page +* [CB-2063](https://issues.apache.org/jira/browse/CB-2063) (**ios**) Fixed presentation style +* [CB-11012](https://issues.apache.org/jira/browse/CB-11012) added some clarifications about `InAppBrowser` object +* [CB-3360](https://issues.apache.org/jira/browse/CB-3360) Set custom `inappbrowser` user agent for **ios** +* Add badges for paramedic builds on Jenkins +* [CB-11381](https://issues.apache.org/jira/browse/CB-11381) android: Does not pass sonarqube scan +* Add pull request template. +* [CB-10866](https://issues.apache.org/jira/browse/CB-10866) Adding engine requirements to `package.json` +* [CB-110003](https://issues.apache.org/jira/browse/CB-110003) Adding samples to Readme. +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md + +### 1.4.0 (Apr 15, 2016) +* [CB-7679](https://issues.apache.org/jira/browse/CB-7679) add fix for **iOS** upload. +* [CB-10944](https://issues.apache.org/jira/browse/CB-10944) `NoSuchMethodError` in `InAppBrowser` plugin +* [CB-10937](https://issues.apache.org/jira/browse/CB-10937) fix stretched icons +* [CB-10760](https://issues.apache.org/jira/browse/CB-10760) Fixing README for display on Cordova website +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add `JSHint` for plugins + +### 1.3.0 (Feb 09, 2016) +* [CB-3360](https://issues.apache.org/jira/browse/CB-3360) Set custom inappbrowser user agent for android +* [CB-10538](https://issues.apache.org/jira/browse/CB-10538) cordova-plugin-inappbrowser timeout issue +* [CB-10395](https://issues.apache.org/jira/browse/CB-10395) InAppBrowser's WebView not storing cookies reliable on Android +* Edit package.json license to match SPDX id +* [CB-10305](https://issues.apache.org/jira/browse/CB-10305) Gray bar appears in the wrong place on iOS +* [CB-7786](https://issues.apache.org/jira/browse/CB-7786) Support mediaPlaybackRequiresUserAction on Android +* [CB-7500](https://issues.apache.org/jira/browse/CB-7500) executeScript with callback kills/blurs inAppBrowser window on Android + +### 1.2.1 (Feb 02, 2016) +* [CB-10407](https://issues.apache.org/jira/browse/CB-10407) InAppBrowser not firing loadstart event on android +* [CB-10428](https://issues.apache.org/jira/browse/CB-10428) Fix syntax error when browserifying inAppBrowser plugin +* handle app store urls in system browser +* [CB-6702](https://issues.apache.org/jira/browse/CB-6702) InAppBrowser hangs when opening more than one instance +* [CB-10456](https://issues.apache.org/jira/browse/CB-10456) InAppBrowser is not closed if I close it programmatically on Android +* [CB-10451](https://issues.apache.org/jira/browse/CB-10451) InAppBrowser: loadstart event is not triggered on Windows +* [CB-10452](https://issues.apache.org/jira/browse/CB-10452) InAppBrowser: 'exit' event is not triggered on Windows +* [CB-10454](https://issues.apache.org/jira/browse/CB-10454) InAppBrowser: 'loaderror' event does not have code and message on Windows +* [CB-10450](https://issues.apache.org/jira/browse/CB-10450) InAppBrowser: Unable to get property 'canGoBack' of undefined on Windows +* [CB-10441](https://issues.apache.org/jira/browse/CB-10441) Add auto tests for InAppBrowser plugin + +### 1.2.0 (Jan 15, 2016) +* [CB-8180](https://issues.apache.org/jira/browse/CB-8180) Changing methods of interception in `WebViewClient` class +* [CB-10009](https://issues.apache.org/jira/browse/CB-10009) Improve `InAppBrowser` toolbar look and feel on **Windows** +* Open a new window on the **Browser** platform + +### 1.1.1 (Dec 10, 2015) + +* [CB-9445](https://issues.apache.org/jira/browse/CB-9445) Improves executeScript callbacks on iOS +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Incremented plugin version. +* [CB-10040](https://issues.apache.org/jira/browse/CB-10040) - re-fix: backwards compatible with cordova-ios < 4.0 +* [CB-8534](https://issues.apache.org/jira/browse/CB-8534) Allow plugins to respond to onReceivedHttpAuthRequest. This closes #82 +* [CB-3750](https://issues.apache.org/jira/browse/CB-3750) Fixes spinner on iOS. This closes #89 +* [CB-7696](https://issues.apache.org/jira/browse/CB-7696) Document target=_self behavior for Windows +* [CB-10040](https://issues.apache.org/jira/browse/CB-10040) - Compile Error in InAppBrowser Plugin for iOS - No known instance method for selector 'URLIsWhitelisted:' + ### 1.1.0 (Nov 18, 2015) * [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest * Invoke webview if using local file diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/README.md index 2ee92f85..2ee92f85 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/index.md index d2b29d57..d2b29d57 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/de/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/README.md index 811439a7..811439a7 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/index.md index fc5b7b13..fc5b7b13 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/es/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/README.md index 73812fee..73812fee 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/index.md index 4f22d13b..4f22d13b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/fr/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/README.md index 4e06888a..4e06888a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/index.md index 73654628..73654628 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/it/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/README.md index 40f631b7..40f631b7 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/index.md index a1b68544..a1b68544 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ja/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/README.md index 13511ad8..13511ad8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/index.md index d1b3ddbd..d1b3ddbd 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ko/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/README.md index 5ff58ada..5ff58ada 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/index.md index dff9bf0f..dff9bf0f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/pl/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ru/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ru/index.md index 3b4e967d..3b4e967d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ru/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/ru/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/README.md index 7d33d89c..7d33d89c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/index.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/index.md index c12c0461..c12c0461 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/index.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/doc/zh/index.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/package.json b/StoneIsland/plugins/cordova-plugin-inappbrowser/package.json index cba3e5f2..8da20900 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/package.json +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-inappbrowser", - "version": "1.1.0", + "version": "1.5.0", "description": "Cordova InAppBrowser Plugin", "cordova": { "id": "cordova-plugin-inappbrowser", @@ -37,12 +37,23 @@ "cordova-windows", "cordova-firefoxos" ], - "engines": [ - { - "name": "cordova", - "version": ">=3.1.0" + "scripts": { + "test": "npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests" + }, + "engines": { + "cordovaDependencies": { + "0.2.3": { + "cordova": ">=3.1.0" + }, + "2.0.0": { + "cordova": ">100" + } } - ], + }, "author": "Apache Software Foundation", - "license": "Apache 2.0" + "license": "Apache-2.0", + "devDependencies": { + "jshint": "^2.6.0" + } } diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/plugin.xml b/StoneIsland/plugins/cordova-plugin-inappbrowser/plugin.xml index a05fddc7..a27be5cf 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/plugin.xml @@ -20,7 +20,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-inappbrowser" - version="1.1.0"> + version="1.5.0"> <name>InAppBrowser</name> <description>Cordova InAppBrowser Plugin</description> diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppBrowser.java b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppBrowser.java index 0263ea2c..0263ea2c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppBrowser.java +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppBrowser.java diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppChromeClient.java b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppChromeClient.java index 37cf101f..37cf101f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppChromeClient.java +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/amazon/InAppChromeClient.java diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowser.java b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowser.java index 60437451..8f4f3d97 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowser.java +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowser.java @@ -19,7 +19,6 @@ package org.apache.cordova.inappbrowser; import android.annotation.SuppressLint; -import org.apache.cordova.inappbrowser.InAppBrowserDialog; import android.content.Context; import android.content.Intent; import android.provider.Browser; @@ -30,7 +29,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.InputType; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; @@ -41,17 +39,21 @@ import android.view.WindowManager.LayoutParams; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.webkit.CookieManager; +import android.webkit.CookieSyncManager; +import android.webkit.HttpAuthHandler; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; -import android.widget.Button; import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import org.apache.cordova.CallbackContext; import org.apache.cordova.Config; import org.apache.cordova.CordovaArgs; +import org.apache.cordova.CordovaHttpAuthHandler; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CordovaWebView; import org.apache.cordova.LOG; @@ -61,6 +63,7 @@ import org.json.JSONException; import org.json.JSONObject; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.StringTokenizer; @@ -82,6 +85,8 @@ public class InAppBrowser extends CordovaPlugin { private static final String CLEAR_ALL_CACHE = "clearcache"; private static final String CLEAR_SESSION_CACHE = "clearsessioncache"; private static final String HARDWARE_BACK_BUTTON = "hardwareback"; + private static final String MEDIA_PLAYBACK_REQUIRES_USER_ACTION = "mediaPlaybackRequiresUserAction"; + private static final String SHOULD_PAUSE = "shouldPauseOnSuspend"; private InAppBrowserDialog dialog; private WebView inAppWebView; @@ -93,6 +98,8 @@ public class InAppBrowser extends CordovaPlugin { private boolean clearAllCache = false; private boolean clearSessionCache = false; private boolean hadwareBackButton = true; + private boolean mediaPlaybackRequiresUserGesture = false; + private boolean shouldPauseInAppBrowser = false; /** * Executes the request and returns PluginResult. @@ -113,7 +120,7 @@ public class InAppBrowser extends CordovaPlugin { final String target = t; final HashMap<String, Boolean> features = parseFeature(args.optString(2)); - Log.d(LOG_TAG, "target = " + target); + LOG.d(LOG_TAG, "target = " + target); this.cordova.getActivity().runOnUiThread(new Runnable() { @Override @@ -121,7 +128,7 @@ public class InAppBrowser extends CordovaPlugin { String result = ""; // SELF if (SELF.equals(target)) { - Log.d(LOG_TAG, "in self"); + LOG.d(LOG_TAG, "in self"); /* This code exists for compatibility between 3.x and 4.x versions of Cordova. * Previously the Config class had a static method, isUrlWhitelisted(). That * responsibility has been moved to the plugins, with an aggregating method in @@ -136,8 +143,11 @@ public class InAppBrowser extends CordovaPlugin { Method iuw = Config.class.getMethod("isUrlWhiteListed", String.class); shouldAllowNavigation = (Boolean)iuw.invoke(null, url); } catch (NoSuchMethodException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); } catch (IllegalAccessException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); } catch (InvocationTargetException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); } } if (shouldAllowNavigation == null) { @@ -147,20 +157,23 @@ public class InAppBrowser extends CordovaPlugin { Method san = pm.getClass().getMethod("shouldAllowNavigation", String.class); shouldAllowNavigation = (Boolean)san.invoke(pm, url); } catch (NoSuchMethodException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); } catch (IllegalAccessException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); } catch (InvocationTargetException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); } } // load in webview if (Boolean.TRUE.equals(shouldAllowNavigation)) { - Log.d(LOG_TAG, "loading in webview"); + LOG.d(LOG_TAG, "loading in webview"); webView.loadUrl(url); } //Load the dialer else if (url.startsWith(WebView.SCHEME_TEL)) { try { - Log.d(LOG_TAG, "loading in dialer"); + LOG.d(LOG_TAG, "loading in dialer"); Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse(url)); cordova.getActivity().startActivity(intent); @@ -170,18 +183,18 @@ public class InAppBrowser extends CordovaPlugin { } // load in InAppBrowser else { - Log.d(LOG_TAG, "loading in InAppBrowser"); + LOG.d(LOG_TAG, "loading in InAppBrowser"); result = showWebPage(url, features); } } // SYSTEM else if (SYSTEM.equals(target)) { - Log.d(LOG_TAG, "in system"); + LOG.d(LOG_TAG, "in system"); result = openExternal(url); } // BLANK - or anything else else { - Log.d(LOG_TAG, "in blank"); + LOG.d(LOG_TAG, "in blank"); result = showWebPage(url, features); } @@ -197,7 +210,7 @@ public class InAppBrowser extends CordovaPlugin { else if (action.equals("injectScriptCode")) { String jsWrapper = null; if (args.getBoolean(1)) { - jsWrapper = String.format("prompt(JSON.stringify([eval(%%s)]), 'gap-iab://%s')", callbackContext.getCallbackId()); + jsWrapper = String.format("(function(){prompt(JSON.stringify([eval(%%s)]), 'gap-iab://%s')})()", callbackContext.getCallbackId()); } injectDeferredObject(args.getString(0), jsWrapper); } @@ -254,6 +267,26 @@ public class InAppBrowser extends CordovaPlugin { } /** + * Called when the system is about to start resuming a previous activity. + */ + @Override + public void onPause(boolean multitasking) { + if (shouldPauseInAppBrowser) { + inAppWebView.onPause(); + } + } + + /** + * Called when the activity will start interacting with the user. + */ + @Override + public void onResume(boolean multitasking) { + if (shouldPauseInAppBrowser) { + inAppWebView.onResume(); + } + } + + /** * Called by AccelBroker when listener is to be shut down. * Stop listener. */ @@ -350,7 +383,7 @@ public class InAppBrowser extends CordovaPlugin { this.cordova.getActivity().startActivity(intent); return ""; } catch (android.content.ActivityNotFoundException e) { - Log.d(LOG_TAG, "InAppBrowser: Error loading url "+url+":"+ e.toString()); + LOG.d(LOG_TAG, "InAppBrowser: Error loading url "+url+":"+ e.toString()); return e.toString(); } } @@ -359,20 +392,22 @@ public class InAppBrowser extends CordovaPlugin { * Closes the dialog */ public void closeDialog() { - final WebView childView = this.inAppWebView; - // The JS protects against multiple calls, so this should happen only when - // closeDialog() is called by other native code. - if (childView == null) { - return; - } this.cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { + final WebView childView = inAppWebView; + // The JS protects against multiple calls, so this should happen only when + // closeDialog() is called by other native code. + if (childView == null) { + return; + } + childView.setWebViewClient(new WebViewClient() { // NB: wait for about:blank before dismissing public void onPageFinished(WebView view, String url) { if (dialog != null) { dialog.dismiss(); + dialog = null; } } }); @@ -380,16 +415,16 @@ public class InAppBrowser extends CordovaPlugin { // other than your app's UI thread, it can cause unexpected results." // http://developer.android.com/guide/webapps/migrating.html#Threads childView.loadUrl("about:blank"); + + try { + JSONObject obj = new JSONObject(); + obj.put("type", EXIT_EVENT); + sendUpdate(obj, false); + } catch (JSONException ex) { + LOG.d(LOG_TAG, "Should never happen"); + } } }); - - try { - JSONObject obj = new JSONObject(); - obj.put("type", EXIT_EVENT); - sendUpdate(obj, false); - } catch (JSONException ex) { - Log.d(LOG_TAG, "Should never happen"); - } } /** @@ -468,6 +503,8 @@ public class InAppBrowser extends CordovaPlugin { showLocationBar = true; showZoomControls = true; openWindowHidden = false; + mediaPlaybackRequiresUserGesture = false; + if (features != null) { Boolean show = features.get(LOCATION); if (show != null) { @@ -485,6 +522,10 @@ public class InAppBrowser extends CordovaPlugin { if (hardwareBack != null) { hadwareBackButton = hardwareBack.booleanValue(); } + Boolean mediaPlayback = features.get(MEDIA_PLAYBACK_REQUIRES_USER_ACTION); + if (mediaPlayback != null) { + mediaPlaybackRequiresUserGesture = mediaPlayback.booleanValue(); + } Boolean cache = features.get(CLEAR_ALL_CACHE); if (cache != null) { clearAllCache = cache.booleanValue(); @@ -494,6 +535,10 @@ public class InAppBrowser extends CordovaPlugin { clearSessionCache = cache.booleanValue(); } } + Boolean shouldPause = features.get(SHOULD_PAUSE); + if (shouldPause != null) { + shouldPauseInAppBrowser = shouldPause.booleanValue(); + } } final CordovaWebView thatWebView = this.webView; @@ -516,6 +561,12 @@ public class InAppBrowser extends CordovaPlugin { @SuppressLint("NewApi") public void run() { + + // CB-6702 InAppBrowser hangs when opening more than one instance + if (dialog != null) { + dialog.dismiss(); + }; + // Let's create the main dialog dialog = new InAppBrowserDialog(cordova.getActivity(), android.R.style.Theme_NoTitleBar); dialog.getWindow().getAttributes().windowAnimations = android.R.style.Animation_Dialog; @@ -541,26 +592,28 @@ public class InAppBrowser extends CordovaPlugin { actionButtonContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); actionButtonContainer.setHorizontalGravity(Gravity.LEFT); actionButtonContainer.setVerticalGravity(Gravity.CENTER_VERTICAL); - actionButtonContainer.setId(1); + actionButtonContainer.setId(Integer.valueOf(1)); // Back button - Button back = new Button(cordova.getActivity()); + ImageButton back = new ImageButton(cordova.getActivity()); RelativeLayout.LayoutParams backLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); backLayoutParams.addRule(RelativeLayout.ALIGN_LEFT); back.setLayoutParams(backLayoutParams); back.setContentDescription("Back Button"); - back.setId(2); + back.setId(Integer.valueOf(2)); Resources activityRes = cordova.getActivity().getResources(); int backResId = activityRes.getIdentifier("ic_action_previous_item", "drawable", cordova.getActivity().getPackageName()); Drawable backIcon = activityRes.getDrawable(backResId); - if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) - { - back.setBackgroundDrawable(backIcon); - } + if (Build.VERSION.SDK_INT >= 16) + back.setBackground(null); else - { - back.setBackground(backIcon); - } + back.setBackgroundDrawable(null); + back.setImageDrawable(backIcon); + back.setScaleType(ImageView.ScaleType.FIT_CENTER); + back.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10)); + if (Build.VERSION.SDK_INT >= 16) + back.getAdjustViewBounds(); + back.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { goBack(); @@ -568,22 +621,24 @@ public class InAppBrowser extends CordovaPlugin { }); // Forward button - Button forward = new Button(cordova.getActivity()); + ImageButton forward = new ImageButton(cordova.getActivity()); RelativeLayout.LayoutParams forwardLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); forwardLayoutParams.addRule(RelativeLayout.RIGHT_OF, 2); forward.setLayoutParams(forwardLayoutParams); forward.setContentDescription("Forward Button"); - forward.setId(3); + forward.setId(Integer.valueOf(3)); int fwdResId = activityRes.getIdentifier("ic_action_next_item", "drawable", cordova.getActivity().getPackageName()); Drawable fwdIcon = activityRes.getDrawable(fwdResId); - if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) - { - forward.setBackgroundDrawable(fwdIcon); - } + if (Build.VERSION.SDK_INT >= 16) + forward.setBackground(null); else - { - forward.setBackground(fwdIcon); - } + forward.setBackgroundDrawable(null); + forward.setImageDrawable(fwdIcon); + forward.setScaleType(ImageView.ScaleType.FIT_CENTER); + forward.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10)); + if (Build.VERSION.SDK_INT >= 16) + forward.getAdjustViewBounds(); + forward.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { goForward(); @@ -596,7 +651,7 @@ public class InAppBrowser extends CordovaPlugin { textLayoutParams.addRule(RelativeLayout.RIGHT_OF, 1); textLayoutParams.addRule(RelativeLayout.LEFT_OF, 5); edittext.setLayoutParams(textLayoutParams); - edittext.setId(4); + edittext.setId(Integer.valueOf(4)); edittext.setSingleLine(true); edittext.setText(url); edittext.setInputType(InputType.TYPE_TEXT_VARIATION_URI); @@ -614,22 +669,24 @@ public class InAppBrowser extends CordovaPlugin { }); // Close/Done button - Button close = new Button(cordova.getActivity()); + ImageButton close = new ImageButton(cordova.getActivity()); RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); close.setLayoutParams(closeLayoutParams); forward.setContentDescription("Close Button"); - close.setId(5); + close.setId(Integer.valueOf(5)); int closeResId = activityRes.getIdentifier("ic_action_remove", "drawable", cordova.getActivity().getPackageName()); Drawable closeIcon = activityRes.getDrawable(closeResId); - if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) - { - close.setBackgroundDrawable(closeIcon); - } + if (Build.VERSION.SDK_INT >= 16) + close.setBackground(null); else - { - close.setBackground(closeIcon); - } + close.setBackgroundDrawable(null); + close.setImageDrawable(closeIcon); + close.setScaleType(ImageView.ScaleType.FIT_CENTER); + back.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10)); + if (Build.VERSION.SDK_INT >= 16) + close.getAdjustViewBounds(); + close.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { closeDialog(); @@ -639,6 +696,7 @@ public class InAppBrowser extends CordovaPlugin { // WebView inAppWebView = new WebView(cordova.getActivity()); inAppWebView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + inAppWebView.setId(Integer.valueOf(6)); inAppWebView.setWebChromeClient(new InAppChromeClient(thatWebView)); WebViewClient client = new InAppBrowserClient(thatWebView, edittext); inAppWebView.setWebViewClient(client); @@ -648,6 +706,20 @@ public class InAppBrowser extends CordovaPlugin { settings.setBuiltInZoomControls(showZoomControls); settings.setPluginState(android.webkit.WebSettings.PluginState.ON); + if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { + settings.setMediaPlaybackRequiresUserGesture(mediaPlaybackRequiresUserGesture); + } + + String overrideUserAgent = preferences.getString("OverrideUserAgent", null); + String appendUserAgent = preferences.getString("AppendUserAgent", null); + + if (overrideUserAgent != null) { + settings.setUserAgentString(overrideUserAgent); + } + if (appendUserAgent != null) { + settings.setUserAgentString(settings.getUserAgentString() + appendUserAgent); + } + //Toggle whether this is enabled or not! Bundle appSettings = cordova.getActivity().getIntent().getExtras(); boolean enableDatabase = appSettings == null ? true : appSettings.getBoolean("InAppBrowserStorageEnabled", true); @@ -665,7 +737,7 @@ public class InAppBrowser extends CordovaPlugin { } inAppWebView.loadUrl(url); - inAppWebView.setId(6); + inAppWebView.setId(Integer.valueOf(6)); inAppWebView.getSettings().setLoadWithOverviewMode(true); inAppWebView.getSettings().setUseWideViewPort(true); inAppWebView.requestFocus(); @@ -753,34 +825,30 @@ public class InAppBrowser extends CordovaPlugin { } /** - * Notify the host application that a page has started loading. + * Override the URL that should be loaded + * + * This handles a small subset of all the URIs that would be encountered. * - * @param view The webview initiating the callback. - * @param url The url of the page. + * @param webView + * @param url */ @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - super.onPageStarted(view, url, favicon); - String newloc = ""; - if (url.startsWith("http:") || url.startsWith("https:") || url.startsWith("file:")) { - newloc = url; - } - // If dialing phone (tel:5551212) - else if (url.startsWith(WebView.SCHEME_TEL)) { + public boolean shouldOverrideUrlLoading(WebView webView, String url) { + if (url.startsWith(WebView.SCHEME_TEL)) { try { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse(url)); cordova.getActivity().startActivity(intent); + return true; } catch (android.content.ActivityNotFoundException e) { LOG.e(LOG_TAG, "Error dialing " + url + ": " + e.toString()); } - } - - else if (url.startsWith("geo:") || url.startsWith(WebView.SCHEME_MAILTO) || url.startsWith("market:")) { + } else if (url.startsWith("geo:") || url.startsWith(WebView.SCHEME_MAILTO) || url.startsWith("market:") || url.startsWith("intent:")) { try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); cordova.getActivity().startActivity(intent); + return true; } catch (android.content.ActivityNotFoundException e) { LOG.e(LOG_TAG, "Error with " + url + ": " + e.toString()); } @@ -795,8 +863,7 @@ public class InAppBrowser extends CordovaPlugin { int parmIndex = url.indexOf('?'); if (parmIndex == -1) { address = url.substring(4); - } - else { + } else { address = url.substring(4, parmIndex); // If body, then set sms body @@ -812,32 +879,64 @@ public class InAppBrowser extends CordovaPlugin { intent.putExtra("address", address); intent.setType("vnd.android-dir/mms-sms"); cordova.getActivity().startActivity(intent); + return true; } catch (android.content.ActivityNotFoundException e) { LOG.e(LOG_TAG, "Error sending sms " + url + ":" + e.toString()); } } - else { + return false; + } + + + /* + * onPageStarted fires the LOAD_START_EVENT + * + * @param view + * @param url + * @param favicon + */ + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + String newloc = ""; + if (url.startsWith("http:") || url.startsWith("https:") || url.startsWith("file:")) { + newloc = url; + } + else + { + // Assume that everything is HTTP at this point, because if we don't specify, + // it really should be. Complain loudly about this!!! + LOG.e(LOG_TAG, "Possible Uncaught/Unknown URI"); newloc = "http://" + url; } + // Update the UI if we haven't already if (!newloc.equals(edittext.getText().toString())) { edittext.setText(newloc); - } + } try { JSONObject obj = new JSONObject(); obj.put("type", LOAD_START_EVENT); obj.put("url", newloc); - sendUpdate(obj, true); } catch (JSONException ex) { - Log.d(LOG_TAG, "Should never happen"); + LOG.e(LOG_TAG, "URI passed in has caused a JSON error."); } } + + public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); + // CB-10395 InAppBrowser's WebView not storing cookies reliable to local device storage + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + CookieManager.getInstance().flush(); + } else { + CookieSyncManager.getInstance().sync(); + } + try { JSONObject obj = new JSONObject(); obj.put("type", LOAD_STOP_EVENT); @@ -845,7 +944,7 @@ public class InAppBrowser extends CordovaPlugin { sendUpdate(obj, true); } catch (JSONException ex) { - Log.d(LOG_TAG, "Should never happen"); + LOG.d(LOG_TAG, "Should never happen"); } } @@ -861,9 +960,46 @@ public class InAppBrowser extends CordovaPlugin { sendUpdate(obj, true, PluginResult.Status.ERROR); } catch (JSONException ex) { - Log.d(LOG_TAG, "Should never happen"); + LOG.d(LOG_TAG, "Should never happen"); } } + + /** + * On received http auth request. + */ + @Override + public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { + + // Check if there is some plugin which can resolve this auth challenge + PluginManager pluginManager = null; + try { + Method gpm = webView.getClass().getMethod("getPluginManager"); + pluginManager = (PluginManager)gpm.invoke(webView); + } catch (NoSuchMethodException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } catch (IllegalAccessException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } catch (InvocationTargetException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } + + if (pluginManager == null) { + try { + Field pmf = webView.getClass().getField("pluginManager"); + pluginManager = (PluginManager)pmf.get(webView); + } catch (NoSuchFieldException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } catch (IllegalAccessException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } + } + + if (pluginManager != null && pluginManager.onReceivedHttpAuthRequest(webView, new CordovaHttpAuthHandler(handler), host, realm)) { + return; + } + + // By default handle 401 like we'd normally do! + super.onReceivedHttpAuthRequest(view, handler, host, realm); + } } } - diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowserDialog.java b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowserDialog.java index d7017202..e7b212f2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowserDialog.java +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppBrowserDialog.java @@ -21,7 +21,6 @@ package org.apache.cordova.inappbrowser; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; -import android.util.Log; import org.json.JSONException; import org.json.JSONObject; diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppChromeClient.java b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppChromeClient.java index a2145e6a..a2145e6a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppChromeClient.java +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/InAppChromeClient.java diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_next_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_next_item.png Binary files differindex fa469d88..fa469d88 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_next_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_next_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_previous_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_previous_item.png Binary files differindex e861ecce..e861ecce 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_previous_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_previous_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_remove.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_remove.png Binary files differindex f889617e..f889617e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_remove.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-hdpi/ic_action_remove.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_next_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_next_item.png Binary files differindex 47365a30..47365a30 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_next_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_next_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_previous_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_previous_item.png Binary files differindex 4ad2df42..4ad2df42 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_previous_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_previous_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_remove.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_remove.png Binary files differindex e84853e4..e84853e4 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_remove.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-mdpi/ic_action_remove.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_next_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_next_item.png Binary files differindex 5f304742..5f304742 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_next_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_next_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_previous_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_previous_item.png Binary files differindex ed8ac91d..ed8ac91d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_previous_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_previous_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_remove.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_remove.png Binary files differindex 4cd0458b..4cd0458b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_remove.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xhdpi/ic_action_remove.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_next_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_next_item.png Binary files differindex 51479d8d..51479d8d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_next_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_next_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_previous_item.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_previous_item.png Binary files differindex bc8ff124..bc8ff124 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_previous_item.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_previous_item.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_remove.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_remove.png Binary files differindex 331c545b..331c545b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_remove.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/android/res/drawable-xxhdpi/ic_action_remove.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/README.md index f0fa8607..f0fa8607 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/de/README.md index e3944876..e3944876 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/de/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/de/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/es/README.md index 75303369..75303369 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/es/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/es/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/fr/README.md index 179bd483..179bd483 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/fr/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/fr/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/it/README.md index 8f0623df..8f0623df 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/it/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/it/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ja/README.md index b9e4b7b7..b9e4b7b7 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ja/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ja/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ko/README.md index 67fb8de3..67fb8de3 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ko/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/ko/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/pl/README.md index ef199ee9..ef199ee9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/pl/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/pl/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/zh/README.md index 241fb550..241fb550 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/zh/README.md +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/blackberry10/doc/zh/README.md diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/browser/InAppBrowserProxy.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/browser/InAppBrowserProxy.js index 33fbe476..da7dacd3 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/browser/InAppBrowserProxy.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/browser/InAppBrowserProxy.js @@ -19,9 +19,7 @@ * */ -var cordova = require('cordova'), - channel = require('cordova/channel'), - urlutil = require('cordova/urlutil'); +var modulemapper = require('cordova/modulemapper'); var browserWrap, popup, @@ -68,19 +66,23 @@ var IAB = { open: function (win, lose, args) { var strUrl = args[0], target = args[1], - features = args[2], - url; + features = args[2]; - if (target === "_system" || target === "_self" || !target) { + if (target === "_self" || !target) { window.location = strUrl; + } else if (target === "_system") { + modulemapper.getOriginalSymbol(window, 'window.open').call(window, strUrl, "_blank"); } else { // "_blank" or anything else if (!browserWrap) { browserWrap = document.createElement("div"); browserWrap.style.position = "absolute"; + browserWrap.style.top = "0"; + browserWrap.style.left = "0"; + browserWrap.style.boxSizing = "border-box"; browserWrap.style.borderWidth = "40px"; - browserWrap.style.width = "calc(100% - 80px)"; - browserWrap.style.height = "calc(100% - 80px)"; + browserWrap.style.width = "100vw"; + browserWrap.style.height = "100vh"; browserWrap.style.borderStyle = "solid"; browserWrap.style.borderColor = "rgba(0,0,0,0.25)"; @@ -105,6 +107,7 @@ var IAB = { if (features.indexOf("location=yes") !== -1 || features.indexOf("location") === -1) { popup.style.height = "calc(100% - 60px)"; + popup.style.marginBottom = "-4px"; navigationButtonsDiv = document.createElement("div"); navigationButtonsDiv.style.height = "60px"; @@ -190,7 +193,9 @@ var IAB = { if (browserWrap && popup) { try { popup.contentWindow.eval(code); - hasCallback && win([]); + if (hasCallback) { + win([]); + } } catch(e) { console.error('Error occured while trying to injectScriptCode: ' + JSON.stringify(e)); } @@ -200,19 +205,25 @@ var IAB = { injectScriptFile: function (win, fail, args) { var msg = 'Browser cordova-plugin-inappbrowser injectScriptFile is not yet implemented'; console.warn(msg); - fail && fail(msg); + if (fail) { + fail(msg); + } }, injectStyleCode: function (win, fail, args) { var msg = 'Browser cordova-plugin-inappbrowser injectStyleCode is not yet implemented'; console.warn(msg); - fail && fail(msg); + if (fail) { + fail(msg); + } }, injectStyleFile: function (win, fail, args) { var msg = 'Browser cordova-plugin-inappbrowser injectStyleFile is not yet implemented'; console.warn(msg); - fail && fail(msg); + if (fail) { + fail(msg); + } } }; diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/firefoxos/InAppBrowserProxy.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/firefoxos/InAppBrowserProxy.js index f0d44c12..c09e3583 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/firefoxos/InAppBrowserProxy.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/firefoxos/InAppBrowserProxy.js @@ -21,9 +21,7 @@ // https://developer.mozilla.org/en-US/docs/WebAPI/Browser -var cordova = require('cordova'), - channel = require('cordova/channel'), - modulemapper = require('cordova/modulemapper'); +var modulemapper = require('cordova/modulemapper'); var origOpenFunc = modulemapper.getOriginalSymbol(window, 'window.open'); var browserWrap; @@ -49,9 +47,7 @@ var IABExecs = { var strUrl = args[0], target = args[1], features_string = args[2] || "location=yes", //location=yes is default - features = {}, - url, - elem; + features = {}; var features_list = features_string.split(','); features_list.forEach(function(feature) { @@ -61,7 +57,7 @@ var IABExecs = { } else if (tup[1] == 'no') { tup[1] = false; } else { - var number = parseInt(tup[1]); + var number = parseInt(tup[1]); if (!isNaN(number)) { tup[1] = number; } @@ -115,7 +111,7 @@ var IABExecs = { back.classList.add('inAppBrowserBack'); forward.classList.add('inAppBrowserForward'); - function checkForwardBackward() { + var checkForwardBackward = function () { var backReq = browserElem.getCanGoBack(); backReq.onsuccess = function() { if (this.result) { @@ -123,7 +119,7 @@ var IABExecs = { } else { back.classList.add('disabled'); } - } + }; var forwardReq = browserElem.getCanGoForward(); forwardReq.onsuccess = function() { if (this.result) { @@ -131,7 +127,7 @@ var IABExecs = { } else { forward.classList.add('disabled'); } - } + }; }; browserElem.addEventListener('mozbrowserloadend', checkForwardBackward); @@ -163,16 +159,16 @@ var IABExecs = { win({ type:'loadstart', url : e.detail - }) + }); }, false); browserElem.addEventListener('mozbrowserloadend', function(e){ - win({type:'loadstop'}) + win({type:'loadstop'}); }, false); browserElem.addEventListener('mozbrowsererror', function(e){ - win({type:'loaderror'}) + win({type:'loaderror'}); }, false); browserElem.addEventListener('mozbrowserclose', function(e){ - win({type:'exit'}) + win({type:'exit'}); }, false); } else { window.location = strUrl; diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.h b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.h index 1ccc7b14..6bb0ec16 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.h +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.h @@ -30,7 +30,6 @@ @class CDVInAppBrowserViewController; @interface CDVInAppBrowser : CDVPlugin { - BOOL _injectedIframeBridge; } @property (nonatomic, retain) CDVInAppBrowserViewController* inAppBrowserViewController; diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.m b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.m index 47a8ab3a..b342ca73 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.m +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ios/CDVInAppBrowser.m @@ -47,6 +47,11 @@ _callbackIdPattern = nil; } +- (id)settingForKey:(NSString*)key +{ + return [self.commandDelegate.settings objectForKey:[key lowercaseString]]; +} + - (void)onReset { [self close:nil]; @@ -137,8 +142,16 @@ } if (self.inAppBrowserViewController == nil) { - NSString* originalUA = [CDVUserAgentUtil originalUserAgent]; - self.inAppBrowserViewController = [[CDVInAppBrowserViewController alloc] initWithUserAgent:originalUA prevUserAgent:[self.commandDelegate userAgent] browserOptions: browserOptions]; + NSString* userAgent = [CDVUserAgentUtil originalUserAgent]; + NSString* overrideUserAgent = [self settingForKey:@"OverrideUserAgent"]; + NSString* appendUserAgent = [self settingForKey:@"AppendUserAgent"]; + if(overrideUserAgent){ + userAgent = overrideUserAgent; + } + if(appendUserAgent){ + userAgent = [userAgent stringByAppendingString: appendUserAgent]; + } + self.inAppBrowserViewController = [[CDVInAppBrowserViewController alloc] initWithUserAgent:userAgent prevUserAgent:[self.commandDelegate userAgent] browserOptions: browserOptions]; self.inAppBrowserViewController.navigationDelegate = self; if ([self.viewController conformsToProtocol:@protocol(CDVScreenOrientationDelegate)]) { @@ -218,6 +231,7 @@ initWithRootViewController:self.inAppBrowserViewController]; nav.orientationDelegate = self.inAppBrowserViewController; nav.navigationBarHidden = YES; + nav.modalPresentationStyle = self.inAppBrowserViewController.modalPresentationStyle; __weak CDVInAppBrowser* weakSelf = self; @@ -231,25 +245,25 @@ - (void)openInCordovaWebView:(NSURL*)url withOptions:(NSString*)options { - if ([self.commandDelegate URLIsWhitelisted:url]) { - NSURLRequest* request = [NSURLRequest requestWithURL:url]; + NSURLRequest* request = [NSURLRequest requestWithURL:url]; + #ifdef __CORDOVA_4_0_0 - [self.webViewEngine loadRequest:request]; + // the webview engine itself will filter for this according to <allow-navigation> policy + // in config.xml for cordova-ios-4.0 + [self.webViewEngine loadRequest:request]; #else + if ([self.commandDelegate URLIsWhitelisted:url]) { [self.webView loadRequest:request]; -#endif } else { // this assumes the InAppBrowser can be excepted from the white-list [self openInInAppBrowser:url withOptions:options]; } +#endif } - (void)openInSystem:(NSURL*)url { - if ([[UIApplication sharedApplication] canOpenURL:url]) { - [[UIApplication sharedApplication] openURL:url]; - } else { // handle any custom schemes to plugins - [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]]; - } + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]]; + [[UIApplication sharedApplication] openURL:url]; } // This is a helper method for the inject{Script|Style}{Code|File} API calls, which @@ -263,11 +277,8 @@ - (void)injectDeferredObject:(NSString*)source withWrapper:(NSString*)jsWrapper { - if (!_injectedIframeBridge) { - _injectedIframeBridge = YES; - // Create an iframe bridge in the new document to communicate with the CDVInAppBrowserViewController - [self.inAppBrowserViewController.webView stringByEvaluatingJavaScriptFromString:@"(function(d){var e = _cdvIframeBridge = d.createElement('iframe');e.style.display='none';d.body.appendChild(e);})(document)"]; - } + // Ensure an iframe bridge is created to communicate with the CDVInAppBrowserViewController + [self.inAppBrowserViewController.webView stringByEvaluatingJavaScriptFromString:@"(function(d){_cdvIframeBridge=d.getElementById('_cdvIframeBridge');if(!_cdvIframeBridge) {var e = _cdvIframeBridge = d.createElement('iframe');e.id='_cdvIframeBridge'; e.style.display='none';d.body.appendChild(e);}})(document)"]; if (jsWrapper != nil) { NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@[source] options:0 error:nil]; @@ -390,7 +401,14 @@ [self.commandDelegate sendPluginResult:pluginResult callbackId:scriptCallbackId]; return NO; } - } else if ((self.callbackId != nil) && isTopLevelNavigation) { + } + //if is an app store link, let the system handle it, otherwise it fails to load it + else if ([[ url scheme] isEqualToString:@"itms-appss"] || [[ url scheme] isEqualToString:@"itms-apps"]) { + [theWebView stopLoading]; + [self openInSystem:url]; + return NO; + } + else if ((self.callbackId != nil) && isTopLevelNavigation) { // Send a loadstart event for each top-level navigation (includes redirects). CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:@{@"type":@"loadstart", @"url":[url absoluteString]}]; @@ -404,7 +422,6 @@ - (void)webViewDidStartLoad:(UIWebView*)theWebView { - _injectedIframeBridge = NO; } - (void)webViewDidFinishLoad:(UIWebView*)theWebView @@ -512,15 +529,15 @@ self.webView.scalesPageToFit = NO; self.webView.userInteractionEnabled = YES; - self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; + self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; self.spinner.alpha = 1.000; self.spinner.autoresizesSubviews = YES; - self.spinner.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin; + self.spinner.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin); self.spinner.clearsContextBeforeDrawing = NO; self.spinner.clipsToBounds = NO; self.spinner.contentMode = UIViewContentModeScaleToFill; - self.spinner.frame = CGRectMake(454.0, 231.0, 20.0, 20.0); - self.spinner.hidden = YES; + self.spinner.frame = CGRectMake(CGRectGetMidX(self.webView.frame), CGRectGetMidY(self.webView.frame), 20.0, 20.0); + self.spinner.hidden = NO; self.spinner.hidesWhenStopped = YES; self.spinner.multipleTouchEnabled = NO; self.spinner.opaque = NO; @@ -749,6 +766,10 @@ return UIStatusBarStyleDefault; } +- (BOOL)prefersStatusBarHidden { + return NO; +} + - (void)close { [CDVUserAgentUtil releaseLock:&_userAgentLockToken]; @@ -988,19 +1009,38 @@ @implementation CDVInAppBrowserNavigationController : UINavigationController +- (void) dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { + if ( self.presentedViewController) { + [super dismissViewControllerAnimated:flag completion:completion]; + } +} + - (void) viewDidLoad { CGRect frame = [UIApplication sharedApplication].statusBarFrame; // simplified from: http://stackoverflow.com/a/25669695/219684 - UIToolbar* bgToolbar = [[UIToolbar alloc] initWithFrame:frame]; + UIToolbar* bgToolbar = [[UIToolbar alloc] initWithFrame:[self invertFrameIfNeeded:frame]]; bgToolbar.barStyle = UIBarStyleDefault; + [bgToolbar setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; [self.view addSubview:bgToolbar]; [super viewDidLoad]; } +- (CGRect) invertFrameIfNeeded:(CGRect)rect { + // We need to invert since on iOS 7 frames are always in Portrait context + if (!IsAtLeastiOSVersion(@"8.0")) { + if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { + CGFloat temp = rect.size.width; + rect.size.width = rect.size.height; + rect.size.height = temp; + } + rect.origin = CGPointZero; + } + return rect; +} #pragma mark CDVScreenOrientationDelegate diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser.qml b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser.qml index 781e8a6e..781e8a6e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser.qml +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser.qml diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser_escapeScript.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser_escapeScript.js index 07661bb6..b01daeb5 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser_escapeScript.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/InAppBrowser_escapeScript.js @@ -19,6 +19,9 @@ * */ +/* jshint -W061 */ +/* global oxide */ + oxide.addMessageHandler("EXECUTE", function(msg) { var code = msg.args.code; try { diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/close.png b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/close.png Binary files differindex 56373d1f..56373d1f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/close.png +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/close.png diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.cpp b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.cpp index c5a9e64a..c5a9e64a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.cpp +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.cpp diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.h b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.h index 1da4e033..1da4e033 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.h +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/ubuntu/inappbrowser.h diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/windows/InAppBrowserProxy.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/windows/InAppBrowserProxy.js index fc037bdb..23f6e547 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/windows/InAppBrowserProxy.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/windows/InAppBrowserProxy.js @@ -19,13 +19,10 @@ * */ -/*jslint sloppy:true */ -/*global Windows:true, require, document, setTimeout, window, module */ - - +/* jslint sloppy:true */ +/* global Windows:true, setImmediate */ var cordova = require('cordova'), - channel = require('cordova/channel'), urlutil = require('cordova/urlutil'); var browserWrap, @@ -35,11 +32,13 @@ var browserWrap, backButton, forwardButton, closeButton, - bodyOverflowStyle; + bodyOverflowStyle, + navigationEventsCallback, + hardwareBackCallback; // x-ms-webview is available starting from Windows 8.1 (platformId is 'windows') // http://msdn.microsoft.com/en-us/library/windows/apps/dn301831.aspx -var isWebViewAvailable = cordova.platformId == 'windows'; +var isWebViewAvailable = cordova.platformId === 'windows'; function attachNavigationEvents(element, callback) { if (isWebViewAvailable) { @@ -48,19 +47,32 @@ function attachNavigationEvents(element, callback) { }); element.addEventListener("MSWebViewNavigationCompleted", function (e) { - callback({ type: e.isSuccess ? "loadstop" : "loaderror", url: e.uri}, {keepCallback: true}); + if (e.isSuccess) { + callback({ type: "loadstop", url: e.uri }, { keepCallback: true }); + } else { + callback({ type: "loaderror", url: e.uri, code: e.webErrorStatus, message: "Navigation failed with error code " + e.webErrorStatus}, { keepCallback: true }); + } }); element.addEventListener("MSWebViewUnviewableContentIdentified", function (e) { // WebView found the content to be not HTML. // http://msdn.microsoft.com/en-us/library/windows/apps/dn609716.aspx - callback({ type: "loaderror", url: e.uri}, {keepCallback: true}); + callback({ type: "loaderror", url: e.uri, code: e.webErrorStatus, message: "Navigation failed with error code " + e.webErrorStatus}, { keepCallback: true }); }); element.addEventListener("MSWebViewContentLoading", function (e) { - if (navigationButtonsDiv) { - backButton.disabled = !popup.canGoBack; - forwardButton.disabled = !popup.canGoForward; + if (navigationButtonsDiv && popup) { + if (popup.canGoBack) { + backButton.removeAttribute("disabled"); + } else { + backButton.setAttribute("disabled", "true"); + } + + if (popup.canGoForward) { + forwardButton.removeAttribute("disabled"); + } else { + forwardButton.setAttribute("disabled", "true"); + } } }); } else { @@ -83,228 +95,266 @@ function attachNavigationEvents(element, callback) { var IAB = { close: function (win, lose) { - if (browserWrap) { - if (win) win({ type: "exit" }); + setImmediate(function () { + if (browserWrap) { + if (navigationEventsCallback) { + navigationEventsCallback({ type: "exit" }); + } - browserWrap.parentNode.removeChild(browserWrap); - // Reset body overflow style to initial value - document.body.style.msOverflowStyle = bodyOverflowStyle; - browserWrap = null; - popup = null; - } + browserWrap.parentNode.removeChild(browserWrap); + // Reset body overflow style to initial value + document.body.style.msOverflowStyle = bodyOverflowStyle; + browserWrap = null; + popup = null; + + document.removeEventListener("backbutton", hardwareBackCallback, false); + } + }); }, show: function (win, lose) { - if (browserWrap) { - browserWrap.style.display = "block"; - } + setImmediate(function () { + if (browserWrap) { + browserWrap.style.display = "block"; + } + }); }, open: function (win, lose, args) { - var strUrl = args[0], - target = args[1], - features = args[2], - url; + // make function async so that we can add navigation events handlers before view is loaded and navigation occured + setImmediate(function () { + var strUrl = args[0], + target = args[1], + features = args[2], + url; - if (target === "_system") { - url = new Windows.Foundation.Uri(strUrl); - Windows.System.Launcher.launchUriAsync(url); - } else if (target === "_self" || !target) { - window.location = strUrl; - } else { - // "_blank" or anything else - if (!browserWrap) { - var browserWrapStyle = document.createElement('link'); - browserWrapStyle.rel = "stylesheet"; - browserWrapStyle.type = "text/css"; - browserWrapStyle.href = urlutil.makeAbsolute("/www/css/inappbrowser.css"); + navigationEventsCallback = win; - document.head.appendChild(browserWrapStyle); + if (target === "_system") { + url = new Windows.Foundation.Uri(strUrl); + Windows.System.Launcher.launchUriAsync(url); + } else if (target === "_self" || !target) { + window.location = strUrl; + } else { + // "_blank" or anything else + if (!browserWrap) { + var browserWrapStyle = document.createElement('link'); + browserWrapStyle.rel = "stylesheet"; + browserWrapStyle.type = "text/css"; + browserWrapStyle.href = urlutil.makeAbsolute("/www/css/inappbrowser.css"); - browserWrap = document.createElement("div"); - browserWrap.className = "inAppBrowserWrap"; + document.head.appendChild(browserWrapStyle); - if (features.indexOf("fullscreen=yes") > -1) { - browserWrap.classList.add("inAppBrowserWrapFullscreen"); - } + browserWrap = document.createElement("div"); + browserWrap.className = "inAppBrowserWrap"; - // Save body overflow style to be able to reset it back later - bodyOverflowStyle = document.body.style.msOverflowStyle; + if (features.indexOf("fullscreen=yes") > -1) { + browserWrap.classList.add("inAppBrowserWrapFullscreen"); + } - browserWrap.onclick = function () { - setTimeout(function () { - IAB.close(win); - }, 0); - }; + // Save body overflow style to be able to reset it back later + bodyOverflowStyle = document.body.style.msOverflowStyle; - document.body.appendChild(browserWrap); - // Hide scrollbars for the whole body while inappbrowser's window is open - document.body.style.msOverflowStyle = "none"; - } + browserWrap.onclick = function () { + setTimeout(function () { + IAB.close(navigationEventsCallback); + }, 0); + }; - if (features.indexOf("hidden=yes") !== -1) { - browserWrap.style.display = "none"; - } + document.body.appendChild(browserWrap); + // Hide scrollbars for the whole body while inappbrowser's window is open + document.body.style.msOverflowStyle = "none"; + } - popup = document.createElement(isWebViewAvailable ? "x-ms-webview" : "iframe"); - if (popup instanceof HTMLIFrameElement) { - // For iframe we need to override bacground color of parent element here - // otherwise pages without background color set will have transparent background - popup.style.backgroundColor = "white"; - } - popup.style.borderWidth = "0px"; - popup.style.width = "100%"; + if (features.indexOf("hidden=yes") !== -1) { + browserWrap.style.display = "none"; + } - browserWrap.appendChild(popup); + popup = document.createElement(isWebViewAvailable ? "x-ms-webview" : "iframe"); + if (popup instanceof HTMLIFrameElement) { + // For iframe we need to override bacground color of parent element here + // otherwise pages without background color set will have transparent background + popup.style.backgroundColor = "white"; + } + popup.style.borderWidth = "0px"; + popup.style.width = "100%"; + popup.style.marginBottom = "-3px"; - if (features.indexOf("location=yes") !== -1 || features.indexOf("location") === -1) { - popup.style.height = "calc(100% - 60px)"; + browserWrap.appendChild(popup); - navigationButtonsDiv = document.createElement("div"); - navigationButtonsDiv.style.height = "60px"; - navigationButtonsDiv.style.backgroundColor = "#404040"; - navigationButtonsDiv.style.zIndex = "999"; - navigationButtonsDiv.onclick = function (e) { - e.cancelBubble = true; + var closeHandler = function (e) { + setTimeout(function () { + IAB.close(navigationEventsCallback); + }, 0); }; - navigationButtonsDivInner = document.createElement("div"); - navigationButtonsDivInner.style.paddingTop = "10px"; - navigationButtonsDivInner.style.height = "50px"; - navigationButtonsDivInner.style.width = "160px"; - navigationButtonsDivInner.style.margin = "0 auto"; - navigationButtonsDivInner.style.backgroundColor = "#404040"; - navigationButtonsDivInner.style.zIndex = "999"; - navigationButtonsDivInner.onclick = function (e) { - e.cancelBubble = true; - }; + if (features.indexOf("hardwareback=yes") > -1 || features.indexOf("hardwareback") === -1) { + hardwareBackCallback = function () { + if (browserWrap.style.display === 'none') { + // NOTE: backbutton handlers have to throw an exception in order to prevent + // returning 'true' inside cordova-js, which would mean that the event is handled by user. + // Throwing an exception means that the default/system navigation behavior will take place, + // which is to exit the app if the navigation stack is empty. + throw 'Exit the app'; + } + if (popup.canGoBack) { + popup.goBack(); + } else { + closeHandler(); + } + }; + } else if (features.indexOf("hardwareback=no") > -1) { + hardwareBackCallback = function () { + if (browserWrap.style.display === 'none') { + // See comment above + throw 'Exit the app'; + } - backButton = document.createElement("button"); - backButton.style.width = "40px"; - backButton.style.height = "40px"; - backButton.style.borderRadius = "40px"; + closeHandler(); + }; + } - backButton.innerText = "<-"; - backButton.addEventListener("click", function (e) { - if (popup.canGoBack) - popup.goBack(); - }); + document.addEventListener("backbutton", hardwareBackCallback, false); - forwardButton = document.createElement("button"); - forwardButton.style.marginLeft = "20px"; - forwardButton.style.width = "40px"; - forwardButton.style.height = "40px"; - forwardButton.style.borderRadius = "40px"; + if (features.indexOf("location=yes") !== -1 || features.indexOf("location") === -1) { + popup.style.height = "calc(100% - 70px)"; - forwardButton.innerText = "->"; - forwardButton.addEventListener("click", function (e) { - if (popup.canGoForward) - popup.goForward(); - }); + navigationButtonsDiv = document.createElement("div"); + navigationButtonsDiv.className = "inappbrowser-app-bar"; + navigationButtonsDiv.onclick = function (e) { + e.cancelBubble = true; + }; - closeButton = document.createElement("button"); - closeButton.style.marginLeft = "20px"; - closeButton.style.width = "40px"; - closeButton.style.height = "40px"; - closeButton.style.borderRadius = "40px"; + navigationButtonsDivInner = document.createElement("div"); + navigationButtonsDivInner.className = "inappbrowser-app-bar-inner"; + navigationButtonsDivInner.onclick = function (e) { + e.cancelBubble = true; + }; - closeButton.innerText = "x"; - closeButton.addEventListener("click", function (e) { - setTimeout(function () { - IAB.close(win); - }, 0); - }); + backButton = document.createElement("div"); + backButton.innerText = "back"; + backButton.className = "app-bar-action action-back"; + backButton.addEventListener("click", function (e) { + if (popup.canGoBack) + popup.goBack(); + }); - if (!isWebViewAvailable) { - // iframe navigation is not yet supported - backButton.disabled = true; - forwardButton.disabled = true; - } + forwardButton = document.createElement("div"); + forwardButton.innerText = "forward"; + forwardButton.className = "app-bar-action action-forward"; + forwardButton.addEventListener("click", function (e) { + if (popup.canGoForward) + popup.goForward(); + }); - navigationButtonsDivInner.appendChild(backButton); - navigationButtonsDivInner.appendChild(forwardButton); - navigationButtonsDivInner.appendChild(closeButton); - navigationButtonsDiv.appendChild(navigationButtonsDivInner); + closeButton = document.createElement("div"); + closeButton.innerText = "close"; + closeButton.className = "app-bar-action action-close"; + closeButton.addEventListener("click", closeHandler); - browserWrap.appendChild(navigationButtonsDiv); - } else { - popup.style.height = "100%"; - } + if (!isWebViewAvailable) { + // iframe navigation is not yet supported + backButton.setAttribute("disabled", "true"); + forwardButton.setAttribute("disabled", "true"); + } - // start listening for navigation events - attachNavigationEvents(popup, win); + navigationButtonsDivInner.appendChild(backButton); + navigationButtonsDivInner.appendChild(forwardButton); + navigationButtonsDivInner.appendChild(closeButton); + navigationButtonsDiv.appendChild(navigationButtonsDivInner); - if (isWebViewAvailable) { - strUrl = strUrl.replace("ms-appx://", "ms-appx-web://"); + browserWrap.appendChild(navigationButtonsDiv); + } else { + popup.style.height = "100%"; + } + + // start listening for navigation events + attachNavigationEvents(popup, navigationEventsCallback); + + if (isWebViewAvailable) { + strUrl = strUrl.replace("ms-appx://", "ms-appx-web://"); + } + popup.src = strUrl; } - popup.src = strUrl; - } + }); }, injectScriptCode: function (win, fail, args) { - var code = args[0], - hasCallback = args[1]; + setImmediate(function () { + var code = args[0], + hasCallback = args[1]; - if (isWebViewAvailable && browserWrap && popup) { - var op = popup.invokeScriptAsync("eval", code); - op.oncomplete = function (e) { - // return null if event target is unavailable by some reason - var result = (e && e.target) ? [e.target.result] : [null]; - hasCallback && win(result); - }; - op.onerror = function () { }; - op.start(); - } + if (isWebViewAvailable && browserWrap && popup) { + var op = popup.invokeScriptAsync("eval", code); + op.oncomplete = function (e) { + if (hasCallback) { + // return null if event target is unavailable by some reason + var result = (e && e.target) ? [e.target.result] : [null]; + win(result); + } + }; + op.onerror = function () { }; + op.start(); + } + }); }, injectScriptFile: function (win, fail, args) { - var filePath = args[0], - hasCallback = args[1]; + setImmediate(function () { + var filePath = args[0], + hasCallback = args[1]; - if (!!filePath) { - filePath = urlutil.makeAbsolute(filePath); - } + if (!!filePath) { + filePath = urlutil.makeAbsolute(filePath); + } - if (isWebViewAvailable && browserWrap && popup) { - var uri = new Windows.Foundation.Uri(filePath); - Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).done(function (file) { - Windows.Storage.FileIO.readTextAsync(file).done(function (code) { - var op = popup.invokeScriptAsync("eval", code); - op.oncomplete = function(e) { - var result = [e.target.result]; - hasCallback && win(result); - }; - op.onerror = function () { }; - op.start(); + if (isWebViewAvailable && browserWrap && popup) { + var uri = new Windows.Foundation.Uri(filePath); + Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).done(function (file) { + Windows.Storage.FileIO.readTextAsync(file).done(function (code) { + var op = popup.invokeScriptAsync("eval", code); + op.oncomplete = function(e) { + if (hasCallback) { + var result = [e.target.result]; + win(result); + } + }; + op.onerror = function () { }; + op.start(); + }); }); - }); - } + } + }); }, injectStyleCode: function (win, fail, args) { - var code = args[0], - hasCallback = args[1]; + setImmediate(function () { + var code = args[0], + hasCallback = args[1]; - if (isWebViewAvailable && browserWrap && popup) { - injectCSS(popup, code, hasCallback && win); - } + if (isWebViewAvailable && browserWrap && popup) { + injectCSS(popup, code, hasCallback && win); + } + }); }, injectStyleFile: function (win, fail, args) { - var filePath = args[0], - hasCallback = args[1]; + setImmediate(function () { + var filePath = args[0], + hasCallback = args[1]; - filePath = filePath && urlutil.makeAbsolute(filePath); + filePath = filePath && urlutil.makeAbsolute(filePath); - if (isWebViewAvailable && browserWrap && popup) { - var uri = new Windows.Foundation.Uri(filePath); - Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(function (file) { - return Windows.Storage.FileIO.readTextAsync(file); - }).done(function (code) { - injectCSS(popup, code, hasCallback && win); - }, function () { - // no-op, just catch an error - }); - } + if (isWebViewAvailable && browserWrap && popup) { + var uri = new Windows.Foundation.Uri(filePath); + Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(function (file) { + return Windows.Storage.FileIO.readTextAsync(file); + }).done(function (code) { + injectCSS(popup, code, hasCallback && win); + }, function () { + // no-op, just catch an error + }); + } + }); } }; @@ -316,7 +366,9 @@ function injectCSS (webView, cssCode, callback) { var op = webView.invokeScriptAsync("eval", evalWrapper); op.oncomplete = function() { - callback && callback([]); + if (callback) { + callback([]); + } }; op.onerror = function () { }; op.start(); diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/wp/InAppBrowser.cs b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/wp/InAppBrowser.cs index ddb51227..ddb51227 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/src/wp/InAppBrowser.cs +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/src/wp/InAppBrowser.cs diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/plugin.xml index f4f3be36..2cccd40a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/plugin.xml @@ -20,10 +20,12 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-inappbrowser-tests" - version="1.1.0"> + version="1.5.0"> <name>Cordova InAppBrowser Plugin Tests</name> <license>Apache 2.0</license> + <dependency id="cordova-plugin-dialogs" /> + <js-module src="tests.js" name="tests"> </js-module> diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.css b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.css index 3f6e41c8..3f6e41c8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.css +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.css diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.html b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.html index 3004b358..3004b358 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.html +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.html diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.js index 6f254939..a89a4215 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/inject.js @@ -16,5 +16,5 @@ * specific language governing permissions and limitations * under the License. */ -var d = document.getElementById("header") +var d = document.getElementById("header"); d.innerHTML = "Script file successfully injected"; diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.html b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.html index d23a7144..d23a7144 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.html +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.html diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.pdf b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.pdf Binary files differindex b54f1b75..b54f1b75 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.pdf +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/local.pdf diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/video.html b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/video.html index 64ea3d11..4f167f8c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/video.html +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/resources/video.html @@ -38,5 +38,8 @@ <button onclick="document.getElementById('player').play()"> play </button> <button onclick="document.getElementById('player').pause()"> pause </button> </div> + <script> + document.getElementById('player').play(); + </script> </body> </html> diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/tests.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/tests.js index a8279868..1a96029d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/tests.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/tests/tests.js @@ -19,11 +19,118 @@ * */ +/* jshint jasmine: true */ +/* global MSApp */ + var cordova = require('cordova'); var isWindows = cordova.platformId == 'windows'; window.alert = window.alert || navigator.notification.alert; +exports.defineAutoTests = function () { + + describe('cordova.InAppBrowser', function () { + + it("inappbrowser.spec.1 should exist", function () { + expect(cordova.InAppBrowser).toBeDefined(); + }); + + it("inappbrowser.spec.2 should contain open function", function () { + expect(cordova.InAppBrowser.open).toBeDefined(); + expect(cordova.InAppBrowser.open).toEqual(jasmine.any(Function)); + }); + }); + + describe('open method', function () { + + var iabInstance; + var originalTimeout; + var url = 'https://dist.apache.org/repos/dist/dev/cordova/'; + var badUrl = 'http://bad-uri/'; + + beforeEach(function () { + // increase timeout to ensure test url could be loaded within test time + originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000; + + iabInstance = null; + }); + + afterEach(function (done) { + // restore original timeout + jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; + + if (iabInstance !== null && iabInstance.close) { + iabInstance.close(); + } + iabInstance = null; + // add some extra time so that iab dialog is closed + setTimeout(done, 2000); + }); + + function verifyEvent(evt, type) { + expect(evt).toBeDefined(); + expect(evt.type).toEqual(type); + if (type !== 'exit') { // `exit` event does not have url field + expect(evt.url).toEqual(url); + } + } + + function verifyLoadErrorEvent(evt) { + expect(evt).toBeDefined(); + expect(evt.type).toEqual('loaderror'); + expect(evt.url).toEqual(badUrl); + expect(evt.code).toEqual(jasmine.any(Number)); + expect(evt.message).toEqual(jasmine.any(String)); + } + + it("inappbrowser.spec.3 should retun InAppBrowser instance with required methods", function () { + iabInstance = cordova.InAppBrowser.open(url, '_blank'); + + expect(iabInstance).toBeDefined(); + + expect(iabInstance.addEventListener).toEqual(jasmine.any(Function)); + expect(iabInstance.removeEventListener).toEqual(jasmine.any(Function)); + expect(iabInstance.close).toEqual(jasmine.any(Function)); + expect(iabInstance.show).toEqual(jasmine.any(Function)); + expect(iabInstance.executeScript).toEqual(jasmine.any(Function)); + expect(iabInstance.insertCSS).toEqual(jasmine.any(Function)); + }); + + it("inappbrowser.spec.4 should support loadstart and loadstop events", function (done) { + var onLoadStart = jasmine.createSpy('loadstart event callback').and.callFake(function (evt) { + verifyEvent(evt, 'loadstart'); + }); + + iabInstance = cordova.InAppBrowser.open(url, '_blank'); + iabInstance.addEventListener('loadstart', onLoadStart); + iabInstance.addEventListener('loadstop', function (evt) { + verifyEvent(evt, 'loadstop'); + expect(onLoadStart).toHaveBeenCalled(); + done(); + }); + }); + + it("inappbrowser.spec.5 should support exit event", function (done) { + iabInstance = cordova.InAppBrowser.open(url, '_blank'); + iabInstance.addEventListener('exit', function (evt) { + verifyEvent(evt, 'exit'); + done(); + }); + iabInstance.close(); + iabInstance = null; + }); + + it("inappbrowser.spec.6 should support loaderror event", function (done) { + iabInstance = cordova.InAppBrowser.open(badUrl, '_blank'); + iabInstance.addEventListener('loaderror', function (evt) { + verifyLoadErrorEvent(evt); + done(); + }); + }); + }); +}; + exports.defineManualTests = function (contentEl, createActionButton) { function doOpen(url, target, params, numExpectedRedirects, useWindowOpen) { @@ -79,13 +186,13 @@ exports.defineManualTests = function (contentEl, createActionButton) { if (e.url != lastLoadStartURL) { alert('Unexpected: ' + e.type + ' event.url != loadstart\'s event.url'); } - if (numExpectedRedirects === 0 && counts['loadstart'] !== 1) { + if (numExpectedRedirects === 0 && counts.loadstart !== 1) { // Do allow a loaderror without a loadstart (e.g. in the case of an invalid URL). - if (!(e.type == 'loaderror' && counts['loadstart'] === 0)) { - alert('Unexpected: got multiple loadstart events. (' + counts['loadstart'] + ')'); + if (!(e.type == 'loaderror' && counts.loadstart === 0)) { + alert('Unexpected: got multiple loadstart events. (' + counts.loadstart + ')'); } - } else if (numExpectedRedirects > 0 && counts['loadstart'] < (numExpectedRedirects + 1)) { - alert('Unexpected: should have got at least ' + (numExpectedRedirects + 1) + ' loadstart events, but got ' + counts['loadstart']); + } else if (numExpectedRedirects > 0 && counts.loadstart < (numExpectedRedirects + 1)) { + alert('Unexpected: should have got at least ' + (numExpectedRedirects + 1) + ' loadstart events, but got ' + counts.loadstart); } wasReset = true; numExpectedRedirects = 0; @@ -93,7 +200,7 @@ exports.defineManualTests = function (contentEl, createActionButton) { } // Verify that loadend / loaderror was called. if (e.type == 'exit') { - var numStopEvents = counts['loadstop'] + counts['loaderror']; + var numStopEvents = counts.loadstop + counts.loaderror; if (numStopEvents === 0 && !wasReset) { alert('Unexpected: browser closed without a loadstop or loaderror.'); } else if (numStopEvents > 1) { @@ -319,7 +426,11 @@ exports.defineManualTests = function (contentEl, createActionButton) { var video_tag_tests = '<h1>Video tag</h1>' + '<div id="openRemoteVideo"></div>' + - 'Expected result: open successfully in InAppBrowser with an embedded video that works after clicking the "play" button.'; + 'Expected result: open successfully in InAppBrowser with an embedded video plays automatically on iOS and Android.' + + '<div id="openRemoteNeedUserNoVideo"></div>' + + 'Expected result: open successfully in InAppBrowser with an embedded video plays automatically on iOS and Android.' + + '<div id="openRemoteNeedUserYesVideo"></div>' + + 'Expected result: open successfully in InAppBrowser with an embedded video does not play automatically on iOS and Android but rather works after clicking the "play" button.'; var local_with_anchor_tag_tests = '<h1>Local with anchor tag</h1>' + '<div id="openAnchor1"></div>' + @@ -327,16 +438,24 @@ exports.defineManualTests = function (contentEl, createActionButton) { '<p/> <div id="openAnchor2"></div>' + 'Expected result: open successfully in InAppBrowser to the local page, scrolled to the beginning of the tall div with border.'; + var hardwareback_tests = '<h1>HardwareBack</h1>' + + '<p/> <div id="openHardwareBackDefault"></div>' + + 'Expected result: By default hardwareback is yes so pressing back button should navigate backwards in history then close InAppBrowser' + + '<p/> <div id="openHardwareBackYes"></div>' + + 'Expected result: hardwareback=yes pressing back button should navigate backwards in history then close InAppBrowser' + + '<p/> <div id="openHardwareBackNo"></div>' + + 'Expected result: hardwareback=no pressing back button should close InAppBrowser regardless history'; + // CB-7490 We need to wrap this code due to Windows security restrictions // see http://msdn.microsoft.com/en-us/library/windows/apps/hh465380.aspx#differences for details if (window.MSApp && window.MSApp.execUnsafeLocalFunction) { MSApp.execUnsafeLocalFunction(function() { contentEl.innerHTML = info_div + local_tests + white_listed_tests + non_white_listed_tests + page_with_redirects_tests + pdf_url_tests + invalid_url_tests + - css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests; + css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests + hardwareback_tests; }); } else { contentEl.innerHTML = info_div + local_tests + white_listed_tests + non_white_listed_tests + page_with_redirects_tests + pdf_url_tests + invalid_url_tests + - css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests; + css_js_injection_tests + open_hidden_tests + clearing_cache_tests + video_tag_tests + local_with_anchor_tag_tests + hardwareback_tests; } document.getElementById("user-agent").textContent = navigator.userAgent; @@ -507,6 +626,12 @@ exports.defineManualTests = function (contentEl, createActionButton) { createActionButton('Remote Video', function () { doOpen(videohtml, '_blank'); }, 'openRemoteVideo'); + createActionButton('Remote Need User No Video', function () { + doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=no'); + }, 'openRemoteNeedUserNoVideo'); + createActionButton('Remote Need User Yes Video', function () { + doOpen(videohtml, '_blank', 'mediaPlaybackRequiresUserAction=yes'); + }, 'openRemoteNeedUserYesVideo'); //Local With Anchor Tag createActionButton('Anchor1', function () { @@ -515,5 +640,15 @@ exports.defineManualTests = function (contentEl, createActionButton) { createActionButton('Anchor2', function () { doOpen(localhtml + '#anchor2', '_blank'); }, 'openAnchor2'); -}; + // Hardwareback + createActionButton('no hardwareback (defaults to yes)', function () { + doOpen('http://cordova.apache.org', '_blank'); + }, 'openHardwareBackDefault'); + createActionButton('hardwareback=yes', function () { + doOpen('http://cordova.apache.org', '_blank', 'hardwareback=yes'); + }, 'openHardwareBackYes'); + createActionButton('hardwareback=no', function () { + doOpen('http://cordova.apache.org', '_blank', 'hardwareback=no'); + }, 'openHardwareBackNo'); +}; diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.css b/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.css index bd1526d3..5762c746 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.css +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.css @@ -38,3 +38,77 @@ .inAppBrowserWrapFullscreen { border: 0; } + +.inappbrowser-app-bar { + height: 70px; + background-color: #404040; + z-index: 9999999; +} + +.inappbrowser-app-bar-inner { + padding-top: 10px; + height: 60px; + width: 155px; + margin: 0 auto; + background-color: #404040; + z-index: 9999999; +} + +.app-bar-action { + width: auto; + height: 40px; + margin-left: 20px; + font-family: "Segoe UI Symbol"; + float: left; + color: white; + font-size: 12px; + text-transform: lowercase; + text-align: center; + cursor: default; +} + +.app-bar-action[disabled] { + color: gray; + /*disable click*/ + pointer-events: none; +} + +.app-bar-action::before { + font-size: 28px; + display: block; + height: 36px; +} + +/* Back */ +.action-back { + margin-left: 0px; +} + +.action-back::before { + content: "\E0BA"; +} + +.action-back:not([disabled]):hover::before { + content: "\E0B3"; +} + +/* Forward */ +.action-forward::before { + content: "\E0AC"; +} + +.action-forward:not([disabled]):hover::before { + content: "\E0AF"; +} + +/* Close */ +.action-close::before { + content: "\E0C7"; + /* close icon is larger so we re-size it to fit other icons */ + font-size: 20px; + line-height: 40px; +} + +.action-close:not([disabled]):hover::before { + content: "\E0CA"; +} diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.js index 93eb4207..25f62711 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/www/inappbrowser.js @@ -19,92 +19,93 @@ * */ -// special patch to correctly work on Ripple emulator (CB-9760) -if (window.parent && !!window.parent.ripple) { // https://gist.github.com/triceam/4658021 - module.exports = window.open.bind(window); // fallback to default window.open behaviour - return; -} +(function() { + // special patch to correctly work on Ripple emulator (CB-9760) + if (window.parent && !!window.parent.ripple) { // https://gist.github.com/triceam/4658021 + module.exports = window.open.bind(window); // fallback to default window.open behaviour + return; + } -var exec = require('cordova/exec'); -var channel = require('cordova/channel'); -var modulemapper = require('cordova/modulemapper'); -var urlutil = require('cordova/urlutil'); + var exec = require('cordova/exec'); + var channel = require('cordova/channel'); + var modulemapper = require('cordova/modulemapper'); + var urlutil = require('cordova/urlutil'); -function InAppBrowser() { - this.channels = { - 'loadstart': channel.create('loadstart'), - 'loadstop' : channel.create('loadstop'), - 'loaderror' : channel.create('loaderror'), - 'exit' : channel.create('exit') - }; -} + function InAppBrowser() { + this.channels = { + 'loadstart': channel.create('loadstart'), + 'loadstop' : channel.create('loadstop'), + 'loaderror' : channel.create('loaderror'), + 'exit' : channel.create('exit') + }; + } -InAppBrowser.prototype = { - _eventHandler: function (event) { - if (event && (event.type in this.channels)) { - this.channels[event.type].fire(event); - } - }, - close: function (eventname) { - exec(null, null, "InAppBrowser", "close", []); - }, - show: function (eventname) { - exec(null, null, "InAppBrowser", "show", []); - }, - addEventListener: function (eventname,f) { - if (eventname in this.channels) { - this.channels[eventname].subscribe(f); - } - }, - removeEventListener: function(eventname, f) { - if (eventname in this.channels) { - this.channels[eventname].unsubscribe(f); - } - }, + InAppBrowser.prototype = { + _eventHandler: function (event) { + if (event && (event.type in this.channels)) { + this.channels[event.type].fire(event); + } + }, + close: function (eventname) { + exec(null, null, "InAppBrowser", "close", []); + }, + show: function (eventname) { + exec(null, null, "InAppBrowser", "show", []); + }, + addEventListener: function (eventname,f) { + if (eventname in this.channels) { + this.channels[eventname].subscribe(f); + } + }, + removeEventListener: function(eventname, f) { + if (eventname in this.channels) { + this.channels[eventname].unsubscribe(f); + } + }, - executeScript: function(injectDetails, cb) { - if (injectDetails.code) { - exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]); - } else if (injectDetails.file) { - exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]); - } else { - throw new Error('executeScript requires exactly one of code or file to be specified'); - } - }, + executeScript: function(injectDetails, cb) { + if (injectDetails.code) { + exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]); + } else if (injectDetails.file) { + exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]); + } else { + throw new Error('executeScript requires exactly one of code or file to be specified'); + } + }, - insertCSS: function(injectDetails, cb) { - if (injectDetails.code) { - exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]); - } else if (injectDetails.file) { - exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]); - } else { - throw new Error('insertCSS requires exactly one of code or file to be specified'); + insertCSS: function(injectDetails, cb) { + if (injectDetails.code) { + exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]); + } else if (injectDetails.file) { + exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]); + } else { + throw new Error('insertCSS requires exactly one of code or file to be specified'); + } } - } -}; - -module.exports = function(strUrl, strWindowName, strWindowFeatures, callbacks) { - // Don't catch calls that write to existing frames (e.g. named iframes). - if (window.frames && window.frames[strWindowName]) { - var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open'); - return origOpenFunc.apply(window, arguments); - } + }; - strUrl = urlutil.makeAbsolute(strUrl); - var iab = new InAppBrowser(); + module.exports = function(strUrl, strWindowName, strWindowFeatures, callbacks) { + // Don't catch calls that write to existing frames (e.g. named iframes). + if (window.frames && window.frames[strWindowName]) { + var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open'); + return origOpenFunc.apply(window, arguments); + } - callbacks = callbacks || {}; - for (var callbackName in callbacks) { - iab.addEventListener(callbackName, callbacks[callbackName]); - } + strUrl = urlutil.makeAbsolute(strUrl); + var iab = new InAppBrowser(); - var cb = function(eventname) { - iab._eventHandler(eventname); - }; + callbacks = callbacks || {}; + for (var callbackName in callbacks) { + iab.addEventListener(callbackName, callbacks[callbackName]); + } - strWindowFeatures = strWindowFeatures || ""; + var cb = function(eventname) { + iab._eventHandler(eventname); + }; - exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); - return iab; -}; + strWindowFeatures = strWindowFeatures || ""; + exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]); + return iab; + }; +})(); diff --git a/StoneIsland/plugins/cordova-plugin-inappbrowser/www/windows8/InAppBrowserProxy.js b/StoneIsland/plugins/cordova-plugin-inappbrowser/www/windows8/InAppBrowserProxy.js index 42d15d2c..ed954770 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-inappbrowser/www/windows8/InAppBrowserProxy.js +++ b/StoneIsland/plugins/cordova-plugin-inappbrowser/www/windows8/InAppBrowserProxy.js @@ -22,10 +22,6 @@ /*jslint sloppy:true */ /*global Windows:true, require, document, setTimeout, window, module */ - -var cordova = require('cordova'), - channel = require('cordova/channel'); - var browserWrap; var IAB = { @@ -45,7 +41,6 @@ var IAB = { open: function (win, lose, args) { var strUrl = args[0], target = args[1], - features = args[2], url, elem; diff --git a/StoneIsland/plugins/cordova-plugin-network-information/CONTRIBUTING.md b/StoneIsland/plugins/cordova-plugin-network-information/CONTRIBUTING.md index f7dbcaba..4c8e6a5e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/CONTRIBUTING.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/CONTRIBUTING.md @@ -27,7 +27,7 @@ There are multiple ways to contribute: report bugs, improve the docs, and contribute code. For instructions on this, start with the -[contribution overview](http://cordova.apache.org/#contribute). +[contribution overview](http://cordova.apache.org/contribute/). The details are explained there, but the important items are: - Sign and submit an Apache ICLA (Contributor License Agreement). diff --git a/StoneIsland/plugins/cordova-plugin-network-information/LICENSE b/StoneIsland/plugins/cordova-plugin-network-information/LICENSE index 7a4a3ea2..7a4a3ea2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/LICENSE +++ b/StoneIsland/plugins/cordova-plugin-network-information/LICENSE diff --git a/StoneIsland/plugins/cordova-plugin-network-information/NOTICE b/StoneIsland/plugins/cordova-plugin-network-information/NOTICE index fb19cbdb..fb19cbdb 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/NOTICE +++ b/StoneIsland/plugins/cordova-plugin-network-information/NOTICE diff --git a/StoneIsland/plugins/cordova-plugin-network-information/README.md b/StoneIsland/plugins/cordova-plugin-network-information/README.md index c78f3b02..394058c4 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/README.md @@ -1,3 +1,7 @@ +--- +title: Network Information +description: Get information about wireless connectivity. +--- <!-- # license: Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,15 +21,24 @@ # under the License. --> +|Android|iOS| Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI | +|:-:|:-:|:-:|:-:|:-:|:-:| +|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=android,PLUGIN=cordova-plugin-network-information/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=ios,PLUGIN=cordova-plugin-network-information/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-store,PLUGIN=cordova-plugin-network-information/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-phone,PLUGIN=cordova-plugin-network-information/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-10-store,PLUGIN=cordova-plugin-network-information/)|[](https://travis-ci.org/apache/cordova-plugin-network-information)| + # cordova-plugin-network-information -[](https://travis-ci.org/apache/cordova-plugin-network-information) This plugin provides an implementation of an old version of the [Network Information API](http://www.w3.org/TR/2011/WD-netinfo-api-20110607/). It provides information about the device's cellular and wifi connection, and whether the device has an internet connection. +> To get a few ideas how to use the plugin, check out the [sample](#sample) at the bottom of this page or go straight to the [reference](#reference) content. + +Report issues with this plugin on the [Apache Cordova issue tracker][Apache Cordova issue tracker]. + +##<a name="reference"></a>Reference + ## Installation cordova plugin add cordova-plugin-network-information @@ -68,24 +81,25 @@ connection state, and type of connection. ### Quick Example - function checkConnection() { - var networkState = navigator.connection.type; - - var states = {}; - states[Connection.UNKNOWN] = 'Unknown connection'; - states[Connection.ETHERNET] = 'Ethernet connection'; - states[Connection.WIFI] = 'WiFi connection'; - states[Connection.CELL_2G] = 'Cell 2G connection'; - states[Connection.CELL_3G] = 'Cell 3G connection'; - states[Connection.CELL_4G] = 'Cell 4G connection'; - states[Connection.CELL] = 'Cell generic connection'; - states[Connection.NONE] = 'No network connection'; +```js +function checkConnection() { + var networkState = navigator.connection.type; - alert('Connection type: ' + states[networkState]); - } + var states = {}; + states[Connection.UNKNOWN] = 'Unknown connection'; + states[Connection.ETHERNET] = 'Ethernet connection'; + states[Connection.WIFI] = 'WiFi connection'; + states[Connection.CELL_2G] = 'Cell 2G connection'; + states[Connection.CELL_3G] = 'Cell 3G connection'; + states[Connection.CELL_4G] = 'Cell 4G connection'; + states[Connection.CELL] = 'Cell generic connection'; + states[Connection.NONE] = 'No network connection'; - checkConnection(); + alert('Connection type: ' + states[networkState]); +} +checkConnection(); +``` ### API Change @@ -97,7 +111,7 @@ eventually be removed. ### iOS Quirks -- iOS can't detect the type of cellular network connection. +- <iOS7 can't detect the type of cellular network connection. - `navigator.connection.type` is set to `Connection.CELL` for all cellular data. ### Windows Phone Quirks @@ -147,12 +161,13 @@ attach an event listener once the `deviceready` event fires. ### Quick Example - document.addEventListener("offline", onOffline, false); - - function onOffline() { - // Handle the offline event - } +```js +document.addEventListener("offline", onOffline, false); +function onOffline() { + // Handle the offline event +} +``` ### iOS Quirks @@ -186,12 +201,13 @@ attach an event listener once the `deviceready` event fires. ### Quick Example - document.addEventListener("online", onOnline, false); - - function onOnline() { - // Handle the online event - } +```js +document.addEventListener("online", onOnline, false); +function onOnline() { + // Handle the online event +} +``` ### iOS Quirks @@ -206,3 +222,120 @@ When running in the Emulator, the `connection.status` is always unknown, so this ### Windows Phone 8 Quirks The Emulator reports the connection type as `Cellular`, which does not change, so events does _not_ fire. + +## Sample: Upload a File Depending on your Network State <a name="sample"></a> + +The code examples in this section show examples of changing app behavior using the online and offline events and your network connection status. + +To start with, create a new FileEntry object (data.txt) to use for sample data. Call this function from the `deviceready` handler. + +>*Note* This code example requires the File plugin. + +```js +var dataFileEntry; + +function createSomeData() { + + window.requestFileSystem(window.TEMPORARY, 5 * 1024 * 1024, function (fs) { + + console.log('file system open: ' + fs.name); + // Creates a new file or returns an existing file. + fs.root.getFile("data.txt", { create: true, exclusive: false }, function (fileEntry) { + + dataFileEntry = fileEntry; + + }, onErrorCreateFile); + + }, onErrorLoadFs); +} +``` + +Next, add listeners for the online and offline events in the `deviceready` handler. + +```js +document.addEventListener("offline", onOffline, false); +document.addEventListener("online", onOnline, false); +``` + +The app's `onOnline` function handles the online event. In the event handler, check the current network state. In this app, treat any connection type as good except Connection.NONE. If you have a connection, you try to upload a file. + +```js +function onOnline() { + // Handle the online event + var networkState = navigator.connection.type; + + if (networkState !== Connection.NONE) { + if (dataFileEntry) { + tryToUploadFile(); + } + } + display('Connection type: ' + networkState); +} +``` + +When the online event fires in the preceding code, call the app's `tryToUploadFile` function. + +If the FileTransfer object's upload function fails, call the app's `offlineWrite` function to save the current data somewhere. + +>*Note* This example requires the FileTransfer plugin. + +```js +function tryToUploadFile() { + // !! Assumes variable fileURL contains a valid URL to a text file on the device, + var fileURL = getDataFileEntry().toURL(); + + var success = function (r) { + console.log("Response = " + r.response); + display("Uploaded. Response: " + r.response); + } + + var fail = function (error) { + console.log("An error has occurred: Code = " + error.code); + offlineWrite("Failed to upload: some offline data"); + } + + var options = new FileUploadOptions(); + options.fileKey = "file"; + options.fileName = fileURL.substr(fileURL.lastIndexOf('/') + 1); + options.mimeType = "text/plain"; + + var ft = new FileTransfer(); + // Make sure you add the domain of your server URL to the + // Content-Security-Policy <meta> element in index.html. + ft.upload(fileURL, encodeURI(SERVER), success, fail, options); +}; +``` + +Here is the code for the `offlineWrite` function. + +>*Note* This code examples requires the File plugin. + +```js +function offlineWrite(offlineData) { + // Create a FileWriter object for our FileEntry. + dataFileEntry.createWriter(function (fileWriter) { + + fileWriter.onwriteend = function () { + console.log("Successful file write..."); + display(offlineData); + }; + + fileWriter.onerror = function (e) { + console.log("Failed file write: " + e.toString()); + }; + + fileWriter.write(offlineData); + }); +} +``` + +If the offline event occurs, just do something like notify the user (for this example, just log it). + +```js +function onOffline() { + // Handle the offline event + console.log("lost connection"); +} +``` + +[Apache Cordova issue tracker]: https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Network%20Information%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC diff --git a/StoneIsland/plugins/cordova-plugin-network-information/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-network-information/RELEASENOTES.md index 06bc5090..7ff57bd6 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/RELEASENOTES.md @@ -20,97 +20,128 @@ --> # Release Notes -### 0.2.1 (Sept 5, 2013) -* CB-4432 copyright notice change +### 1.3.0 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* [CB-11734](https://issues.apache.org/jira/browse/CB-11734) Network Plugin uses `Android Log class` and not `Cordova LOG class` +* [CB-11300](https://issues.apache.org/jira/browse/CB-11300) (**android**) Recognize `2G`, `3G` and `4G` network connection subtype names +* Update `NetworkManager.java` +* Detection of Ethernet Network Type on **Android** +* fixed two potential memory leaks when doing Analyze on **iOS 9** +* [CB-11384](https://issues.apache.org/jira/browse/CB-11384) **android**: Does not pass sonarqube scan +* Add badges for paramedic builds on Jenkins +* Add pull request template. +* Readme: Add fenced code blocks with langauage hints +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md -### 0.2.3 (Sept 25, 2013) -* CB-4889 bumping&resetting version -* [windows8] commandProxy was moved -* CB-4889 renaming org.apache.cordova.core.network-information to org.apache.cordova.network-information -* removed duplicate comment line from plugin.xml -* added Network APIs for FirefoxOS -* Rename CHANGELOG.md -> RELEASENOTES.md -* [CB-4752] Incremented plugin version on dev branch. - -### 0.2.4 (Oct 28, 2013) -* CB-5128: add repo + issue tag to plugin.xml for network information plugin -* [CB-4915] Incremented plugin version on dev branch. +### 1.2.1 (Apr 15, 2016) +* [CB-10763](https://issues.apache.org/jira/browse/CB-10763) Remove emoji in `cordova-plugin-network-information` +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add `JSHint` for plugins -### 0.2.5 (Dec 4, 2013) -* [ubuntu] specify policy_group -* add ubuntu platform -* Added amazon-fireos platform. Change to use amazon-fireos as the platform if user agent string contains 'cordova-amazon-fireos' +### 1.2.0 (Jan 15, 2016) +* Adding `CoreTelephony` to `plugin.xml` +* Adding notification for `CT radio` information +* Adding `CT radio` information +* [CB-10160](https://issues.apache.org/jira/browse/CB-10160) Fixed the case mismatch issue -### 0.2.6 (Jan 02, 2014) -* CB-5658 Add doc/index.md for netinfo plugin +### 1.1.0 (Nov 18, 2015) +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest +* Fixing contribute link. +* These notifications are objects so their address always evaluates to true. +* Update `NetworkManager.java` +* [CB-9542](https://issues.apache.org/jira/browse/CB-9542) `Browser Proxy` not defined correctly +* Solved `toLowerCase` issue with `Locale.US` -### 0.2.7 (Feb 05, 2014) -* Initial implementation of Tizen plugin. +### 1.0.1 (Jun 17, 2015) +* Adding .ratignore file. +* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-network-information documentation translation: cordova-plugin-network-information +* fix npm md issue -### 0.2.8 (Apr 17, 2014) -* CB-6342: [iOS] iOS reports a cellular connection even when in Airplane mode -* CB-6422: [windows8] use cordova/exec/proxy -* CB-6460: Update license headers -* CB-6465: Add license headers to Tizen code -* Add NOTICE file +### 1.0.0 (Apr 15, 2015) +* [CB-8746](https://issues.apache.org/jira/browse/CB-8746) gave plugin major version bump +* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) changed plugin-id to pacakge-name +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) properly updated translated docs to use new id +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) updated translated docs to use new id +* [CB-8185](https://issues.apache.org/jira/browse/CB-8185) Fixes typo in `cordova.platformId` +* Use TRAVIS_BUILD_DIR, install paramedic by npm +* [CB-8185](https://issues.apache.org/jira/browse/CB-8185) Use `navigator.onLine` as connection information source on browser platform +* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) Updated Readme +* [CB-8659](https://issues.apache.org/jira/browse/CB-8659): ios: 4.0.x Compatibility: Remove use of initWebView method +* [CB-8573](https://issues.apache.org/jira/browse/CB-8573) Integrate TravisCI +* [CB-8438](https://issues.apache.org/jira/browse/CB-8438) cordova-plugin-network-information documentation translation: cordova-plugin-network-information +* [CB-8538](https://issues.apache.org/jira/browse/CB-8538) Added package.json file -### 0.2.9 (Jun 05, 2014) -* updated notice file to include missing license -* Cached extra info to better detect changes. -* CB-6809 Add license to CONTRIBUTING.md -* CB-6491 add CONTRIBUTING.md -* CB-6350 - Fix networkStatusForFlags return value type to work with 64-bit iOS (closes #8) -* Initial version of firefox os network information plugin -* there was an error in the object definition +### 0.2.15 (Feb 04, 2015) +* [CB-8384](https://issues.apache.org/jira/browse/CB-8384) Network status change support on Windows +* [CB-8384](https://issues.apache.org/jira/browse/CB-8384) Fixes the way we detect online status on Windows +* [CB-8384](https://issues.apache.org/jira/browse/CB-8384) Add Windows platform quirks +* [CB-8384](https://issues.apache.org/jira/browse/CB-8384) Add Windows section to Network Information plugin -### 0.2.10 (Jun 24, 2014) -* CB-6907: [android] Don't crash on startup if no networks available +### 0.2.14 (Dec 02, 2014) +* [CB-7976](https://issues.apache.org/jira/browse/CB-7976) **Android**: Use webView's context rather than Activity's context for intent receiver +* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-network-information documentation translation: cordova-plugin-network-information -### 0.2.11 (Aug 06, 2014) -* **FFOS** update NetworkProxy.js -* CB-6127 Updated translations for docs -* CB-7019 Updated version and RELEASENOTES.md for release 0.2.10 -* Fixed docs for online/offline event being backwards +### 0.2.13 (Oct 03, 2014) +* [CB-7595](https://issues.apache.org/jira/browse/CB-7595): Android L changes the type from Mobile to Cellular, I'm pretty sure this isn't documented ### 0.2.12 (Sep 17, 2014) -* CB-7471 cordova-plugin-network-information documentation translation +* [CB-7471](https://issues.apache.org/jira/browse/CB-7471) cordova-plugin-network-information documentation translation * Fix network information type exception on fxos 2 * Added support for the browser -* CB-6724 added documentation for manual tests +* [CB-6724](https://issues.apache.org/jira/browse/CB-6724) added documentation for manual tests * remove reference to test assets, they are optional * Renamed test dir and added nested plugin.xml -* CB-6964 ported manual tests +* [CB-6964](https://issues.apache.org/jira/browse/CB-6964) ported manual tests * Port network tests to plugin-test-framework * Fix naviagtor typo -### 0.2.13 (Oct 03, 2014) -* CB-7595: Android L changes the type from Mobile to Cellular, I'm pretty sure this isn't documented +### 0.2.11 (Aug 06, 2014) +* **FFOS** update NetworkProxy.js +* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Updated translations for docs +* [CB-7019](https://issues.apache.org/jira/browse/CB-7019) Updated version and RELEASENOTES.md for release 0.2.10 +* Fixed docs for online/offline event being backwards -### 0.2.14 (Dec 02, 2014) -* CB-7976 **Android**: Use webView's context rather than Activity's context for intent receiver -* CB-7700 cordova-plugin-network-information documentation translation: cordova-plugin-network-information +### 0.2.10 (Jun 24, 2014) +* [CB-6907](https://issues.apache.org/jira/browse/CB-6907): [android] Don't crash on startup if no networks available -### 0.2.15 (Feb 04, 2015) -* CB-8384 Network status change support on Windows -* CB-8384 Fixes the way we detect online status on Windows -* CB-8384 Add Windows platform quirks -* CB-8384 Add Windows section to Network Information plugin +### 0.2.9 (Jun 05, 2014) +* updated notice file to include missing license +* Cached extra info to better detect changes. +* [CB-6809](https://issues.apache.org/jira/browse/CB-6809) Add license to CONTRIBUTING.md +* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md +* [CB-6350](https://issues.apache.org/jira/browse/CB-6350) - Fix networkStatusForFlags return value type to work with 64-bit iOS (closes #8) +* Initial version of firefox os network information plugin +* there was an error in the object definition -### 1.0.0 (Apr 15, 2015) -* CB-8746 gave plugin major version bump -* CB-8683 changed plugin-id to pacakge-name -* CB-8653 properly updated translated docs to use new id -* CB-8653 updated translated docs to use new id -* CB-8185 Fixes typo in `cordova.platformId` -* Use TRAVIS_BUILD_DIR, install paramedic by npm -* CB-8185 Use `navigator.onLine` as connection information source on browser platform -* CB-8653 Updated Readme -* CB-8659: ios: 4.0.x Compatibility: Remove use of initWebView method -* CB-8573 Integrate TravisCI -* CB-8438 cordova-plugin-network-information documentation translation: cordova-plugin-network-information -* CB-8538 Added package.json file +### 0.2.8 (Apr 17, 2014) +* [CB-6342](https://issues.apache.org/jira/browse/CB-6342): [iOS] iOS reports a cellular connection even when in Airplane mode +* [CB-6422](https://issues.apache.org/jira/browse/CB-6422): [windows8] use cordova/exec/proxy +* [CB-6460](https://issues.apache.org/jira/browse/CB-6460): Update license headers +* [CB-6465](https://issues.apache.org/jira/browse/CB-6465): Add license headers to Tizen code +* Add NOTICE file -### 1.0.1 (Jun 17, 2015) -* Adding .ratignore file. -* CB-9128 cordova-plugin-network-information documentation translation: cordova-plugin-network-information -* fix npm md issue +### 0.2.7 (Feb 05, 2014) +* Initial implementation of Tizen plugin. + +### 0.2.6 (Jan 02, 2014) +* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Add doc/index.md for netinfo plugin + +### 0.2.5 (Dec 4, 2013) +* [ubuntu] specify policy_group +* add ubuntu platform +* Added amazon-fireos platform. Change to use amazon-fireos as the platform if user agent string contains 'cordova-amazon-fireos' + +### 0.2.4 (Oct 28, 2013) +* [CB-5128](https://issues.apache.org/jira/browse/CB-5128): add repo + issue tag to plugin.xml for network information plugin +* [CB-4915](https://issues.apache.org/jira/browse/CB-4915) Incremented plugin version on dev branch. + +### 0.2.3 (Sept 25, 2013) +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) bumping&resetting version +* [windows8] commandProxy was moved +* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming org.apache.cordova.core.network-information to org.apache.cordova.network-information +* removed duplicate comment line from plugin.xml +* added Network APIs for FirefoxOS +* Rename CHANGELOG.md -> RELEASENOTES.md +* [CB-4752](https://issues.apache.org/jira/browse/CB-4752) Incremented plugin version on dev branch. + +### 0.2.1 (Sept 5, 2013) +* [CB-4432](https://issues.apache.org/jira/browse/CB-4432) copyright notice change diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/de/README.md index f6292b27..f6292b27 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/de/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/de/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/de/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/de/index.md index 537328a6..537328a6 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/de/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/de/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/es/README.md index 4e30593d..4e30593d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/es/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/es/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/es/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/es/index.md index 65158ef5..65158ef5 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/es/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/es/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/README.md index 8f2b82cc..8f2b82cc 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/index.md index e49c5d52..e49c5d52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/fr/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/it/README.md index f4343594..f4343594 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/it/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/it/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/it/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/it/index.md index e1917195..e1917195 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/it/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/it/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/README.md index 797b7413..797b7413 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/index.md index 71b6f82e..71b6f82e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/ja/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/README.md index a6675391..a6675391 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/index.md index cb4c727a..cb4c727a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/ko/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/README.md index 4b66cbb4..4b66cbb4 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/index.md index a42b973c..a42b973c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/pl/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/ru/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/ru/index.md index 481c1b18..481c1b18 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/ru/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/ru/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/README.md index 09e11e7e..09e11e7e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/README.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/README.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/index.md b/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/index.md index 2041467e..2041467e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/index.md +++ b/StoneIsland/plugins/cordova-plugin-network-information/doc/zh/index.md diff --git a/StoneIsland/plugins/cordova-plugin-network-information/package.json b/StoneIsland/plugins/cordova-plugin-network-information/package.json index 452db88b..fd804b86 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/package.json +++ b/StoneIsland/plugins/cordova-plugin-network-information/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-network-information", - "version": "1.0.1", + "version": "1.3.0", "description": "Cordova Network Information Plugin", "cordova": { "id": "cordova-plugin-network-information", @@ -41,6 +41,20 @@ "cordova-tizen", "cordova-browser" ], + "scripts": { + "test": "npm run jshint", + "jshint": "jshint www && jshint src && jshint tests" + }, "author": "Apache Software Foundation", - "license": "Apache 2.0" + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova": ">100" + } + } + }, + "devDependencies": { + "jshint": "^2.6.0" + } } diff --git a/StoneIsland/plugins/cordova-plugin-network-information/plugin.xml b/StoneIsland/plugins/cordova-plugin-network-information/plugin.xml index e0ed97fc..29922293 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-network-information/plugin.xml @@ -21,7 +21,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-network-information" - version="1.0.1"> + version="1.3.0"> <name>Network Information</name> <description>Cordova Network Information Plugin</description> @@ -103,6 +103,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" <header-file src="src/ios/CDVReachability.h" /> <source-file src="src/ios/CDVReachability.m" /> <framework src="SystemConfiguration.framework" weak="true" /> + <framework src="CoreTelephony.framework" /> </platform> <!-- blackberry10 --> @@ -146,14 +147,14 @@ xmlns:android="http://schemas.android.com/apk/res/android" <!-- windows8 --> <platform name="windows8"> <js-module src="src/windows/NetworkInfoProxy.js" name="NetworkInfoProxy"> - <merges target="" /> + <runs/> </js-module> </platform> <!-- windows --> <platform name="windows"> <js-module src="src/windows/NetworkInfoProxy.js" name="NetworkInfoProxy"> - <merges target="" /> + <runs/> </js-module> </platform> @@ -166,9 +167,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" <!-- browser --> <platform name="browser"> - <js-module src="www/browser/network.js" name="browserNetwork"> - <clobbers target="navigator.connection" /> - <clobbers target="navigator.network.connection" /> + <js-module src="src/browser/network.js" name="NetworkInfoProxy"> + <runs/> </js-module> </platform> </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/android/NetworkManager.java b/StoneIsland/plugins/cordova-plugin-network-information/src/android/NetworkManager.java index 4c85ddab..614b6e7b 100755 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/android/NetworkManager.java +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/android/NetworkManager.java @@ -21,6 +21,7 @@ package org.apache.cordova.networkinformation; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.LOG; import org.apache.cordova.PluginResult; import org.apache.cordova.CordovaWebView; import org.json.JSONArray; @@ -33,7 +34,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.util.Log; + +import java.util.Locale; public class NetworkManager extends CordovaPlugin { @@ -45,14 +47,16 @@ public class NetworkManager extends CordovaPlugin { public static final String WIMAX = "wimax"; // mobile public static final String MOBILE = "mobile"; - - // Android L calls this Cellular, because I have no idea! + + // Android L calls this Cellular, because I have no idea! public static final String CELLULAR = "cellular"; // 2G network types + public static final String TWO_G = "2g"; public static final String GSM = "gsm"; public static final String GPRS = "gprs"; public static final String EDGE = "edge"; // 3G network types + public static final String THREE_G = "3g"; public static final String CDMA = "cdma"; public static final String UMTS = "umts"; public static final String HSPA = "hspa"; @@ -61,12 +65,14 @@ public class NetworkManager extends CordovaPlugin { public static final String ONEXRTT = "1xrtt"; public static final String EHRPD = "ehrpd"; // 4G network types + public static final String FOUR_G = "4g"; public static final String LTE = "lte"; public static final String UMB = "umb"; public static final String HSPA_PLUS = "hspa+"; // return type public static final String TYPE_UNKNOWN = "unknown"; public static final String TYPE_ETHERNET = "ethernet"; + public static final String TYPE_ETHERNET_SHORT = "eth"; public static final String TYPE_WIFI = "wifi"; public static final String TYPE_2G = "2g"; public static final String TYPE_3G = "3g"; @@ -125,7 +131,9 @@ public class NetworkManager extends CordovaPlugin { String connectionType = ""; try { connectionType = this.getConnectionInfo(info).get("type").toString(); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, connectionType); pluginResult.setKeepCallback(true); @@ -143,7 +151,7 @@ public class NetworkManager extends CordovaPlugin { try { webView.getContext().unregisterReceiver(this.receiver); } catch (Exception e) { - Log.e(LOG_TAG, "Error unregistering network receiver: " + e.getMessage(), e); + LOG.e(LOG_TAG, "Error unregistering network receiver: " + e.getMessage(), e); } finally { receiver = null; } @@ -169,7 +177,9 @@ public class NetworkManager extends CordovaPlugin { String connectionType = ""; try { connectionType = thisInfo.get("type").toString(); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } sendUpdate(connectionType); lastInfo = thisInfo; @@ -196,15 +206,17 @@ public class NetworkManager extends CordovaPlugin { extraInfo = info.getExtraInfo(); } - Log.d("CordovaNetworkManager", "Connection Type: " + type); - Log.d("CordovaNetworkManager", "Connection Extra Info: " + extraInfo); + LOG.d(LOG_TAG, "Connection Type: " + type); + LOG.d(LOG_TAG, "Connection Extra Info: " + extraInfo); JSONObject connectionInfo = new JSONObject(); try { connectionInfo.put("type", type); connectionInfo.put("extraInfo", extraInfo); - } catch (JSONException e) { } + } catch (JSONException e) { + LOG.d(LOG_TAG, e.getLocalizedMessage()); + } return connectionInfo; } @@ -231,30 +243,38 @@ public class NetworkManager extends CordovaPlugin { */ private String getType(NetworkInfo info) { if (info != null) { - String type = info.getTypeName(); + String type = info.getTypeName().toLowerCase(Locale.US); - if (type.toLowerCase().equals(WIFI)) { + LOG.d(LOG_TAG, "toLower : " + type.toLowerCase()); + LOG.d(LOG_TAG, "wifi : " + WIFI); + if (type.equals(WIFI)) { return TYPE_WIFI; } - else if (type.toLowerCase().equals(MOBILE) || type.toLowerCase().equals(CELLULAR)) { - type = info.getSubtypeName(); - if (type.toLowerCase().equals(GSM) || - type.toLowerCase().equals(GPRS) || - type.toLowerCase().equals(EDGE)) { + else if (type.toLowerCase().equals(TYPE_ETHERNET) || type.toLowerCase().startsWith(TYPE_ETHERNET_SHORT)) { + return TYPE_ETHERNET; + } + else if (type.equals(MOBILE) || type.equals(CELLULAR)) { + type = info.getSubtypeName().toLowerCase(Locale.US); + if (type.equals(GSM) || + type.equals(GPRS) || + type.equals(EDGE) || + type.equals(TWO_G)) { return TYPE_2G; } - else if (type.toLowerCase().startsWith(CDMA) || - type.toLowerCase().equals(UMTS) || - type.toLowerCase().equals(ONEXRTT) || - type.toLowerCase().equals(EHRPD) || - type.toLowerCase().equals(HSUPA) || - type.toLowerCase().equals(HSDPA) || - type.toLowerCase().equals(HSPA)) { + else if (type.startsWith(CDMA) || + type.equals(UMTS) || + type.equals(ONEXRTT) || + type.equals(EHRPD) || + type.equals(HSUPA) || + type.equals(HSDPA) || + type.equals(HSPA) || + type.equals(THREE_G)) { return TYPE_3G; } - else if (type.toLowerCase().equals(LTE) || - type.toLowerCase().equals(UMB) || - type.toLowerCase().equals(HSPA_PLUS)) { + else if (type.equals(LTE) || + type.equals(UMB) || + type.equals(HSPA_PLUS) || + type.equals(FOUR_G)) { return TYPE_4G; } } diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/blackberry10/index.js b/StoneIsland/plugins/cordova-plugin-network-information/src/blackberry10/index.js index d47d840e..c6cd00a9 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/blackberry10/index.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/blackberry10/index.js @@ -19,6 +19,8 @@ * */ +/* global PluginResult */ + //map from BB10 to cordova connection types: //https://github.com/apache/cordova-js/blob/master/lib/common/plugin/Connection.js function mapConnectionType(con) { diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/whitelist.js b/StoneIsland/plugins/cordova-plugin-network-information/src/browser/network.js index 74d7a99d..8a6ddb0e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/whitelist.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/browser/network.js @@ -18,10 +18,31 @@ * */ -if (!document.querySelector('meta[http-equiv=Content-Security-Policy]')) { - var msg = 'No Content-Security-Policy meta tag found. Please add one when using the cordova-plugin-whitelist plugin.'; - console.error(msg); - setInterval(function() { - console.warn(msg); - }, 10000); +var cordova = require('cordova'), + proxy = require("cordova/exec/proxy"), + Connection = require('./Connection'); + +var type = navigator.onLine ? Connection.UNKNOWN : Connection.NONE; + +// Subscribe to 'native' online/offline events +function onStatusChange(evt) { + type = navigator.onLine ? Connection.UNKNOWN : Connection.NONE; + // force async + setTimeout(function(){ + cordova.fireDocumentEvent(evt.type); + },0); } + +window.addEventListener('online', onStatusChange); +window.addEventListener('offline', onStatusChange); + +proxy.add("NetworkStatus", { + getConnectionInfo:function(cbSuccess) { + // force async + setTimeout(function(){ + cbSuccess(type); + },0); + } +}); + + diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/firefoxos/NetworkProxy.js b/StoneIsland/plugins/cordova-plugin-network-information/src/firefoxos/NetworkProxy.js index 40d61637..8c82557d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/firefoxos/NetworkProxy.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/firefoxos/NetworkProxy.js @@ -24,8 +24,7 @@ and http://w3c.github.io/netinfo/ */ -var cordova = require('cordova'), - Connection = require('./Connection'), +var Connection = require('./Connection'), modulemapper = require('cordova/modulemapper'); var origConnection = modulemapper.getOriginalSymbol(window, 'navigator.connection'); @@ -47,7 +46,7 @@ module.exports = { metered = connection.metered, type = connection.type; - if (type != undefined) { + if (type !== undefined) { // For more information see: // https://developer.mozilla.org/en-US/docs/Web/API/Network_Information_API @@ -65,7 +64,7 @@ module.exports = { connectionType = Connection.NONE; break; } - } else if (bandwidth != undefined && metered != undefined) { + } else if (bandwidth !== undefined && metered !== undefined) { /* bandwidth of type double, readonly The user agent must set the value of the bandwidth attribute to: diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.h b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.h index 8add0279..8add0279 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.h +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.h diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.m b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.m index 37497675..6715322a 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.m +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVConnection.m @@ -16,6 +16,7 @@ specific language governing permissions and limitations under the License. */ +#import <CoreTelephony/CTTelephonyNetworkInfo.h> #import "CDVConnection.h" #import "CDVReachability.h" @@ -57,6 +58,32 @@ if (isConnectionRequired) { return @"none"; } else { + if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) { + CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new]; + if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { + return @"2g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { + return @"2g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { + return @"3g"; + } else if ([telephonyInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { + return @"4g"; + } + } return @"cellular"; } } @@ -118,7 +145,9 @@ [self.internetReach startNotifier]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionType:) name:kReachabilityChangedNotification object:nil]; - if (&UIApplicationDidEnterBackgroundNotification && &UIApplicationWillEnterForegroundNotification) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionType:) + name:CTRadioAccessTechnologyDidChangeNotification object:nil]; + if (UIApplicationDidEnterBackgroundNotification && UIApplicationWillEnterForegroundNotification) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil]; } diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.h b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.h index 01a95c35..01a95c35 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.h +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.h diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.m b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.m index c60261ae..1399867e 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.m +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/ios/CDVReachability.m @@ -142,6 +142,9 @@ static void CDVReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkRe retVal->reachabilityRef = reachability; retVal->localWiFiRef = NO; } + else { + CFRelease(reachability); + } } return retVal; } @@ -156,6 +159,9 @@ static void CDVReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkRe retVal->reachabilityRef = reachability; retVal->localWiFiRef = NO; } + else { + CFRelease(reachability); + } } return retVal; } diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/tizen/NetworkProxy.js b/StoneIsland/plugins/cordova-plugin-network-information/src/tizen/NetworkProxy.js index cd9506e1..d2de2ccc 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/tizen/NetworkProxy.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/tizen/NetworkProxy.js @@ -19,7 +19,8 @@ * */ -var cordova = require('cordova'); +/* global tizen */ + var Connection = require('./Connection'); module.exports = { diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.cpp b/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.cpp index 8fdb4949..8fdb4949 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.cpp +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.cpp diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.h b/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.h index aca20e7b..aca20e7b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.h +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/ubuntu/network_information.h diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/windows/NetworkInfoProxy.js b/StoneIsland/plugins/cordova-plugin-network-information/src/windows/NetworkInfoProxy.js index 27ad2f06..92153c7b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/windows/NetworkInfoProxy.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/windows/NetworkInfoProxy.js @@ -21,15 +21,10 @@ /*global Windows:true */ -var cordova = require('cordova'); var Connection = require('./Connection'); var winNetConn = Windows.Networking.Connectivity; var networkInfo = winNetConn.NetworkInformation; -var networkCostInfo = winNetConn.NetworkCostType; -var networkConnectivityInfo = winNetConn.NetworkConnectivityLevel; -var networkAuthenticationInfo = winNetConn.NetworkAuthenticationType; -var networkEncryptionInfo = winNetConn.NetworkEncryptionType; function getCurrrentConnectionType() { @@ -76,7 +71,7 @@ module.exports = { { var reportConnectionInfoOnce = function () { win(getCurrrentConnectionType(), { keepCallback: true }); - } + }; // report current connection type setTimeout(reportConnectionInfoOnce, 0); diff --git a/StoneIsland/plugins/cordova-plugin-network-information/src/wp/NetworkStatus.cs b/StoneIsland/plugins/cordova-plugin-network-information/src/wp/NetworkStatus.cs index 12eb061d..12eb061d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/src/wp/NetworkStatus.cs +++ b/StoneIsland/plugins/cordova-plugin-network-information/src/wp/NetworkStatus.cs diff --git a/StoneIsland/plugins/cordova-plugin-network-information/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-network-information/tests/plugin.xml index 8df4769c..c4b03c26 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-network-information/tests/plugin.xml @@ -21,7 +21,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-network-information-tests" - version="1.0.1"> + version="1.3.0"> <name>Cordova Network Information Plugin Tests</name> <license>Apache 2.0</license> diff --git a/StoneIsland/plugins/cordova-plugin-network-information/tests/tests.js b/StoneIsland/plugins/cordova-plugin-network-information/tests/tests.js index 23be97ac..07f4b27f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/tests/tests.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/tests/tests.js @@ -19,6 +19,9 @@ * */ +/* jshint jasmine: true */ +/* global Connection */ + exports.defineAutoTests = function () { describe('Network (navigator.connection)', function () { it("network.spec.1 should exist", function () { diff --git a/StoneIsland/plugins/cordova-plugin-network-information/www/Connection.js b/StoneIsland/plugins/cordova-plugin-network-information/www/Connection.js index f20a485c..f20a485c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/www/Connection.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/www/Connection.js diff --git a/StoneIsland/plugins/cordova-plugin-network-information/www/browser/network.js b/StoneIsland/plugins/cordova-plugin-network-information/www/browser/network.js deleted file mode 100755 index 72ec5139..00000000 --- a/StoneIsland/plugins/cordova-plugin-network-information/www/browser/network.js +++ /dev/null @@ -1,92 +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. - * -*/ - -/*global module, require*/ - -var cordova = require('cordova'), - Connection = require('./Connection'); - -var DOCUMENT_EVENTS_CHECK_INTERVAL = 500; // ms -// Flag that indicates that ew need to re-fire online/offline events at document level -// (Workaround for Chrome, since it fires such events only for window object) -var NEED_FIRE_DOCUMENT_EVENT_MANUALLY = false; - -function NetworkConnection() { - this.type = Connection.UNKNOWN; -} - -/** - * Get connection info - * - * @param {Function} successCallback The function to call when the Connection data is available - */ -NetworkConnection.prototype.getInfo = function(successCallback) { - successCallback(this.type); -}; - -Object.defineProperty(NetworkConnection.prototype, 'type', { - get: function () { - // It is not possible to determine real connection type in browser - // so we always report Connection.UNKNOWN when online - return (window.navigator.onLine === false ? Connection.NONE : Connection.UNKNOWN); - }, - configurable: true, - enumerable: true -}); - -// This function tries to detect if document online/offline events is being fired -// after corresponding window events, and if not, then fires them manually -// This is workaround for Chrome, which fires only window online/offline events -// and regarding to plugin spec we need these events at document object -var eventRedirectHandler = function (e) { - // NEED_FIRE_DOCUMENT_EVENT_MANUALLY flag is already set, - // just fire corresponding document event and return - if (NEED_FIRE_DOCUMENT_EVENT_MANUALLY) { - cordova.fireDocumentEvent(e.type); - return; - } - - // Flag that indicates whether corresponding document even is fired - var documentStateEventFired = false; - var setDocumentStateEventFired = function() { - documentStateEventFired = true; - }; - document.addEventListener(e.type, setDocumentStateEventFired); - setTimeout(function () { - // Remove unnecessary listener - document.removeEventListener(e.type, setDocumentStateEventFired); - // if document event hasn't been fired in specified interval (500 ms by default), - // then we're in chrome and need to fire it manually - if (!documentStateEventFired) { - NEED_FIRE_DOCUMENT_EVENT_MANUALLY = true; - cordova.fireDocumentEvent(e.type); - } - }, DOCUMENT_EVENTS_CHECK_INTERVAL); -}; - -// Subscribe to native online/offline events -window.addEventListener('online', eventRedirectHandler); -window.addEventListener('offline', eventRedirectHandler); - -var me = new NetworkConnection(); - -require("cordova/exec/proxy").add("NetworkStatus", { getConnectionInfo: me.getConnectionInfo }); - -module.exports = me; diff --git a/StoneIsland/plugins/cordova-plugin-network-information/www/network.js b/StoneIsland/plugins/cordova-plugin-network-information/www/network.js index ac792d8c..ac792d8c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-network-information/www/network.js +++ b/StoneIsland/plugins/cordova-plugin-network-information/www/network.js diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/README.md b/StoneIsland/plugins/cordova-plugin-splashscreen/README.md index ff790b16..6a6faaf9 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/README.md +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/README.md @@ -1,3 +1,7 @@ +--- +title: Splashscreen +description: Control the splash screen for your app. +--- <!-- # license: Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,11 +21,15 @@ # under the License. --> +|Android|iOS| Windows 8.1 Store | Windows 8.1 Phone | Windows 10 Store | Travis CI | +|:-:|:-:|:-:|:-:|:-:|:-:| +|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=android,PLUGIN=cordova-plugin-splashscreen/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=ios,PLUGIN=cordova-plugin-splashscreen/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-store,PLUGIN=cordova-plugin-splashscreen/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-8.1-phone,PLUGIN=cordova-plugin-splashscreen/)|[](http://cordova-ci.cloudapp.net:8080/job/cordova-periodic-build/PLATFORM=windows-10-store,PLUGIN=cordova-plugin-splashscreen/)|[](https://travis-ci.org/apache/cordova-plugin-splashscreen)| + # cordova-plugin-splashscreen -This plugin displays and hides a splash screen during application launch. +This plugin is required to work with splash screens. This plugin displays and hides a splash screen during application launch. -:warning: Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Splashscreen%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) +Report issues with this plugin on the [Apache Cordova issue tracker][Apache Cordova issue tracker]. ## Installation @@ -38,76 +46,192 @@ This plugin displays and hides a splash screen during application launch. - BlackBerry 10 - iOS - Windows Phone 7 and 8 -- Windows 8 -- Windows +- Windows (`cordova-windows` version >= 4.4.0 is required) - Browser -## Preferences +__Note__: Extended splashscreen does not require the plugin on Windows (as opposed to Android and iOS) in case you don't use the plugin API, i.e. programmatic hide/show. -#### config.xml +## Example Configuration +In the top-level `config.xml` file (not the one in `platforms`), add configuration elements like those specified here. -- __SplashScreen__ (string). The resource name which is used for the displaying splash screen. Different platforms use values for this. +Please notice that the value of the "src" attribute is relative to the project root directory and not to the www directory (see `Directory structure` below). You can name the source image whatever you like. The internal name in the app is determined by Cordova. - <preference name="SplashScreen" value="resourcename" /> +Directory structure: -- __AutoHideSplashScreen__ (boolean, default to `true`). Indicates wherether hide splash screen automatically or not. Splash screen hidden after amount of time specified in the `SplashScreenDelay` preference. +``` +projectRoot + hooks + platforms + plugins + www + css + img + js + res + screen + android + ios + windows +``` - <preference name="AutoHideSplashScreen" value="true" /> +```xml +<platform name="android"> + <!-- you can use any density that exists in the Android project --> + <splash src="res/screen/android/splash-land-hdpi.png" density="land-hdpi"/> + <splash src="res/screen/android/splash-land-ldpi.png" density="land-ldpi"/> + <splash src="res/screen/android/splash-land-mdpi.png" density="land-mdpi"/> + <splash src="res/screen/android/splash-land-xhdpi.png" density="land-xhdpi"/> -- __SplashScreenDelay__ (number, default to 3000). Amount of time in milliseconds to wait before automatically hide splash screen. + <splash src="res/screen/android/splash-port-hdpi.png" density="port-hdpi"/> + <splash src="res/screen/android/splash-port-ldpi.png" density="port-ldpi"/> + <splash src="res/screen/android/splash-port-mdpi.png" density="port-mdpi"/> + <splash src="res/screen/android/splash-port-xhdpi.png" density="port-xhdpi"/> +</platform> - <preference name="SplashScreenDelay" value="3000" /> +<platform name="ios"> + <!-- images are determined by width and height. The following are supported --> + <splash src="res/screen/ios/Default~iphone.png" width="320" height="480"/> + <splash src="res/screen/ios/Default@2x~iphone.png" width="640" height="960"/> + <splash src="res/screen/ios/Default-Portrait~ipad.png" width="768" height="1024"/> + <splash src="res/screen/ios/Default-Portrait@2x~ipad.png" width="1536" height="2048"/> + <splash src="res/screen/ios/Default-Landscape~ipad.png" width="1024" height="768"/> + <splash src="res/screen/ios/Default-Landscape@2x~ipad.png" width="2048" height="1536"/> + <splash src="res/screen/ios/Default-568h@2x~iphone.png" width="640" height="1136"/> + <splash src="res/screen/ios/Default-667h.png" width="750" height="1334"/> + <splash src="res/screen/ios/Default-736h.png" width="1242" height="2208"/> + <splash src="res/screen/ios/Default-Landscape-736h.png" width="2208" height="1242"/> +</platform> +<platform name="windows"> + <!-- images are determined by width and height. The following are supported --> + <splash src="res/screen/windows/splashscreen.png" width="620" height="300"/> + <splash src="res/screen/windows/splashscreenphone.png" width="1152" height="1920"/> +</platform> -### Android Quirks +<platform name="blackberry10"> + <!-- Add a rim:splash element for each resolution and locale you wish --> + <!-- http://developer.blackberry.com/html5/documentation/rim_splash_element.html --> + <rim:splash src="res/screen/blackberry/splashscreen.png"/> +</platform> -In your `config.xml`, you need to add the following preferences: +<preference name="SplashScreenDelay" value="10000" /> +``` - <preference name="SplashScreen" value="foo" /> - <preference name="SplashScreenDelay" value="3000" /> - <preference name="SplashMaintainAspectRatio" value="true|false" /> +## Preferences -Where foo is the name of the splashscreen file, preferably a 9 patch file. Make sure to add your splashcreen files to your res/xml directory under the appropriate folders. The second parameter represents how long the splashscreen will appear in milliseconds. It defaults to 3000 ms. See [Icons and Splash Screens](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) -for more information. +#### config.xml -"SplashMaintainAspectRatio" preference is optional. If set to true, splash screen drawable is not stretched to fit screen, but instead simply "covers" the screen, like CSS "background-size:cover". This is very useful when splash screen images cannot be distorted in any way, for example when they contain scenery or text. This setting works best with images that have large margins (safe areas) that can be safely cropped on screens with different aspect ratios. +- `AutoHideSplashScreen` (boolean, default to `true`). Indicates whether to hide splash screen automatically or not. Splash screen hidden after amount of time specified in the `SplashScreenDelay` preference. -The plugin reloads splash drawable whenever orientation changes, so you can specify different drawables for portrait and landscape orientations. +```xml + <preference name="AutoHideSplashScreen" value="true" /> +``` -### Browser Quirks +- `SplashScreenDelay` (number, default to 3000). Amount of time in milliseconds to wait before automatically hide splash screen. -You can use the following preferences in your `config.xml`: +```xml + <preference name="SplashScreenDelay" value="3000" /> +``` - <platform name="browser"> - <preference name="SplashScreen" value="images/browser/splashscreen.jpg" /> <!-- defaults to "img/logo.png" --> - <preference name="SplashScreenDelay" value="3000" /> <!-- defaults to "3000" --> - <preference name="SplashScreenBackgroundColor" value="green" /> <!-- defaults to "#464646" --> - <preference name="ShowSplashScreen" value="false" /> <!-- defaults to "true" --> - <preference name="SplashScreenWidth" value="600" /> <!-- defaults to "170" --> - <preference name="SplashScreenHeight" value="300" /> <!-- defaults to "200" --> - </platform> +Note also that this value used to be seconds, and not milliseconds, so values less than 30 will still be treated as seconds. ( Consider this a deprecated patch that will disapear in some future version. ) +To disable the splashscreen add the following preference to `config.xml`: +```xml +<preference name="SplashScreenDelay" value="0"/> +``` -### iOS Quirks +**iOS Quirk**: to disable the splashscreen on `ios` platform you should also add `<preference name="FadeSplashScreenDuration" value="0"/>` to `config.xml`. - `FadeSplashScreen` (boolean, defaults to `true`): Set to `false` to prevent the splash screen from fading in and out when its display state changes. - <preference name="FadeSplashScreen" value="false"/> +```xml + <preference name="FadeSplashScreen" value="false"/> +``` -- `FadeSplashScreenDuration` (float, defaults to `3000`): Specifies the +- `FadeSplashScreenDuration` (float, defaults to `500`): Specifies the number of milliseconds for the splash screen fade effect to execute. - <preference name="FadeSplashScreenDuration" value="3000"/> +```xml + <preference name="FadeSplashScreenDuration" value="750"/> +``` -Note also that this value used to be seconds, and not milliseconds, so values less than 30 will still be treated as seconds. ( Consider this a deprecated patch that will disapear in some future version. ) +_Note_: `FadeSplashScreenDuration` is included into `SplashScreenDelay`, for example if you have `<preference name="SplashScreenDelay" value="3000" />` and `<preference name="FadeSplashScreenDuration" value="1000"/>` defined in `config.xml`: +- 00:00 - splashscreen is shown +- 00:02 - fading has started +- 00:03 - splashscreen is hidden + +Turning the fading off via `<preference name="FadeSplashScreen" value="false"/>` technically means fading duration to be `0` so that in this example the overall splash delay will still be 3 seconds. + +_Note_: This only applies to the app startup - you need to take the fading timeout into account when manually showing/hiding the splashscreen in the code: + +```javascript +navigator.splashscreen.show(); +window.setTimeout(function () { + navigator.splashscreen.hide(); +}, splashDuration - fadeDuration); +``` - `ShowSplashScreenSpinner` (boolean, defaults to `true`): Set to `false` to hide the splash-screen spinner. - <preference name="ShowSplashScreenSpinner" value="false"/> +```xml + <preference name="ShowSplashScreenSpinner" value="false"/> +``` + +### Android Quirks + +In your `config.xml`, you can add the following preferences: + +```xml +<preference name="SplashMaintainAspectRatio" value="true|false" /> +<preference name="SplashShowOnlyFirstTime" value="true|false" /> +``` + +"SplashMaintainAspectRatio" preference is optional. If set to true, splash screen drawable is not stretched to fit screen, but instead simply "covers" the screen, like CSS "background-size:cover". This is very useful when splash screen images cannot be distorted in any way, for example when they contain scenery or text. This setting works best with images that have large margins (safe areas) that can be safely cropped on screens with different aspect ratios. + +The plugin reloads splash drawable whenever orientation changes, so you can specify different drawables for portrait and landscape orientations. + +"SplashShowOnlyFirstTime" preference is also optional and defaults to `true`. When set to `true` splash screen will only appear on application launch. However, if you plan to use `navigator.app.exitApp()` to close application and force splash screen appear on next launch, you should set this property to `false` (this also applies to closing the App with Back button). + +### Browser Quirks + +You can use the following preferences in your `config.xml`: + +```xml +<platform name="browser"> + <preference name="SplashScreen" value="/images/browser/splashscreen.jpg" /> <!-- defaults to "/img/logo.png" --> + <preference name="SplashScreenDelay" value="3000" /> <!-- defaults to "3000" --> + <preference name="SplashScreenBackgroundColor" value="green" /> <!-- defaults to "#464646" --> + <preference name="ShowSplashScreen" value="false" /> <!-- defaults to "true" --> + <preference name="SplashScreenWidth" value="600" /> <!-- defaults to "170" --> + <preference name="SplashScreenHeight" value="300" /> <!-- defaults to "200" --> +</platform> +``` + +__Note__: `SplashScreen` value should be absolute in order to work in a sub-page. The `SplashScreen` value is used only for the browser platform. The value will be ignored for other platforms. + +### iOS Quirks + +- In iOS, the splashscreen images are called launch images. These images are mandatory on iOS. + +### Windows Quirks + +- `SplashScreenSpinnerColor` (string, defaults to system accent color): hash, rgb notation or CSS color name. + +```xml +<preference name="SplashScreenSpinnerColor" value="#242424"/> +<preference name="SplashScreenSpinnerColor" value="DarkRed"/> +<preference name="SplashScreenSpinnerColor" value="rgb(50,128,128)"/> +``` + +- `SplashScreenBackgroundColor` (string, defaults to #464646): hex notation. + +```xml +<preference name="SplashScreenBackgroundColor" value="0xFFFFFFFF"/> +``` ## Methods @@ -118,7 +242,9 @@ Note also that this value used to be seconds, and not milliseconds, so values le Dismiss the splash screen. - navigator.splashscreen.hide(); +```js +navigator.splashscreen.hide(); +``` ### BlackBerry 10, WP8, iOS Quirk @@ -127,16 +253,19 @@ The `config.xml` file's `AutoHideSplashScreen` setting must be `false`. To delay hiding the splash screen for two seconds, add a timer such as the following in the `deviceready` event handler: - setTimeout(function() { - navigator.splashscreen.hide(); - }, 2000); +```js +setTimeout(function() { + navigator.splashscreen.hide(); +}, 2000); +``` ## splashscreen.show Displays the splash screen. - navigator.splashscreen.show(); - +```js +navigator.splashscreen.show(); +``` Your application cannot call `navigator.splashscreen.show()` until the app has started and the `deviceready` event has fired. But since typically the splash @@ -144,7 +273,7 @@ screen is meant to be visible before your app has started, that would seem to defeat the purpose of the splash screen. Providing some configuration in `config.xml` will automatically `show` the splash screen immediately after your app launch and before it has fully started and received the `deviceready` -event. See [Icons and Splash Screens](http://cordova.apache.org/docs/en/edge/config_ref_images.md.html) -for more information on doing this configuration. For this reason, it is -unlikely you need to call `navigator.splashscreen.show()` to make the splash +event. For this reason, it is unlikely you need to call `navigator.splashscreen.show()` to make the splash screen visible for app startup. + +[Apache Cordova issue tracker]: https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Splashscreen%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-splashscreen/RELEASENOTES.md index 4f6ad612..f264fe6d 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/RELEASENOTES.md @@ -20,6 +20,51 @@ --> # Release Notes +### 4.0.0 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* [CB-11326](https://issues.apache.org/jira/browse/CB-11326) Prevent crash when initializing plugin after navigating to another URL +* Fix crash on **iOS** when reloading page from remote **Safari** +* Add badges for paramedic builds on Jenkins +* Add pull request template. +* [CB-11179](https://issues.apache.org/jira/browse/CB-11179) Extend the windows-splashscreen docs +* [CB-11159](https://issues.apache.org/jira/browse/CB-11159) Fix flaky splashscreen native tests +* [CB-11156](https://issues.apache.org/jira/browse/CB-11156) Change default `FadeSplashScreenDuration` value +* [CB-8056](https://issues.apache.org/jira/browse/CB-8056) Updated the dependency version, added it to the docs +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md +* [CB-8056](https://issues.apache.org/jira/browse/CB-8056) Implement splashscreen for **Windows** platform +* [CB-6498](https://issues.apache.org/jira/browse/CB-6498) Misleading documentation in **Android** Quirks + +### 3.2.2 (Apr 15, 2016) +* [CB-10979](https://issues.apache.org/jira/browse/CB-10979) Fix splashscreen **iOS** native tests. Added `jshintignore` for tests/ios +* [CB-10895](https://issues.apache.org/jira/browse/CB-10895) Transparent Splashscreen view sometimes remains +* [CB-10562](https://issues.apache.org/jira/browse/CB-10562) `hide()` not working in latest splashscreen plug in 3.1.0 in **iOS** +* [CB-10688](https://issues.apache.org/jira/browse/CB-10688) Plugin Splashscreen Readme must have examples. +* [CB-10864](https://issues.apache.org/jira/browse/CB-10864) Run **iOS** native tests on Travis + +### 3.2.1 (Mar 09, 2016) +* [CB-10764](https://issues.apache.org/jira/browse/CB-10764) Remove emoji in cordova-plugin-splashscreen +* [CB-10650](https://issues.apache.org/jira/browse/CB-10650) Non-index content.src causes Splashscreen to be not displayed on **Browser** +* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add JSHint for plugins +* [CB-10606](https://issues.apache.org/jira/browse/CB-10606) fix deprecation warning for interfaceOrientation on **iOS** +* chore: edit package.json license to match SPDX id + +### 3.2.0 (Feb 09, 2016) +* [CB-10422](https://issues.apache.org/jira/browse/CB-10422) Splashscreen displays black screen with no image on Android +* [CB-10412](https://issues.apache.org/jira/browse/CB-10412) AutoHideSplashScreen "false" isn't taken in account on iOS +* [CB-9516](https://issues.apache.org/jira/browse/CB-9516) Android SplashScreen - Spinner Does Not Display +* [CB-9094](https://issues.apache.org/jira/browse/CB-9094) Smarter autohide logic on Android +* [CB-8396](https://issues.apache.org/jira/browse/CB-8396) Add AutoHideSplashScreen logic to Android's Splashscreen + +### 3.1.0 (Jan 15, 2016) +* [CB-9538](https://issues.apache.org/jira/browse/CB-9538) Implementing `FadeSplashScreen` feature for **Android** +* [CB-9240](https://issues.apache.org/jira/browse/CB-9240) Cordova splash screen plugin **iPad** landscape mode issue +* [CB-10263](https://issues.apache.org/jira/browse/CB-10263) Fix splashscreen plugin filenames for Asset Catalog +* [CB-9374](https://issues.apache.org/jira/browse/CB-9374) **Android** add `SplashShowOnlyFirstTime` as preference +* [CB-10244](https://issues.apache.org/jira/browse/CB-10244) Don't rotate the **iPhone 6 Plus** splash +* [CB-9043](https://issues.apache.org/jira/browse/CB-9043) Fix the **ios** splashscreen being deformed on orientation change +* [CB-10079](https://issues.apache.org/jira/browse/CB-10079) Splashscreen plugin does not honor `SplashScreenDelay` on **iOS** +* [CB-10231](https://issues.apache.org/jira/browse/CB-10231) Fix `FadeSplashScreen` to default to true on **iOS** + ### 3.0.0 (Nov 18, 2015) * [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest * Fixing contribute link. diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/package.json b/StoneIsland/plugins/cordova-plugin-splashscreen/package.json index 1c0a8403..08836dc9 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/package.json +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-splashscreen", - "version": "3.0.0", + "version": "4.0.0", "description": "Cordova Splashscreen Plugin", "cordova": { "id": "cordova-plugin-splashscreen", @@ -34,12 +34,27 @@ "cordova-windows", "cordova-tizen" ], - "engines": [ - { - "name": "cordova-android", - "version": ">=3.6.0" + "scripts": { + "test": "npm run jshint", + "jshint": "node node_modules/jshint/bin/jshint www && node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint tests" + }, + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova-android": ">=3.6.0" + }, + "4.0.0": { + "cordova-android": ">=3.6.0", + "cordova-windows": ">=4.4.0" + }, + "5.0.0": { + "cordova": ">100" + } } - ], + }, "author": "Apache Software Foundation", - "license": "Apache 2.0" + "license": "Apache-2.0", + "devDependencies": { + "jshint": "^2.6.0" + } } diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/plugin.xml b/StoneIsland/plugins/cordova-plugin-splashscreen/plugin.xml index 6477ad65..5c1e5707 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/plugin.xml @@ -20,7 +20,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-splashscreen" - version="3.0.0"> + version="4.0.0"> <name>Splashscreen</name> <description>Cordova Splashscreen Plugin</description> <license>Apache 2.0</license> @@ -30,6 +30,7 @@ <engines> <engine name="cordova-android" version=">=3.6.0" /><!-- Requires CordovaPlugin.preferences --> + <engine name="cordova-windows" version=">=4.4.0" /> </engines> <js-module src="www/splashscreen.js" name="SplashScreen"> diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/src/android/SplashScreen.java b/StoneIsland/plugins/cordova-plugin-splashscreen/src/android/SplashScreen.java index 75ad724c..14b63790 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/src/android/SplashScreen.java +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/src/android/SplashScreen.java @@ -25,13 +25,20 @@ import android.content.Context; import android.content.DialogInterface; import android.content.res.Configuration; import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.os.Handler; import android.view.Display; +import android.view.Gravity; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.AlphaAnimation; +import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; @@ -44,9 +51,12 @@ public class SplashScreen extends CordovaPlugin { // Cordova 3.x.x has a copy of this plugin bundled with it (SplashScreenInternal.java). // Enable functionality only if running on 4.x.x. private static final boolean HAS_BUILT_IN_SPLASH_SCREEN = Integer.valueOf(CordovaWebView.CORDOVA_VERSION.split("\\.")[0]) < 4; + private static final int DEFAULT_SPLASHSCREEN_DURATION = 3000; + private static final int DEFAULT_FADE_DURATION = 500; private static Dialog splashDialog; private static ProgressDialog spinnerDialog; private static boolean firstShow = true; + private static boolean lastHideAfterDelay; // https://issues.apache.org/jira/browse/CB-9094 /** * Displays the splash drawable. @@ -69,11 +79,17 @@ public class SplashScreen extends CordovaPlugin { @Override protected void pluginInitialize() { - if (HAS_BUILT_IN_SPLASH_SCREEN || !firstShow) { + if (HAS_BUILT_IN_SPLASH_SCREEN) { return; } // Make WebView invisible while loading URL - getView().setVisibility(View.INVISIBLE); + // CB-11326 Ensure we're calling this on UI thread + cordova.getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + getView().setVisibility(View.INVISIBLE); + } + }); int drawableId = preferences.getInteger("SplashDrawableId", 0); if (drawableId == 0) { String splashResource = preferences.getString("SplashScreen", "screen"); @@ -89,9 +105,14 @@ public class SplashScreen extends CordovaPlugin { // Save initial orientation. orientation = cordova.getActivity().getResources().getConfiguration().orientation; - firstShow = false; - loadSpinner(); - showSplashScreen(true); + if (firstShow) { + boolean autoHide = preferences.getBoolean("AutoHideSplashScreen", true); + showSplashScreen(autoHide); + } + + if (preferences.getBoolean("SplashShowOnlyFirstTime", true)) { + firstShow = false; + } } /** @@ -101,13 +122,26 @@ public class SplashScreen extends CordovaPlugin { return preferences.getBoolean("SplashMaintainAspectRatio", false); } + private int getFadeDuration () { + int fadeSplashScreenDuration = preferences.getBoolean("FadeSplashScreen", true) ? + preferences.getInteger("FadeSplashScreenDuration", DEFAULT_FADE_DURATION) : 0; + + if (fadeSplashScreenDuration < 30) { + // [CB-9750] This value used to be in decimal seconds, so we will assume that if someone specifies 10 + // they mean 10 seconds, and not the meaningless 10ms + fadeSplashScreenDuration *= 1000; + } + + return fadeSplashScreenDuration; + } + @Override public void onPause(boolean multitasking) { if (HAS_BUILT_IN_SPLASH_SCREEN) { return; } // hide the splash screen to avoid leaking a window - this.removeSplashScreen(); + this.removeSplashScreen(true); } @Override @@ -116,7 +150,7 @@ public class SplashScreen extends CordovaPlugin { return; } // hide the splash screen to avoid leaking a window - this.removeSplashScreen(); + this.removeSplashScreen(true); // If we set this to true onDestroy, we lose track when we go from page to page! //firstShow = true; } @@ -135,16 +169,6 @@ public class SplashScreen extends CordovaPlugin { webView.postMessage("splashscreen", "show"); } }); - } else if (action.equals("spinnerStart")) { - if (!HAS_BUILT_IN_SPLASH_SCREEN) { - final String title = args.getString(0); - final String message = args.getString(1); - cordova.getActivity().runOnUiThread(new Runnable() { - public void run() { - spinnerStart(title, message); - } - }); - } } else { return false; } @@ -160,17 +184,16 @@ public class SplashScreen extends CordovaPlugin { } if ("splashscreen".equals(id)) { if ("hide".equals(data.toString())) { - this.removeSplashScreen(); + this.removeSplashScreen(false); } else { this.showSplashScreen(false); } } else if ("spinner".equals(id)) { if ("stop".equals(data.toString())) { - this.spinnerStop(); getView().setVisibility(View.VISIBLE); } } else if ("onReceivedError".equals(id)) { - spinnerStop(); + this.spinnerStop(); } return null; } @@ -190,13 +213,45 @@ public class SplashScreen extends CordovaPlugin { } } - private void removeSplashScreen() { + private void removeSplashScreen(final boolean forceHideImmediately) { cordova.getActivity().runOnUiThread(new Runnable() { public void run() { if (splashDialog != null && splashDialog.isShowing()) { - splashDialog.dismiss(); - splashDialog = null; - splashImageView = null; + final int fadeSplashScreenDuration = getFadeDuration(); + // CB-10692 If the plugin is being paused/destroyed, skip the fading and hide it immediately + if (fadeSplashScreenDuration > 0 && forceHideImmediately == false) { + AlphaAnimation fadeOut = new AlphaAnimation(1, 0); + fadeOut.setInterpolator(new DecelerateInterpolator()); + fadeOut.setDuration(fadeSplashScreenDuration); + + splashImageView.setAnimation(fadeOut); + splashImageView.startAnimation(fadeOut); + + fadeOut.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + spinnerStop(); + } + + @Override + public void onAnimationEnd(Animation animation) { + if (splashDialog != null && splashDialog.isShowing()) { + splashDialog.dismiss(); + splashDialog = null; + splashImageView = null; + } + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + } else { + spinnerStop(); + splashDialog.dismiss(); + splashDialog = null; + splashImageView = null; + } } } }); @@ -207,9 +262,14 @@ public class SplashScreen extends CordovaPlugin { */ @SuppressWarnings("deprecation") private void showSplashScreen(final boolean hideAfterDelay) { - final int splashscreenTime = preferences.getInteger("SplashScreenDelay", 3000); + final int splashscreenTime = preferences.getInteger("SplashScreenDelay", DEFAULT_SPLASHSCREEN_DURATION); final int drawableId = preferences.getInteger("SplashDrawableId", 0); + final int fadeSplashScreenDuration = getFadeDuration(); + final int effectiveSplashDuration = Math.max(0, splashscreenTime - fadeSplashScreenDuration); + + lastHideAfterDelay = hideAfterDelay; + // If the splash dialog is showing don't try to show it again if (splashDialog != null && splashDialog.isShowing()) { return; @@ -257,60 +317,57 @@ public class SplashScreen extends CordovaPlugin { splashDialog.setCancelable(false); splashDialog.show(); + if (preferences.getBoolean("ShowSplashScreenSpinner", true)) { + spinnerStart(); + } + // Set Runnable to remove splash screen just in case if (hideAfterDelay) { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { - removeSplashScreen(); + if (lastHideAfterDelay) { + removeSplashScreen(false); + } } - }, splashscreenTime); + }, effectiveSplashDuration); } } }); } - /* - * Load the spinner - */ - private void loadSpinner() { - // If loadingDialog property, then show the App loading dialog for first page of app - String loading = null; - if (webView.canGoBack()) { - loading = preferences.getString("LoadingDialog", null); - } - else { - loading = preferences.getString("LoadingPageDialog", null); - } - if (loading != null) { - String title = ""; - String message = "Loading Application..."; - - if (loading.length() > 0) { - int comma = loading.indexOf(','); - if (comma > 0) { - title = loading.substring(0, comma); - message = loading.substring(comma + 1); - } - else { - title = ""; - message = loading; - } - } - spinnerStart(title, message); - } - } - - private void spinnerStart(final String title, final String message) { + // Show only spinner in the center of the screen + private void spinnerStart() { cordova.getActivity().runOnUiThread(new Runnable() { public void run() { spinnerStop(); - spinnerDialog = ProgressDialog.show(webView.getContext(), title, message, true, true, - new DialogInterface.OnCancelListener() { - public void onCancel(DialogInterface dialog) { - spinnerDialog = null; - } - }); + + spinnerDialog = new ProgressDialog(webView.getContext()); + spinnerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + spinnerDialog = null; + } + }); + + spinnerDialog.setCancelable(false); + spinnerDialog.setIndeterminate(true); + + RelativeLayout centeredLayout = new RelativeLayout(cordova.getActivity()); + centeredLayout.setGravity(Gravity.CENTER); + centeredLayout.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + + ProgressBar progressBar = new ProgressBar(webView.getContext()); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); + progressBar.setLayoutParams(layoutParams); + + centeredLayout.addView(progressBar); + + spinnerDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + spinnerDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + spinnerDialog.show(); + spinnerDialog.setContentView(centeredLayout); } }); } diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/src/blackberry10/index.js b/StoneIsland/plugins/cordova-plugin-splashscreen/src/blackberry10/index.js index bd7e48c8..c6825064 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/src/blackberry10/index.js +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/src/blackberry10/index.js @@ -14,6 +14,8 @@ * limitations under the License. */ +/* global PluginResult */ + module.exports = { show: function (success, fail, args, env) { var result = new PluginResult(args, env); diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js b/StoneIsland/plugins/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js index d19f8c87..6cf9309f 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js @@ -18,17 +18,18 @@ * under the License. * */ + // Default parameter values including image size can be changed in `config.xml` var splashImageWidth = 170; var splashImageHeight = 200; var position = { x: 0, y: 0, width: splashImageWidth, height: splashImageHeight }; -var splash = null; // var localSplash; // the image to display var localSplashImage; var bgColor = "#464646"; -var imageSrc = 'img/logo.png'; +var imageSrc = '/img/logo.png'; var splashScreenDelay = 3000; // in milliseconds var showSplashScreen = true; // show splashcreen by default +var cordova = require('cordova'); var configHelper = cordova.require('cordova/confighelper'); function updateImageLocation() { @@ -103,7 +104,6 @@ function readPreferencesFromCfg(cfg) { } catch(e) { var msg = '[Browser][SplashScreen] Error occured on loading preferences from config.xml: ' + JSON.stringify(e); console.error(msg); - error(msg); } } diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h b/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h index 0d6ae397..ec5d6022 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.h @@ -23,6 +23,7 @@ typedef struct { BOOL iPhone; BOOL iPad; + BOOL iPhone4; BOOL iPhone5; BOOL iPhone6; BOOL iPhone6Plus; @@ -35,6 +36,7 @@ typedef struct { UIImageView* _imageView; NSString* _curImageName; BOOL _visible; + BOOL _destroyed; } - (void)show:(CDVInvokedUrlCommand*)command; diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m b/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m index a1add304..8ad8116b 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVSplashScreen.m @@ -23,6 +23,7 @@ #import "CDVViewController+SplashScreen.h" #define kSplashScreenDurationDefault 3000.0f +#define kFadeDurationDefault 500.0f @implementation CDVSplashScreen @@ -41,7 +42,7 @@ - (void)hide:(CDVInvokedUrlCommand*)command { - [self setVisible:NO]; + [self setVisible:NO andForce:YES]; } - (void)pageDidLoad @@ -76,7 +77,7 @@ BOOL autorotateValue = (device.iPad || device.iPhone6Plus) ? [(CDVViewController *)self.viewController shouldAutorotateDefaultValue] : NO; - + [(CDVViewController *)self.viewController setEnabledAutorotation:autorotateValue]; NSString* topActivityIndicator = [self.commandDelegate.settings objectForKey:[@"TopActivityIndicator" lowercaseString]]; @@ -120,6 +121,7 @@ [parentView addObserver:self forKeyPath:@"bounds" options:0 context:nil]; [self updateImage]; + _destroyed = NO; } - (void)hideViews @@ -130,6 +132,7 @@ - (void)destroyViews { + _destroyed = YES; [(CDVViewController *)self.viewController setEnabledAutorotation:[(CDVViewController *)self.viewController shouldAutorotateDefaultValue]]; [_imageView removeFromSuperview]; @@ -139,30 +142,39 @@ _curImageName = nil; self.viewController.view.userInteractionEnabled = YES; // re-enable user interaction upon completion - [self.viewController.view removeObserver:self forKeyPath:@"frame"]; - [self.viewController.view removeObserver:self forKeyPath:@"bounds"]; + @try { + [self.viewController.view removeObserver:self forKeyPath:@"frame"]; + [self.viewController.view removeObserver:self forKeyPath:@"bounds"]; + } + @catch (NSException *exception) { + // When reloading the page from a remotely connected Safari, there + // are no observers, so the removeObserver method throws an exception, + // that we can safely ignore. + // Alternatively we can check whether there are observers before calling removeObserver + } } - (CDV_iOSDevice) getCurrentDevice { CDV_iOSDevice device; - + UIScreen* mainScreen = [UIScreen mainScreen]; CGFloat mainScreenHeight = mainScreen.bounds.size.height; CGFloat mainScreenWidth = mainScreen.bounds.size.width; - + int limit = MAX(mainScreenHeight,mainScreenWidth); - + device.iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); device.iPhone = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone); device.retina = ([mainScreen scale] == 2.0); + device.iPhone4 = (device.iPhone && limit == 480.0); device.iPhone5 = (device.iPhone && limit == 568.0); // note these below is not a true device detect, for example if you are on an // iPhone 6/6+ but the app is scaled it will prob set iPhone5 as true, but // this is appropriate for detecting the runtime screen environment device.iPhone6 = (device.iPhone && limit == 667.0); device.iPhone6Plus = (device.iPhone && limit == 736.0); - + return device; } @@ -170,15 +182,15 @@ { // Use UILaunchImageFile if specified in plist. Otherwise, use Default. NSString* imageName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UILaunchImageFile"]; - + NSUInteger supportedOrientations = [orientationDelegate supportedInterfaceOrientations]; - + // Checks to see if the developer has locked the orientation to use only one of Portrait or Landscape BOOL supportsLandscape = (supportedOrientations & UIInterfaceOrientationMaskLandscape); BOOL supportsPortrait = (supportedOrientations & UIInterfaceOrientationMaskPortrait || supportedOrientations & UIInterfaceOrientationMaskPortraitUpsideDown); // this means there are no mixed orientations in there BOOL isOrientationLocked = !(supportsPortrait && supportsLandscape); - + if (imageName) { imageName = [imageName stringByDeletingPathExtension]; @@ -187,7 +199,23 @@ { imageName = @"Default"; } - + + // Add Asset Catalog specific prefixes + if ([imageName isEqualToString:@"LaunchImage"]) + { + if (device.iPhone4 || device.iPhone5 || device.iPad) { + imageName = [imageName stringByAppendingString:@"-700"]; + } else if(device.iPhone6) { + imageName = [imageName stringByAppendingString:@"-800"]; + } else if(device.iPhone6Plus) { + imageName = [imageName stringByAppendingString:@"-800"]; + if (currentOrientation == UIInterfaceOrientationPortrait || currentOrientation == UIInterfaceOrientationPortraitUpsideDown) + { + imageName = [imageName stringByAppendingString:@"-Portrait"]; + } + } + } + if (device.iPhone5) { // does not support landscape imageName = [imageName stringByAppendingString:@"-568h"]; @@ -231,7 +259,7 @@ case UIInterfaceOrientationLandscapeRight: imageName = [imageName stringByAppendingString:@"-Landscape"]; break; - + case UIInterfaceOrientationPortrait: case UIInterfaceOrientationPortraitUpsideDown: default: @@ -240,14 +268,51 @@ } } } - + return imageName; } +- (UIInterfaceOrientation)getCurrentOrientation +{ + UIInterfaceOrientation iOrientation = [UIApplication sharedApplication].statusBarOrientation; + UIDeviceOrientation dOrientation = [UIDevice currentDevice].orientation; + + bool landscape; + + if (dOrientation == UIDeviceOrientationUnknown || dOrientation == UIDeviceOrientationFaceUp || dOrientation == UIDeviceOrientationFaceDown) { + // If the device is laying down, use the UIInterfaceOrientation based on the status bar. + landscape = UIInterfaceOrientationIsLandscape(iOrientation); + } else { + // If the device is not laying down, use UIDeviceOrientation. + landscape = UIDeviceOrientationIsLandscape(dOrientation); + + // There's a bug in iOS!!!! http://openradar.appspot.com/7216046 + // So values needs to be reversed for landscape! + if (dOrientation == UIDeviceOrientationLandscapeLeft) + { + iOrientation = UIInterfaceOrientationLandscapeRight; + } + else if (dOrientation == UIDeviceOrientationLandscapeRight) + { + iOrientation = UIInterfaceOrientationLandscapeLeft; + } + else if (dOrientation == UIDeviceOrientationPortrait) + { + iOrientation = UIInterfaceOrientationPortrait; + } + else if (dOrientation == UIDeviceOrientationPortraitUpsideDown) + { + iOrientation = UIInterfaceOrientationPortraitUpsideDown; + } + } + + return iOrientation; +} + // Sets the view's frame and image. - (void)updateImage { - NSString* imageName = [self getImageName:[[UIApplication sharedApplication] statusBarOrientation] delegate:(id<CDVScreenOrientationDelegate>)self.viewController device:[self getCurrentDevice]]; + NSString* imageName = [self getImageName:[self getCurrentOrientation] delegate:(id<CDVScreenOrientationDelegate>)self.viewController device:[self getCurrentDevice]]; if (![imageName isEqualToString:_curImageName]) { @@ -273,7 +338,7 @@ CGRect imgBounds = (img) ? CGRectMake(0, 0, img.size.width, img.size.height) : CGRectZero; CGSize screenSize = [self.viewController.view convertRect:[UIScreen mainScreen].bounds fromView:nil].size; - UIInterfaceOrientation orientation = self.viewController.interfaceOrientation; + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; CGAffineTransform imgTransform = CGAffineTransformIdentity; /* If and only if an iPhone application is landscape-only as per @@ -281,8 +346,8 @@ * landscape. In this case the image must be rotated in order to appear * correctly. */ - BOOL isIPad = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad; - if (UIInterfaceOrientationIsLandscape(orientation) && !isIPad) + CDV_iOSDevice device = [self getCurrentDevice]; + if (UIInterfaceOrientationIsLandscape(orientation) && !device.iPhone6Plus && !device.iPad) { imgTransform = CGAffineTransformMakeRotation(M_PI / 2); imgBounds.size = CGSizeMake(imgBounds.size.height, imgBounds.size.width); @@ -322,26 +387,52 @@ - (void)setVisible:(BOOL)visible { - if (visible != _visible) + [self setVisible:visible andForce:NO]; +} + +- (void)setVisible:(BOOL)visible andForce:(BOOL)force +{ + if (visible != _visible || force) { _visible = visible; id fadeSplashScreenValue = [self.commandDelegate.settings objectForKey:[@"FadeSplashScreen" lowercaseString]]; id fadeSplashScreenDuration = [self.commandDelegate.settings objectForKey:[@"FadeSplashScreenDuration" lowercaseString]]; - float fadeDuration = fadeSplashScreenDuration == nil ? kSplashScreenDurationDefault : [fadeSplashScreenDuration floatValue]; + float fadeDuration = fadeSplashScreenDuration == nil ? kFadeDurationDefault : [fadeSplashScreenDuration floatValue]; + + id splashDurationString = [self.commandDelegate.settings objectForKey: [@"SplashScreenDelay" lowercaseString]]; + float splashDuration = splashDurationString == nil ? kSplashScreenDurationDefault : [splashDurationString floatValue]; - if ((fadeSplashScreenValue == nil) || ![fadeSplashScreenValue boolValue]) + id autoHideSplashScreenValue = [self.commandDelegate.settings objectForKey:[@"AutoHideSplashScreen" lowercaseString]]; + BOOL autoHideSplashScreen = true; + + if (autoHideSplashScreenValue != nil) { + autoHideSplashScreen = [autoHideSplashScreenValue boolValue]; + } + + if (!autoHideSplashScreen) { + // CB-10412 SplashScreenDelay does not make sense if the splashscreen is hidden manually + splashDuration = 0; + } + + + if (fadeSplashScreenValue == nil) + { + fadeSplashScreenValue = @"true"; + } + + if (![fadeSplashScreenValue boolValue]) { fadeDuration = 0; } - else if(fadeDuration < 30) + else if (fadeDuration < 30) { // [CB-9750] This value used to be in decimal seconds, so we will assume that if someone specifies 10 // they mean 10 seconds, and not the meaningless 10ms fadeDuration *= 1000; } - + if (_visible) { if (_imageView == nil) @@ -349,26 +440,42 @@ [self createViews]; } } - else if (fadeDuration == 0) + else if (fadeDuration == 0 && splashDuration == 0) { [self destroyViews]; } else { __weak __typeof(self) weakSelf = self; - [UIView transitionWithView:self.viewController.view - duration:(fadeDuration / 1000) - options:UIViewAnimationOptionTransitionNone - animations:^(void) { - [weakSelf hideViews]; - } - completion:^(BOOL finished) { - if (finished) { - [weakSelf destroyViews]; - // TODO: It might also be nice to have a js event happen here -jm - } - } - ]; + float effectiveSplashDuration; + + // [CB-10562] AutoHideSplashScreen may be "true" but we should still be able to hide the splashscreen manually. + if (!autoHideSplashScreen || force) { + effectiveSplashDuration = (fadeDuration) / 1000; + } else { + effectiveSplashDuration = (splashDuration - fadeDuration) / 1000; + } + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (uint64_t) effectiveSplashDuration * NSEC_PER_SEC), dispatch_get_main_queue(), CFBridgingRelease(CFBridgingRetain(^(void) { + if (!_destroyed) { + [UIView transitionWithView:self.viewController.view + duration:(fadeDuration / 1000) + options:UIViewAnimationOptionTransitionNone + animations:^(void) { + [weakSelf hideViews]; + } + completion:^(BOOL finished) { + // Always destroy views, otherwise you could have an + // invisible splashscreen that is overlayed over your active views + // which causes that no touch events are passed + if (!_destroyed) { + [weakSelf destroyViews]; + // TODO: It might also be nice to have a js event happen here -jm + } + } + ]; + } + }))); } } } diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m b/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m index 5736b6f2..e483def6 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/src/ios/CDVViewController+SplashScreen.m @@ -35,6 +35,13 @@ - (BOOL)enabledAutorotation { NSNumber *number = (NSNumber *)objc_getAssociatedObject(self, @selector(enabledAutorotation)); + + // Defaulting to YES to correspond parent CDVViewController behavior + if (number == nil) + { + return YES; + } + return [number boolValue]; } diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/src/tizen/SplashScreenProxy.js b/StoneIsland/plugins/cordova-plugin-splashscreen/src/tizen/SplashScreenProxy.js index fbd9f35f..06c06972 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/src/tizen/SplashScreenProxy.js +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/src/tizen/SplashScreenProxy.js @@ -21,7 +21,7 @@ ( function() { -win = null; +var win = null; module.exports = { show: function() { diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/tests/ios/package.json b/StoneIsland/plugins/cordova-plugin-splashscreen/tests/ios/package.json index d8b23857..67f0edce 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/tests/ios/package.json +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/tests/ios/package.json @@ -5,9 +5,9 @@ "author": "Apache Software Foundation", "license": "Apache Version 2.0", "dependencies": { - "cordova-ios": "^3.6.0" + "cordova-ios": "*" }, "scripts": { - "test": "xcodebuild test -workspace CDVSplashScreenTest.xcworkspace -scheme CDVSplashScreenLibTests -destination 'platform=iOS Simulator,name=iPhone 5' CONFIGURATION_BUILD_DIR='/tmp'" - } -}
\ No newline at end of file + "test": "xcodebuild test -workspace CDVSplashScreenTest.xcworkspace -scheme CDVSplashScreenLibTests -destination 'platform=iOS Simulator,name=iPhone 5' CONFIGURATION_BUILD_DIR='/tmp' HEADER_SEARCH_PATHS='$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include'" + } +} diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-splashscreen/tests/plugin.xml index 36652d98..8accd865 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/tests/plugin.xml @@ -20,7 +20,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-splashscreen-tests" - version="3.0.0"> + version="4.0.0"> <name>Cordova Splashscreen Plugin Tests</name> <license>Apache 2.0</license> diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/tests/tests.js b/StoneIsland/plugins/cordova-plugin-splashscreen/tests/tests.js index 8c4d22b4..7b55a81c 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/tests/tests.js +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/tests/tests.js @@ -19,18 +19,20 @@ * */ -exports.defineAutoTest = function () { +/* jshint jasmine: true */ + +exports.defineAutoTests = function () { describe('Splashscreen (cordova)', function () { it("splashscreen.spec.1 should exist", function () { expect(navigator.splashscreen).toBeDefined(); }); - it("splashscreen.spec.2 exec method should exist", function () { + it("splashscreen.spec.2 show method should exist", function () { expect(navigator.splashscreen.show).toBeDefined(); expect(typeof navigator.splashscreen.show).toBe('function'); }); - it("splashscreen.spec.3 exec method should exist", function () { + it("splashscreen.spec.3 hide method should exist", function () { expect(navigator.splashscreen.hide).toBeDefined(); expect(typeof navigator.splashscreen.hide).toBe('function'); }); diff --git a/StoneIsland/plugins/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js b/StoneIsland/plugins/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js index 271a14ca..1003f061 100644 --- a/StoneIsland/plugins/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js +++ b/StoneIsland/plugins/cordova-plugin-splashscreen/www/windows/SplashScreenProxy.js @@ -20,57 +20,15 @@ */ /*jslint sloppy:true */ -/*global Windows:true, require, module, window, document, WinJS */ -var cordova = require('cordova'), - channel = require('cordova/channel'); - -var isPhone = (cordova.platformId == "windows") && WinJS.Utilities.isPhone; -var isHosted = window.location.protocol.indexOf('http') === 0; -var localSplash = null; -var bgColor = "#464646"; // default backgrond color; TDOO - read it from .appxmanifest -var splashImageSrc = (isHosted ? "ms-appx-web" : "ms-appx") + ":///images/" - + (isPhone ? "splashscreenphone.png" : "splashscreen.png"); +var splash = require('cordova/splashscreen'); var SplashScreen = { - setBGColor: function (cssBGColor) { - bgColor = cssBGColor; - if (localSplash) { - localSplash.style.backgroundColor = bgColor; - } - }, show: function () { - if (localSplash) { - return; // already showed - } - - localSplash = document.createElement("div"); - localSplash.style.backgroundColor = bgColor; - localSplash.style.position = "fixed"; - localSplash.style.top = "0"; - localSplash.style.width = "100%"; - localSplash.style.height = "100%"; - - localSplashImage = document.createElement("img"); - localSplashImage.src = splashImageSrc; - localSplashImage.style.maxWidth = "100%"; - localSplashImage.style.maxHeight = "100%"; - // center horizontally - localSplashImage.style.margin = "0 auto"; - localSplashImage.style.display = "block"; - // center vertically - localSplashImage.style.position = "relative"; - localSplashImage.style.top = "50%"; - localSplashImage.style.transform = "translateY(-50%)"; - - localSplash.appendChild(localSplashImage); - document.body.appendChild(localSplash); + splash.show(); }, hide: function () { - if (localSplash) { - document.body.removeChild(localSplash); - localSplash = null; - } + splash.hide(); } }; diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/CONTRIBUTING.md b/StoneIsland/plugins/cordova-plugin-whitelist/CONTRIBUTING.md index e4a178f5..7de4c641 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/CONTRIBUTING.md +++ b/StoneIsland/plugins/cordova-plugin-whitelist/CONTRIBUTING.md @@ -27,7 +27,7 @@ There are multiple ways to contribute: report bugs, improve the docs, and contribute code. For instructions on this, start with the -[contribution overview](http://cordova.apache.org/#contribute). +[contribution overview](http://cordova.apache.org/contribute/). The details are explained there, but the important items are: - Sign and submit an Apache ICLA (Contributor License Agreement). diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/LICENSE b/StoneIsland/plugins/cordova-plugin-whitelist/LICENSE index 7a4a3ea2..7a4a3ea2 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/LICENSE +++ b/StoneIsland/plugins/cordova-plugin-whitelist/LICENSE diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/NOTICE b/StoneIsland/plugins/cordova-plugin-whitelist/NOTICE index 8ec56a52..8ec56a52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/NOTICE +++ b/StoneIsland/plugins/cordova-plugin-whitelist/NOTICE diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/README.md index def10044..e19d2304 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/README.md +++ b/StoneIsland/plugins/cordova-plugin-whitelist/README.md @@ -1,30 +1,44 @@ -<!--- - license: 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. +--- +title: Whitelist +description: Whitelist external content accessible by your app. +--- +<!-- +# license: 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. --> # cordova-plugin-whitelist This plugin implements a whitelist policy for navigating the application webview on Cordova 4.0 +:warning: Report issues on the [Apache Cordova issue tracker](https://issues.apache.org/jira/issues/?jql=project%20%3D%20CB%20AND%20status%20in%20%28Open%2C%20%22In%20Progress%22%2C%20Reopened%29%20AND%20resolution%20%3D%20Unresolved%20AND%20component%20%3D%20%22Plugin%20Whitelist%22%20ORDER%20BY%20priority%20DESC%2C%20summary%20ASC%2C%20updatedDate%20DESC) + +## Installation + +You can install whitelist plugin with Cordova CLI, from npm: + +``` +$ cordova plugin add cordova-plugin-whitelist +$ cordova prepare +``` + ## Supported Cordova Platforms * Android 4.0.0 or above -* iOS 4.0.0 or above ## Navigation Whitelist Controls which URLs the WebView itself can be navigated to. Applies to @@ -32,15 +46,14 @@ top-level navigations only. Quirks: on Android it also applies to iframes for non-http(s) schemes. -By default, navigations only to `file://` URLs, are allowed. To allow other -other URLs, you must add `<allow-navigation>` tags to your `config.xml`: +By default, navigations only to `file://` URLs, are allowed. To allow others URLs, you must add `<allow-navigation>` tags to your `config.xml`: <!-- Allow links to example.com --> <allow-navigation href="http://example.com/*" /> <!-- Wildcards are allowed for the protocol, as a prefix to the host, or as a suffix to the path --> - <allow-havigation href="*://*.example.com/*" /> + <allow-navigation href="*://*.example.com/*" /> <!-- A wildcard can be used to whitelist the entire network, over HTTP and HTTPS. @@ -111,6 +124,9 @@ In `config.xml`, add `<access>` tags, like this: Without any `<access>` tags, only requests to `file://` URLs are allowed. However, the default Cordova application includes `<access origin="*">` by default. + +Note: Whitelist cannot block network redirects from a whitelisted remote website (i.e. http or https) to a non-whitelisted website. Use CSP rules to mitigate redirects to non-whitelisted websites for webviews that support CSP. + Quirk: Android also allows requests to https://ssl.gstatic.com/accessibility/javascript/android/ by default, since this is required for TalkBack to function properly. ### Content Security Policy @@ -131,13 +147,16 @@ Here are some example CSP declarations for your `.html` pages: --> <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> - <!-- Allow requests to foo.com --> + <!-- Allow everything but only from the same origin and foo.com --> <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> - <!-- Enable all requests, inline styles, and eval() --> - <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src: 'self' 'unsafe-inline' 'unsafe-eval'"> + <!-- This policy allows everything (eg CSS, AJAX, object, frame, media, etc) except that + * CSS only from the same origin and inline styles, + * scripts only from the same origin and inline styles, and eval() + --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> - <!-- Allow XHRs via https only --> + <!-- Allows XHRs only over HTTPS on the same domain. --> <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> <!-- Allow iframe to https://cordova.apache.org/ --> diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/RELEASENOTES.md b/StoneIsland/plugins/cordova-plugin-whitelist/RELEASENOTES.md index 703552ca..9e271c09 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/RELEASENOTES.md +++ b/StoneIsland/plugins/cordova-plugin-whitelist/RELEASENOTES.md @@ -20,9 +20,44 @@ --> # Release Notes +### 1.3.0 (Sep 08, 2016) +* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies +* Updated installation section +* Plugin uses `Android Log class` and not `Cordova LOG class` +* Add pull request template. +* [CB-10866](https://issues.apache.org/jira/browse/CB-10866) Adding engine info to `package.json` +* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md + +### 1.2.2 (Apr 15, 2016) +* add note about redirects +* [CB-10624](https://issues.apache.org/jira/browse/CB-10624) remove error message from `whitelist.js`, which leaves it empty + +### 1.2.1 (Jan 15, 2016) +* [CB-10194](https://issues.apache.org/jira/browse/CB-10194) info tag prints for ios when not applicable + +### 1.2.0 (Nov 18, 2015) +* removed **iOS** engine check from `plugin.xml` +* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest +* [CB-9972](https://issues.apache.org/jira/browse/CB-9972) - Remove **iOS** whitelist +* Updated the text, it should read 4.0.x and greater, since this plugin will be required for `cordova-android 5.0` +* Fixing contribute link. +* Updated `plugin.xml <info>` tag to remove warning about not needing this plugin if you are using the **iOS 9 SDK** +* [CB-9738](https://issues.apache.org/jira/browse/CB-9738) - Disable whitelist use when runtime environment is **iOS 9** +* [CB-9740](https://issues.apache.org/jira/browse/CB-9740) - Add `<info>` tag describing whitelist plugin not needed on `cordova-ios` and cordova-android 3.x` +* [CB-9568](https://issues.apache.org/jira/browse/CB-9568) - Update whitelist plugin to allow all network access by default +* [CB-9337](https://issues.apache.org/jira/browse/CB-9337) - enable use of `<access>` tags for native code network requests + +### 1.1.0 (Jun 17, 2015) +* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-whitelist documentation translation: cordova-plugin-whitelist +* fix npm md issue +* Usage of CDVURLRequestFilter protocol. +* [CB-9089](https://issues.apache.org/jira/browse/CB-9089) - iOS whitelist plugin does not compile +* [CB-9090](https://issues.apache.org/jira/browse/CB-9090) - Enable whitelist plugin for cordova-ios 4.0.0 +* Fixed error in Content-Security-Policy example + ### 1.0.0 (Mar 25, 2015) -* CB-8739 added missing license headers +* [CB-8739](https://issues.apache.org/jira/browse/CB-8739) added missing license headers * Add @Override to CustomConfigXmlParser methods * Change ID to cordova-plugin-whitelist rather than reverse-DNS-style * Tweak CSP examples in README -* CB-8660 remove extra commas from package.json +* [CB-8660](https://issues.apache.org/jira/browse/CB-8660) remove extra commas from package.json diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/de/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/de/README.md new file mode 100644 index 00000000..e97eaa63 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/de/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +Dieses Plugin implementiert eine Whitelist-Politik für die Navigation in der Anwendung Webview Cordova 4.0 + +## Cordova unterstützte Plattformen + + * Android 4.0.0 oder höher + * iOS 4.0.0 oder höher + +## Navigation-Whitelist + +Steuert, welche URLs die WebView selbst zu navigiert werden kann. Bezieht sich auf der obersten Ebene Navigationen nur. + +Macken: auf Android es gilt auch für Iframes für nicht-http(s) Systeme. + +In der Standardeinstellung Navigationen nur auf `file://` URLs, sind zulässig. Wenn andere andere URLs zulassen möchten, müssen Sie Ihre `"config.xml"` `<allow-navigation>` Markierungen hinzufügen: + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## Vorsatz-Whitelist + +Steuert, welche URLs die app zulässig ist, um das System zu öffnen Fragen. Standardmäßig dürfen keine externe URLs. + +Das entspricht auf Android eine Absicht des Typs BROWSEABLE senden. + +Diese Whitelist gilt nicht für Plugins, nur Hyperlinks und Aufrufe von `window.open()`. + +Fügen Sie in `"config.xml"` `<allow-intent>` Tags hinzu, wie folgt: + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## Netzwerk-Anforderung-Whitelist + +Steuert, welche-Anforderungen Netzwerk (Bilder, XHRs, etc.) dürfen (über Cordova native Haken) erfolgen. + +Hinweis: Wir empfehlen Ihnen eine Content Security Policy (siehe unten), das ist sicherer. Diese Whitelist ist vor allem historisch für Webansichten für die CSP nicht unterstützen. + +Fügen Sie in `"config.xml"` `<access>` Tags hinzu, wie folgt: + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +Ohne `<access>` -Tags dürfen nur Anforderungen an `file://` URLs. Enthält jedoch die Standardanwendung Cordova `<access origin="*">` standardmäßig. + +Eigenart: Android kann auch Anforderungen an https://ssl.gstatic.com/accessibility/javascript/android/ standardmäßig, da dies für TalkBack ordnungsgemäß erforderlich ist. + +### Content-Security-Policy + +Steuert, welche-Anforderungen Netzwerk (Bilder, XHRs, etc.) dürfen (über Webview direkt) erfolgen. + +Auf Android und iOS ist die Netzwerk Anfrage Whitelist (s.o.) nicht in der Lage, alle Arten von Anfragen (z.B. `< video >` & WebSockets nicht blockiert) filtern. Also, sollten Sie neben der Whitelist, [Content Security Policy](http://content-security-policy.com/) `< Meta >` -Tags auf allen Ihren Seiten verwenden. + +Auf Android Unterstützung für CSP innerhalb der System-Webview beginnt mit KitKat (aber ist in allen Versionen mit Crosswalk WebView verfügbar). + +Hier sind einige Beispiel-CSP-Deklarationen für Ihre `HTML` -Seiten: + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/es/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/es/README.md new file mode 100644 index 00000000..b3e46849 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/es/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +Este plugin implementa una polÃtica de lista blanca para navegar la aplicación webview en Cordova 4.0 + +## Plataformas soportadas Cordova + + * Android 4.0 o superior + * iOS 4.0.0 o superior + +## Lista blanca de navegación + +Controla que las URLs del WebView se puede navegar a. Se aplica a nivel superior navegaciones solo. + +Peculiaridades: en Android también se aplica a iframes para esquemas que son de http (s). + +Por defecto, navegaciones solo a direcciones URL `file://` , son permitidas. Para permitir que otros otras URL, debe agregar `< allow-navegación >` etiquetas en el `archivo config.xml`: + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## Intención de lista blanca + +Controla qué URLs de la aplicación se permite hacer el sistema para abrir. De forma predeterminada, se permiten ninguÃŒ n external URLs. + +En Android, esto equivale a enviar una intención de tipo BROWSEABLE. + +Esta lista blanca no se aplica a plugins, sólo los hipervÃnculos y las llamadas a `window.Open)`. + +En `config.xml`, agregar etiquetas `< allow-intent >` , como este: + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## Solicitud de red blanca + +Controles que las peticiones de la red (imágenes, XHRs, etc.) se les permite hacer (a través de ganchos nativa de Córdoba). + +Nota: Le sugerimos que utilice una polÃtica de seguridad de contenido (véase abajo), que es más seguro. Esta lista blanca es sobre todo histórico para webviews que no admiten la CSP. + +En `config.xml`, agregue etiquetas de `< access >` , como este: + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +Sin las etiquetas `< access >` , se admiten sólo las solicitudes a direcciones URL `file://` . Sin embargo, la aplicación por defecto de Cordova incluye `< access origin = "*" >` por defecto. + +Quirk: Android también permite las solicitudes de https://ssl.gstatic.com/accessibility/javascript/android/ por defecto, puesto que es necesario para TalkBack funcionar correctamente. + +### PolÃtica de seguridad de contenido + +Controles que las peticiones de la red (imágenes, XHRs, etc.) se les permite hacer (vÃa webview directamente). + +En iOS y Android, la red solicitud lista blanca (véase arriba) no es capaz de filtrar todos los tipos de solicitudes (por ejemplo, `< video >` y WebSockets no estén bloqueadas). AsÃ, además de la lista blanca, usted debe utilizar una etiqueta `< meta >` de [Contenido la polÃtica de seguridad](http://content-security-policy.com/) en todas las páginas. + +En Android, soporte para CSP en el sistema webview comienza con KitKat (pero está disponible en todas las versiones con WebView de paso de peatones). + +Aquà están algunas declaraciones de CSP de ejemplo para las páginas `.html` : + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/fr/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/fr/README.md new file mode 100644 index 00000000..2a8c4b73 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/fr/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +Ce plugin met en œuvre une politique de liste blanche pour naviguer le webview application sur Cordova 4.0 + +## Plates-formes prises en charge Cordova + + * 4.0.0 Android ou supérieur + * iOS 4.0.0 ou supérieur + +## Navigation liste blanche + +Contrôle quels URL le WebView lui-même peut être parcourus à . S'applique à des navigations niveau supérieur seulement. + +Particularités : sur Android il s'applique également aux iframes pour non-schémas http (s). + +Par défaut, navigations qu'aux URL `file://` , sont autorisés. Pour permettre aux autres d'autres URL, vous devez ajouter des balises `<allow-navigation>` à votre `fichier config.xml`: + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## Intent Whitelist + +Contrôle quels URL l'app n'est autorisé à poser le système d'ouverture. Par défaut, aucun external URL est autorisés. + +Sur Android, cela équivaut à envoyer une intention de type BROWSEABLE. + +Cette autorisation ne s'applique pas aux plugins, uniquement les liens hypertexte et les appels à `window.open()`. + +Dans le `fichier config.xml`, ajouter des balises `<allow-intent>` , comme ceci : + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## Réseau demande liste blanche + +Les contrôles dont les demandes de réseau (images, XHRs, etc.) sont autorisés à effectuer (via cordova natif crochets). + +Remarque : Nous vous suggérons de qu'utiliser un contenu politique de sécurité (voir ci-dessous), qui est plus sûr. Cette liste blanche est surtout historique pour webviews qui ne prennent pas en charge les CSP. + +Dans le `fichier config.xml`, ajouter des balises `<access>` , comme ceci : + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +Sans les balises `<access>` , seules les demandes d'URL `file://` sont autorisés. Toutefois, l'application de Cordoue par défaut inclut `<access origin="*" >` par défaut. + +Bizarrerie : Android permet également aux requêtes à https://ssl.gstatic.com/accessibility/javascript/android/ par défaut, puisque c'est nécessaire pour TalkBack fonctionner correctement. + +### Politique de sécurité du contenu + +Les contrôles dont les demandes de réseau (images, XHRs, etc.) sont autorisés à effectuer (via webview directement). + +Sur Android et iOS, la réseau demande liste blanche (voir ci-dessus) n'est pas en mesure de filtrer tous les types de demandes (p. ex. `< video >` & WebSockets ne sont pas bloquées). Ainsi, en plus de la liste blanche, vous devez utiliser une balise `< meta >` de [Contenu politique de sécurité](http://content-security-policy.com/) sur toutes vos pages. + +Sur Android, support pour le CSP dans le système webview commence par KitKat (mais n'est disponible sur toutes les versions à l'aide du tableau de concordance WebView). + +Voici quelques exemples de déclarations de CSP pour vos pages `.html` : + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/it/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/it/README.md new file mode 100644 index 00000000..157dc036 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/it/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +Questo plugin attua una politica di whitelist per spostarsi all'interno dell'applicazione webview in Cordova 4.0 + +## Piattaforme supportate Cordova + + * Android 4.0.0 o superiore + * iOS 4.0.0 o superiore + +## Navigazione Whitelist + +Controlla quali URL WebView stessa può essere esplorato. Si applica al solo primo livello navigazioni. + +Stranezze: su Android vale anche per gli iframe per non-schemi di http (s). + +Per impostazione predefinita, navigazioni solo agli URL `file://` , sono ammessi. Per consentire altri altri URL, è necessario aggiungere `<allow-navigation>` tag per il tuo `config. XML`: + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## Whitelist intento + +Controlla quali URL app è consentito richiedere il sistema di apertura. Per impostazione predefinita, nessun esterno URL sono ammessi. + +Su Android, ciò equivale all'invio di un intento di tipo BROWSEABLE. + +Questa whitelist non si applica ai plugin, solo i collegamenti ipertestuali e chiamate a `Window`. + +In `config. XML`, aggiungere tag `<allow-intent>` , simile al seguente: + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## Rete richiesta Whitelist + +Controlli che le richieste di rete (immagini, XHRs, ecc.) sono consentiti (tramite ganci nativo di cordova). + +Nota: Si consiglia di che utilizzare un criterio di protezione contenuti (Vedi sotto), che è più sicuro. La whitelist è principalmente storico per visualizzazioni Web che non supportano la CSP. + +In `config. XML`, aggiungere tag `< access >` , simile al seguente: + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +Senza qualsiasi tag `< access >` , sono consentite solo le richieste di URL `file://` . Tuttavia, l'applicazione di Cordova predefinito include `< access origin = "*" >` per impostazione predefinita. + +Stranezza: Android consente anche alle richieste di https://ssl.gstatic.com/accessibility/javascript/android/ per impostazione predefinita, poiché questa operazione è necessaria per TalkBack funzionare correttamente. + +### Politica di sicurezza del contenuto + +Controlli che le richieste di rete (immagini, XHRs, ecc.) possono essere effettuate (via webview direttamente). + +Su Android e iOS, la rete richiesta whitelist (Vedi sopra) non è in grado di filtrare tutti i tipi di richieste (ad esempio non sono bloccate `< video >` & WebSockets). Così, oltre alla whitelist, è necessario utilizzare un tag `< meta >` [Content Security Policy](http://content-security-policy.com/) su tutte le pagine. + +Su Android, supporto per CSP all'interno webview sistema inizia con KitKat (ma è disponibile su tutte le versioni usando Crosswalk WebView). + +Ecco alcuni esempi di dichiarazioni di CSP per le pagine `HTML` : + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/ja/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/ja/README.md new file mode 100644 index 00000000..6db17f1e --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/ja/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +ã“ã®ãƒ—ラグイン実装コルドム4.0 アプリケーション webview をナビゲートã™ã‚‹ãŸã‚ã®ãƒ›ãƒ¯ã‚¤ãƒˆ リスト ãƒãƒªã‚·ãƒ¼ + +## サãƒãƒ¼ãƒˆã•れã¦ã„るコルドãƒã®ãƒ—ラットフォーム+ + * アンドãƒã‚¤ãƒ‰ 4.0.0 以上 + * iOS 4.0.0 以上 + +## ナビゲーションã®ãƒ›ãƒ¯ã‚¤ãƒˆ リスト + +WebView 自体ã«ç§»å‹•ã« Url を制御ã—ã¾ã™ã€‚最上ä½ãƒŠãƒ“ゲーションã®ã¿ã«é©ç”¨ã•れã¾ã™ã€‚ + +ç™–: Android ã«ã‚‚ã«é©ç”¨ã•れã¾ã™ã® iframe éž-[http スã‚ーム。 + +既定ã§ã¯ã€ãƒŠãƒ“ゲーション〠`file://`ã® Url ã«ã®ã¿è¨±å¯ã•れã¾ã™ã€‚ãã®ä»–ã®ä»–ã® Url を許å¯ã™ã‚‹ã‚ˆã†ã«ã€ `config.xml`ã«`<allow-navigation>`ã‚¿ã‚°ã‚’è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## インテントã®ãƒ›ãƒ¯ã‚¤ãƒˆ リスト + +ã©ã® Url ã‚’é–‹ãよã†ã«ã‚·ã‚¹ãƒ†ãƒ ã‚’èžã„ã¦ã€ã‚¢ãƒ—リã«è¨±å¯ã‚’制御ã—ã¾ã™ã€‚ 既定ã§ã¯ã€å¤–部 Url 許å¯ã•れã¾ã›ã‚“。 + +äººé€ äººé–“ã€ã“れã¯åž‹ BROWSEABLE ã®æ„図をé€ä¿¡ã™ã‚‹ã“ã¨ã«ç›¸å½“ã—ã¾ã™ã€‚ + +ã“ã®ãƒ›ãƒ¯ã‚¤ãƒˆ リストã¯ãƒ—ラグインã®ã¿ãƒã‚¤ãƒ‘ーリンクãŠã‚ˆã³`window.open()`ã¸ã®å‘¼ã³å‡ºã—ã«ã¯é©ç”¨ã•れã¾ã›ã‚“。. + +`Config.xml`内ã®`<allow-intent>`ã‚¿ã‚°ã¯ã€ã“ã®ã‚ˆã†ãªã‚’è¿½åŠ ã—ã¾ã™ã€‚ + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¦æ±‚ã®ãƒ›ãƒ¯ã‚¤ãƒˆ リスト + +ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¦æ±‚コントãƒãƒ¼ãƒ« (ç”»åƒã€XHRs ç‰) (コルドムãƒã‚¤ãƒ†ã‚£ãƒ– フック) を介ã—ã¦è¡Œã‚れるã“ã¨ãŒã€‚ + +注: より安全ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ ã‚»ã‚ュリティ ãƒãƒªã‚·ãƒ¼ (下記å‚ç…§) を使用ã—ã¦ãŠå‹§ã‚ã—ã¾ã™ã€‚ ã“ã®ãƒ›ãƒ¯ã‚¤ãƒˆ リストã»ã¨ã‚“ã©ã® CSP をサãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ web 表示ã®ãŸã‚ã«æ´å²çš„ã§ã™ã€‚ + +`Config.xml`内ã®ã“ã®ã‚ˆã†ãª`<access>`ã‚¿ã‚°ã‚’è¿½åŠ ã—ã¾ã™ã€‚ + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +`<access>`ã‚¿ã‚°ã€ãªã—`file://` Url ã«è¦æ±‚ã®ã¿ã‚’許å¯ã—ã¾ã™ã€‚ ãŸã ã—ã€æ—¢å®šã®ã‚³ãƒ«ãƒ‰ãƒ アプリケーションãŒå«ã¾ã‚Œã¦ã„ã¾ã™`<access origin="*">`デフォルトã§ã€‚ + +æ°—ã¾ãれ: アンドãƒã‚¤ãƒ‰ã‚‚è¦æ±‚ã§ãã¾ã™ https://ssl.gstatic.com/accessibility/javascript/android/デフォルトã§ã¯ã€ãƒˆãƒ¼ã‚¯ãŒæ£å¸¸ã«æ©Ÿèƒ½ã™ã‚‹ãŸã‚ã«å¿…è¦ã§ã™ã®ã§ã€‚ + +### コンテンツã®ã‚»ã‚ュリティ ãƒãƒªã‚·ãƒ¼ + +ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¦æ±‚コントãƒãƒ¼ãƒ« (ç”»åƒã€XHRs ç‰) (直接 webview) を介ã—ã¦è¡Œã‚れるã“ã¨ãŒã€‚ + +Android 㨠iOS ã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¦æ±‚ホワイト リスト (上記å‚ç…§) ã¯ã™ã¹ã¦ã®ç¨®é¡žã®è¦æ±‚ (例: `< ビデオ >` & Websocket ãŒãµã•ãŒã‚Œã¦ã„ãªã„) をフィルター処ç†ã§ãã¾ã›ã‚“。 ã ã‹ã‚‰ã€ãƒ›ãƒ¯ã‚¤ãƒˆ リストã«åŠ ãˆã¦ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã«[コンテンツ ã‚»ã‚ュリティ ãƒãƒªã‚·ãƒ¼](http://content-security-policy.com/) `< meta >`タグを使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + +Android 上システムwebview 内 CSP サãƒãƒ¼ãƒˆ ã‚ットカットã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ (ã—ã‹ã—æ¨ªæ–æ©é“ WebView を使用ã—ã¦ã™ã¹ã¦ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§åˆ©ç”¨å¯èƒ½ã§ã™)。 + +`.Html`ページã®ã„ãã¤ã‹ã®ä¾‹ CSP ã®å®£è¨€ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚ + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/ko/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/ko/README.md new file mode 100644 index 00000000..4cbae914 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/ko/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +ì´ í”ŒëŸ¬ê·¸ì¸ êµ¬í˜„ 코르ë„ë°” 4.0 ì‘ìš© 프로그램 webview를 íƒìƒ‰ì— 대 한 허용 ì •ì±… + +## ì§€ì›ëœ 코르ë„ë°” í”Œëž«í¼ + + * 안 드 로ì´ë“œ 4.0.0 ì´ìƒ + * iOS 4.0.0 ì´ìƒ + +## íƒìƒ‰ 허용 + +WebView ìžì²´ê°€ íƒìƒ‰í• 수 있는 Urlì„ ì œì–´ 합니다. 최ìƒìœ„ íƒìƒ‰ì—ë§Œ ì ìš© ë©ë‹ˆë‹¤. + +단ì : 안 드 로ì´ë“œì—ë„ ì ìš© ë©ë‹ˆë‹¤ iframeì— ëŒ€ 한 비-í”„ë¡œí† ì½œì¸ ê³„íš. + +기본ì 으로 íƒìƒ‰ `file://` Urlì—ë§Œ ì‚¬ìš©í• ìˆ˜ 있습니다. 다른 다른 Urlì„ í—ˆìš© í•˜ë ¤ë©´ `config.xml`ì— `< allow-navigation >` 태그를 추가 해야 합니다. + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## ì˜ë„ 허용 + +App 시스템 ì—´ì„ ê²Œ 허용 ë˜ëŠ” Urlì„ ì œì–´ 합니다. 기본ì 으로 외부 Urlì€ ì‚¬ìš©í• ìˆ˜ 있습니다. + +안 드 로ì´ë“œì—ì´ í˜•ì‹ì˜ BROWSEABLE ì˜ë„ 보내는 것 같습니다. + +ì´ í—ˆìš© ëœ í”ŒëŸ¬ê·¸ì¸, 하ì´í¼ë§í¬ ë° `window.open ()` í˜¸ì¶œì— ì ìš© ë˜ì§€ 않습니다.. + +`Config.xml`ì—ì´ ê°™ì€ `< allow-intent >` 태그를 추가 합니다. + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## ë„¤íŠ¸ì›Œí¬ ìš”ì² í—ˆìš© + +ìš”ì²ì„ ë„¤íŠ¸ì›Œí¬ ì»¨íŠ¸ë¡¤ (ì´ë¯¸ì§€, XHRs, 등) (코르ë„ë°” 네ì´í‹°ë¸Œ 후í¬)를 통해 í• ìˆ˜ 있습니다. + +ì°¸ê³ : ë‹¹ì‹ ì´ ì‚¬ìš© 콘í…ì¸ ë³´ì•ˆ ì •ì±… (아래 참조), ë” ì•ˆì „í•œ ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤. ì´ í—ˆìš©ì€ CSP를 ì§€ì› í•˜ì§€ 않는 webviewsì— ëŒ€ 한 ì—사ì . + +`Config.xml`ì—ì´ ê°™ì€ `< access >` 태그를 추가 합니다. + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +ì–´ë–¤ `< access >` 태그 ì—†ì´ ìš”ì² `file://` Url ì‚¬ìš©í• ìˆ˜ 있습니다. 그러나 기본 코르ë„ë°” ì‘ìš© í”„ë¡œê·¸ëž¨ì„ í¬í•¨ 하는, `< access origin="*" >` 기본ì 으로. + +특질: 안 드 로ì´ë“œ ë˜í•œ 수 있습니다 ìš”ì²ì„ https://ssl.gstatic.com/accessibility/javascript/android/ 기본ì 으로 í•„ìš” ì œëŒ€ë¡œ ìž‘ë™ í•˜ë ¤ë©´ ì˜ê²¬ ì´ë¯€ë¡œ. + +### 콘í…ì¸ ë³´ì•ˆ ì •ì±… + +ìš”ì²ì„ ë„¤íŠ¸ì›Œí¬ ì»¨íŠ¸ë¡¤ (ì´ë¯¸ì§€, XHRs, 등) (webview ì§ì ‘)를 통해 í• ìˆ˜ 있습니다. + +안 드 로ì´ë“œì™€ iOSì— ë„¤íŠ¸ì›Œí¬ ìš”ì² í—ˆìš© (위 참조)는 ëª¨ë“ ì¢…ë¥˜ì˜ ìš”ì² (예: `< 비디오 >` & WebSockets 차단 ë˜ì§€ 않습니다)를 í•„í„°ë§ í• ìˆ˜ 없습니다. 그래서, 허용, ë¿ë§Œ ì•„ë‹ˆë¼ ê·€í•˜ì˜ ëª¨ë“ íŽ˜ì´ì§€ì— [콘í…ì¸ ë³´ì•ˆ ì •ì±…](http://content-security-policy.com/) `< meta >` 태그를 사용 해야 합니다. + +안 드 로ì´ë“œ, 시스템 webview ë‚´ì—서 CSPì— ëŒ€ 한 ì§€ì›ì„ KitKat 시작 (하지만 횡단 ë³´ë„ WebView를 사용 하 ì—¬ ëª¨ë“ ë²„ì „ì—서 ì‚¬ìš©í• ìˆ˜). + +다ìŒì€ `.html` 페ì´ì§€ì— 대 한 몇 가지 ì˜ˆì œ CSP ì„ ì–¸ìž…ë‹ˆë‹¤. + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/pl/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/pl/README.md new file mode 100644 index 00000000..ecdc3d5c --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/pl/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +Ten plugin wdraża polityki białej nawigacja widoku sieci Web aplikacji na Cordova 4.0 + +## Cordova obsługiwanych platform + + * Android 4.0.0 lub powyżej + * iOS 4.0.0 lub powyżej + +## Biała lista nawigacji + +Kontroluje, których adresy URL widoku sieci Web, samej można nawigować do. Dotyczy tylko najwyższego poziomu nawigacje. + +Dziwactwa: na Android to dotyczy także IFRAME do nie-http (s) systemów. + +Domyślnie, nawigacje tylko do URLi `file://` , są dozwolone. Aby zezwolić na inne adresy URL, należy dodać Tagi `< allow-navigation >` do pliku `config.xml`: + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## Zamiarem biała + +Kontroluje, których adresy URL aplikacji jest możliwość zapytać systemem otwierania. Domyślnie nie ma zewnętrznych adresów URL są dozwolone. + +Na Android to przyrównuje do wysyłania zamiarem typu BROWSEABLE. + +Ta biała nie ma zastosowania do pluginów, tylko hiperłącza i wywołania `window.open()`. + +W `pliku config.xml`dodawanie tagów `< allow-intent >` , jak to: + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## Sieci wniosek biała + +Formanty, które sieci żądań (obrazy, XHRs, itp.) mogą być wykonane (za pośrednictwem cordova rodzimych haki). + +Uwaga: Zalecamy, że używasz treści polityki bezpieczeństwa (patrz poniżej), który jest bardziej bezpieczne. Ta Biała jest głównie historyczne dla webviews, które nie obsługują CSP. + +W `pliku config.xml`dodawanie tagów `< access >` , jak to: + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +Bez żadnych tagów `< access >` dozwolone są tylko żądania do URLi `file://` . Jednak domyślnie Cordova aplikacja zawiera `< access origin = "*" >` domyślnie. + +Cokół: Android pozwala również żądania do https://ssl.gstatic.com/accessibility/javascript/android/ domyślnie, ponieważ jest to wymagane dla TalkBack wobec funkcja poprawnie. + +### Zasady zabezpieczeń zawartości + +Formanty, które sieci żądań (obrazy, XHRs, itp.) mogą być wykonane (za pomocą widoku sieci Web bezpośrednio). + +Na Androida i iOS biała żądanie sieci (patrz wyżej) nie jest w stanie filtrować wszystkie rodzaje wniosków (np. `< video >` & WebSockets nie są zablokowane). Tak oprócz białej listy, należy użyć tagu `< meta >` [Treści polityki bezpieczeństwa](http://content-security-policy.com/) na wszystkich stronach. + +Na Android wsparcie dla CSP w ramach systemu widoku sieci Web zaczyna KitKat (ale jest dostępne we wszystkich wersjach przy użyciu widoku sieci Web przejście dla pieszych). + +Oto niektóre przykład CSP deklaracje dla strony `HTML` : + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/doc/zh/README.md b/StoneIsland/plugins/cordova-plugin-whitelist/doc/zh/README.md new file mode 100644 index 00000000..c2c7e112 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-whitelist/doc/zh/README.md @@ -0,0 +1,148 @@ +<!-- +# license: 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. +--> + +# cordova-plugin-whitelist + +這個外掛程å¼å¯¦ç¾ä¸€å€‹ç”¨æ–¼å°Žèˆªåœ¨ç§‘爾多瓦 4.0 æ‡‰ç”¨ç¨‹å¼ web 視圖的白åå–®ç–ç•¥ + +## 支æ´çš„科爾多瓦平臺 + + * Android 4.0.0 或以上 + * iOS 4.0.0 或以上 + +## 導航白åå–® + +控制 web 視圖本身å¯ä»¥å°Žèˆªåˆ°çš„ Url。é©ç”¨äºŽé ‚級導航åªã€‚ + +怪癖: 在 Android 上它也é©ç”¨äºŽ iframe çš„éž-çµè¨ˆç•«ã€‚ + +é è¨æƒ…æ³ä¸‹ï¼Œåªæœ‰åˆ°`file://` Url 導航å…許。若è¦å…許其他其他 Urlï¼Œå¿…é ˆå°‡`<allow-navigation>`æ¨™ç±¤æ·»åŠ åˆ°æ‚¨çš„`config.xml`: + + <!-- Allow links to example.com --> + <allow-navigation href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-navigation href="*://*.example.com/*" /> + + <!-- A wildcard can be used to whitelist the entire network, + over HTTP and HTTPS. + *NOT RECOMMENDED* --> + <allow-navigation href="*" /> + + <!-- The above is equivalent to these three declarations --> + <allow-navigation href="http://*/*" /> + <allow-navigation href="https://*/*" /> + <allow-navigation href="data:*" /> + + +## 科爾多瓦-外掛程å¼-白åå–® + +控制應用程å¼å…許讓系統打開的 Url。 é è¨æƒ…æ³ä¸‹ï¼Œæ²’有外部 Url å…許。 + +在 android 系統,這相當於發é€é¡žåž‹ BROWSEABLE çš„æ„圖。 + +æ¤ç™½å單並ä¸é©ç”¨äºŽåªè¶…連çµå’Œå°`window.open ()`調用的外掛程å¼. + +在`config.xml`䏿·»åŠ `<allow-intent>`標籤,åƒé€™æ¨£: + + <!-- Allow links to web pages to open in a browser --> + <allow-intent href="http://*/*" /> + <allow-intent href="https://*/*" /> + + <!-- Allow links to example.com to open in a browser --> + <allow-intent href="http://example.com/*" /> + + <!-- Wildcards are allowed for the protocol, as a prefix + to the host, or as a suffix to the path --> + <allow-intent href="*://*.example.com/*" /> + + <!-- Allow SMS links to open messaging app --> + <allow-intent href="sms:*" /> + + <!-- Allow tel: links to open the dialer --> + <allow-intent href="tel:*" /> + + <!-- Allow geo: links to open maps --> + <allow-intent href="geo:*" /> + + <!-- Allow all unrecognized URLs to open installed apps + *NOT RECOMMENDED* --> + <allow-intent href="*" /> + + +## 網路請求白åå–® + +ç¶²è·¯è«‹æ±‚çš„æŽ§åˆ¶é … (圖åƒï¼ŒXHRs ç‰) å…許 (通éŽç§‘爾多瓦本機掛鉤)。 + +注æ„: 我們建è°ä½ 使用內容的安全性原則 (見下文),這是更安全。 æ¤ç™½å單大多是為 webviews 䏿”¯æ´ CSP çš„æ·å²ã€‚ + +在`config.xml`䏿·»åŠ `<access>`標記,åƒé€™æ¨£: + + <!-- Allow images, xhrs, etc. to google.com --> + <access origin="http://google.com" /> + <access origin="https://google.com" /> + + <!-- Access to the subdomain maps.google.com --> + <access origin="http://maps.google.com" /> + + <!-- Access to all the subdomains on google.com --> + <access origin="http://*.google.com" /> + + <!-- Enable requests to content: URLs --> + <access origin="content:///*" /> + + <!-- Don't block any requests --> + <access origin="*" /> + + +沒有任何`<access>`標籤,åªåˆ°`file://` Url å…許請求。 但是,é è¨çš„科爾多瓦應用程å¼åŒ…括`<access origin="*">` ,é è¨æƒ…æ³ã€‚ + +怪癖: Android é‚„å…è¨±å° HTTPs://ssl.gstatic.com/accessibility/javascript/android/ 請求é è¨æƒ…æ³ä¸‹ï¼Œå› 為這是å°è¬›æ£å¸¸æ‰€éœ€ã€‚ + +### å…§å®¹å®‰å…¨æ”¿ç– + +ç¶²è·¯è«‹æ±‚çš„æŽ§åˆ¶é … (圖åƒï¼ŒXHRs ç‰) å…許 (é€šéŽ web 視圖直接)。 + +å° Android å’Œ iOS,網路請求白åå–® (見上文) 是ä¸èƒ½å¤ éŽæ¿¾æ‰€æœ‰é¡žåž‹çš„請求 (例如`<video>` & Websocket 未被阻æ¢)。 那麼,除了白åå–®ä¸ï¼Œä½ 應使用[內容安全性原則](http://content-security-policy.com/) `< å…ƒ >`標記您的所有é é¢ã€‚ + +在 android ç³»çµ±ï¼Œå° CSP 系統 web 視圖的支æ´é–‹å§‹å¥‡å·§ (但是是上使用 web 視圖人行橫é“上的所有版本å¯ç”¨)。 + +䏋颿˜¯ä¸€äº›ç¤ºä¾‹ CSP è²æ˜Žç‚º`.html`é é¢: + + <!-- Good default declaration: + * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication + * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly + * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: + * Enable inline JS: add 'unsafe-inline' to default-src + * Enable eval(): add 'unsafe-eval' to default-src + --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *"> + + <!-- Allow requests to foo.com --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com"> + + <!-- Enable all requests, inline styles, and eval() --> + <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> + + <!-- Allow XHRs via https only --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' https:"> + + <!-- Allow iframe to https://cordova.apache.org/ --> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/package.json b/StoneIsland/plugins/cordova-plugin-whitelist/package.json index 2c72e256..ae0d386c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/package.json +++ b/StoneIsland/plugins/cordova-plugin-whitelist/package.json @@ -1,34 +1,32 @@ { "name": "cordova-plugin-whitelist", - "version": "1.0.0", + "version": "1.3.0", "description": "Cordova Whitelist Plugin", "cordova": { "platforms": [ - "android", - "ios" + "android" ] }, "repository": { "type": "git", - "url": "https://git-wip-us.apache.org/repos/asf/cordova-plugin-whitelist.git" + "url": "https://github.com/apache/cordova-plugin-whitelist" }, "keywords": [ "cordova", "whitelist", "ecosystem:cordova", - "cordova-android", - "cordova-ios" + "cordova-android" ], - "engines": [ - { - "name": "cordova-android", - "version": ">=4.0.0-dev" - }, - { - "name": "cordova-ios", - "version": ">=4.0.0-dev" + "engines": { + "cordovaDependencies": { + "0.0.0": { + "cordova-android": ">=4.0.0" + }, + "2.0.0": { + "cordova": ">100" + } } - ], + }, "author": "Apache Software Foundation", "license": "Apache 2.0" } diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/plugin.xml b/StoneIsland/plugins/cordova-plugin-whitelist/plugin.xml index 2ec60b3c..21f7b54b 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-whitelist/plugin.xml @@ -20,14 +20,14 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" id="cordova-plugin-whitelist" - version="1.0.0"> + version="1.3.0"> <name>Whitelist</name> <description>Cordova Network Whitelist Plugin</description> <license>Apache 2.0</license> <keywords>cordova,whitelist,policy</keywords> <engines> - <engine name="cordova-android" version=">=4.0.0-dev" /> + <engine name="cordova-android" version=">=4.0.0" /> </engines> <platform name="android"> @@ -40,8 +40,11 @@ <source-file src="src/android/WhitelistPlugin.java" target-dir="src/org/apache/cordova/whitelist" /> - <js-module src="whitelist.js" name="whitelist"> - <runs /> - </js-module> + <info> + This plugin is only applicable for versions of cordova-android greater than 4.0. If you have a previous platform version, you do *not* need this plugin since the whitelist will be built in. + </info> </platform> + + + </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/src/android/WhitelistPlugin.java b/StoneIsland/plugins/cordova-plugin-whitelist/src/android/WhitelistPlugin.java index 4e4f57e1..36567886 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-whitelist/src/android/WhitelistPlugin.java +++ b/StoneIsland/plugins/cordova-plugin-whitelist/src/android/WhitelistPlugin.java @@ -21,11 +21,11 @@ package org.apache.cordova.whitelist; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.ConfigXmlParser; +import org.apache.cordova.LOG; import org.apache.cordova.Whitelist; import org.xmlpull.v1.XmlPullParser; import android.content.Context; -import android.util.Log; public class WhitelistPlugin extends CordovaPlugin { private static final String LOG_TAG = "WhitelistPlugin"; @@ -90,7 +90,7 @@ public class WhitelistPlugin extends CordovaPlugin { boolean external = (xml.getAttributeValue(null, "launch-external") != null); if (origin != null) { if (external) { - Log.w(LOG_TAG, "Found <access launch-external> within config.xml. Please use <allow-intent> instead."); + LOG.w(LOG_TAG, "Found <access launch-external> within config.xml. Please use <allow-intent> instead."); allowedIntents.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0)); } else { if ("*".equals(origin)) { diff --git a/StoneIsland/plugins/cordova-plugin-whitelist/src/ios/CDVNavigationWhitelistPlugin.m b/StoneIsland/plugins/cordova-plugin-whitelist/src/ios/CDVNavigationWhitelistPlugin.m deleted file mode 100755 index 5895e89b..00000000 --- a/StoneIsland/plugins/cordova-plugin-whitelist/src/ios/CDVNavigationWhitelistPlugin.m +++ /dev/null @@ -1,89 +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. - */ - -#import "CDVNavigationWhitelistPlugin.h" -#import <Cordova/CDVViewController.h> - -#pragma mark CDVNavigationWhitelistConfigParser - -@interface CDVNavigationWhitelistConfigParser : NSObject <NSXMLParserDelegate> {} - -@property (nonatomic, strong) NSMutableArray* whitelistHosts; - -@end - -@implementation CDVNavigationWhitelistConfigParser - -@synthesize whitelistHosts; - -- (id)init -{ - self = [super init]; - if (self != nil) { - self.whitelistHosts = [[NSMutableArray alloc] initWithCapacity:30]; - [self.whitelistHosts addObject:@"file:///*"]; - [self.whitelistHosts addObject:@"content:///*"]; - [self.whitelistHosts addObject:@"data:///*"]; - } - return self; -} - -- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict -{ - if ([elementName isEqualToString:@"allow-navigation"]) { - [whitelistHosts addObject:attributeDict[@"href"]]; - } -} - -- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName -{ -} - -- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError -{ - NSAssert(NO, @"config.xml parse error line %ld col %ld", (long)[parser lineNumber], (long)[parser columnNumber]); -} - - -@end - -#pragma mark CDVNavigationWhitelistPlugin - -@interface CDVNavigationWhitelistPlugin () {} -@property (nonatomic, strong) CDVWhitelist* whitelist; -@end - -@implementation CDVNavigationWhitelistPlugin - -@synthesize whitelist; - -- (void)setViewController:(UIViewController *)viewController -{ - if ([viewController isKindOfClass:[CDVViewController class]]) { - CDVWhitelistConfigParser *whitelistConfigParser = [[CDVWhitelistConfigParser alloc] init]; - [(CDVViewController *)viewController parseSettingsWithParser:whitelistConfigParser]; - self.whitelist = [[CDVWhitelist alloc] initWithArray:whitelistConfigParser.whitelistHosts]; - } -} - -- (BOOL)shouldAllowNavigationToURL:(NSURL *)url -{ - return [self.whitelist URLIsAllowed:url]; -} -@end diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/MIT b/StoneIsland/plugins/cordova-plugin-x-socialsharing/MIT new file mode 100644 index 00000000..f932f6d9 --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016 Eddy Verbruggen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/README.md b/StoneIsland/plugins/cordova-plugin-x-socialsharing/README.md index 21709982..52e5515c 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/README.md +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/README.md @@ -24,6 +24,7 @@ Every now and then kind folks ask me how they can give me all their money. So if 4. [iOS and Android](#4a-usage-on-ios-and-android) 4. [Windows Phone](#4b-usage-on-windows-phone) 4. [Share-popover on iPad](#4c-share-popover-on-ipad) + 4. [Whitelisting on iOS 9](#4d-whitelisting-on-ios-9) 5. [Credits](#5-credits) 6. [License](#6-license) @@ -154,6 +155,33 @@ However, what exactly gets shared, depends on the application the user chooses t - Facebook iOS: message, image (other filetypes are not supported), link. Beware that since a Fb update in April 2015 sharing a prefilled message is no longer possible when the Fb app is installed (like Android), see #344. Alternative: use `shareViaFacebookWithPasteMessageHint`. ### Using the share sheet +Since version 5.1.0 (for iOS and Android) it's recommended to use `shareWithOptions` as it's the most feature rich way to share stuff cross-platform. + +It will also tell you if sharing to an app completed and which app that was (if that app plays nice, that is). + +```js +// this is the complete list of currently supported params you can pass to the plugin (all optional) +var options = { + message: 'share this', // not supported on some apps (Facebook, Instagram) + subject: 'the subject', // fi. for email + files: ['', ''], // an array of filenames either locally or remotely + url: 'https://www.website.com/foo/#bar?a=b', + chooserTitle: 'Pick an app' // Android only, you can override the default share sheet title +} + +var onSuccess = function(result) { + console.log("Share completed? " + result.completed); // On Android apps mostly return false even while it's true + console.log("Shared to app: " + result.app); // On Android result.app is currently empty. On iOS it's empty when sharing is cancelled (result.completed=false) +} + +var onError = function(msg) { + console.log("Sharing failed with message: " + msg); +} + +window.plugins.socialsharing.shareWithOptions(options, onSuccess, onError); +``` + +#### You can still use the older `share` method as well Here are some examples you can copy-paste to test the various combinations: ```html <button onclick="window.plugins.socialsharing.share('Message only')">message only</button> @@ -226,6 +254,18 @@ iOS Quirks: <button onclick="window.plugins.socialsharing.shareViaWhatsApp('Message via WhatsApp', null /* img */, null /* url */, function() {console.log('share ok')}, function(errormsg){alert(errormsg)})">msg via WhatsApp (with errcallback)</button> ``` +##### Experimental feature: sharing directly to someone +Available in 5.0.8 and up - please let me know if this works for your device! Open an issue if not.. + +```html +<button onclick="window.plugins.socialsharing.shareViaWhatsAppToReceiver(receiver, 'Message via WhatsApp', null /* img */, null /* url */, function() {console.log('share ok')})">msg via WhatsApp for Addressbook ID 101</button> +``` +For `receiver` on iOS pass in the Addressbook ID (or 'abid'). You can find those abid's by using the [Cordova Contacts Plugin](https://github.com/apache/cordova-plugin-contacts). +The result in the success callback of the `find` function is a JSON array of contact objects, use the 'id' you find in those objects. +Don't pass in an image on iOS because that can't be sent to someone directly unfortunately. Message and URL are fine though. + +On Android pass in the phone number of the person you want to send a message to (untested at the moment). + ####SMS Note that on Android, SMS via Hangouts may not behave correctly ```html @@ -247,7 +287,7 @@ window.plugins.socialsharing.shareViaEmail( ['cc@person1.com'], // CC: must be null or an array null, // BCC: must be null or an array ['https://www.google.nl/images/srpr/logo4w.png','www/localimage.png'], // FILES: can be null, a string, or an array - onSuccess, // called when sharing worked, but also when the user cancelled sharing via email (I've found no way to detect the difference) + onSuccess, // called when sharing worked, but also when the user cancelled sharing via email. On iOS, the callbacks' boolean result parameter is true when sharing worked, false if cancelled. On Android, this parameter is always true so it can't be used). See section "Notes about the successCallback" below. onError // called when sh*t hits the fan ); ``` @@ -441,31 +481,51 @@ window.plugins.socialsharing.setIPadPopupCoordinates(targetBounds); window.plugins.socialsharing.share('Hello from iOS :)') ``` -## 5. Credits ## +## 4d. Whitelisting on iOS 9 -This plugin was enhanced for Plugman / PhoneGap Build by [Eddy Verbruggen](http://www.x-services.nl). -The Android and Windows Phone code was entirely created by the author. -The first iteration of the iOS code was inspired by [Cameron Lerch](https://github.com/bfcam/phonegap-ios-social-plugin). +On iOS 9 you have to make sure to whitelist the applications you want to use for sharing. Without whitelisting "query schemes", you may get the error callback invoked when calling the `canShareVia` function (and possibly the `shareVia`). You can verify this is a permissions issue by observing the output in XCode for something like: + +> -canOpenURL: failed for URL: "whatsapp://app" - error: "This app is not allowed to query for scheme whatsapp" +You have a few options to prevent this by whitelisting the application you want to share via: -## 6. License +### Directly editing the .plist file +This is a stright forward approach - you just manually edit the .plist file - either from within XCode or using a text editor. You can see example entries above (e.g. xyz). While this is simple to do, the changes may be lost when rebuilding the project or tweaking the platform (e.g. upgrading) and is less recomended. -[The MIT License (MIT)](http://www.opensource.org/licenses/mit-license.html) +### Use query schema plugin +There is a plugin designed specifically to address query schema whitelisting. You can find the plugin and how to use it [here](https://www.npmjs.com/package/cordova-plugin-queries-schemes). In general, after installation, you can change plugin.xml file under the plugin subfolder within the plugins directory of your project to add the required schemas. Here again though, you have to edit an additional file and should take care not to overwrite it when making changes to your project. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +### Use Custom Config plugin +The Custom Config plugin ([here](https://github.com/dpa99c/cordova-custom-config)) allows you to add configuration to your platforms "native" configuration files (e.g. .plist or AndroidManifest.xml) through the project's main config.xml file. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +To address query schema issue, after installaing the plugin you can edit the iOS platform section of your config.xml (in the project main folder) to include the required entries: + +```xml +<?xml version='1.0' encoding='utf-8'?> +<widget id="your.app.id" + version="0.9.1" + xmlns="http://www.w3.org/ns/widgets" + xmlns:cdv="http://cordova.apache.org/ns/1.0"> + + <!-- a bunch of elements like name, description etc --> + + <platform name="ios"> + + <!-- add this entry --> + <config-file platform="ios" target="*-Info.plist" parent="LSApplicationQueriesSchemes"> + <array> + <string>whatsapp</string> + <!-- add more query scheme strings --> + </array> + </config-file> + </platform> +</widget> +``` -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The advantage with this method is that editing is done in the config.xml file which will most often be in your source control anyway and hence, changes to it will be reserved. + +## 5. Credits ## + +This plugin was enhanced for Plugman / PhoneGap Build by [Eddy Verbruggen](http://www.x-services.nl). +The Android and Windows Phone code was entirely created by the author. +The first iteration of the iOS code was inspired by [Cameron Lerch](https://github.com/bfcam/phonegap-ios-social-plugin). diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/package.json b/StoneIsland/plugins/cordova-plugin-x-socialsharing/package.json index 66bc9646..62e6a1c0 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/package.json +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-x-socialsharing", - "version": "5.0.7", + "version": "5.1.3", "description": "Share text, images (and other files), or a link via the native sharing widget of your device. Android is fully supported, as well as iOS 6 and up. WP8 has somewhat limited support.", "cordova": { "id": "cordova-plugin-x-socialsharing", @@ -29,7 +29,7 @@ "ecosystem:cordova", "cordova-ios", "cordova-android", - "cordova-wp8" + "cordova-windows" ], "engines": [ { diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/plugin.xml b/StoneIsland/plugins/cordova-plugin-x-socialsharing/plugin.xml index ba7183cb..0a367427 100755 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/plugin.xml @@ -2,7 +2,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-x-socialsharing" - version="5.0.7"> + version="5.1.3"> <name>SocialSharing</name> @@ -39,6 +39,8 @@ </feature> </config-file> + <header-file src="src/ios/NSString+URLEncoding.h"/> + <source-file src="src/ios/NSString+URLEncoding.m"/> <header-file src="src/ios/SocialSharing.h"/> <source-file src="src/ios/SocialSharing.m"/> @@ -71,7 +73,7 @@ </config-file> <source-file src="src/wp8/SocialSharing.cs" /> - <framework src="src/wp8/SocialSharingSDK/Newtonsoft.Json.dll" custom="true" /> + <framework src="src/wp8/Newtonsoft.Json.dll" custom="true"/> </platform> <!-- windows --> @@ -79,7 +81,6 @@ <js-module src="src/windows/SocialSharingProxy.js" name="SocialSharingProxy"> <merges target="" /> </js-module> - <source-file src="" /> </platform> </plugin> diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-android-share.png b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-android-share.png Binary files differindex f3ab135f..f3ab135f 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-android-share.png +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-android-share.png diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios6-share.png b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios6-share.png Binary files differindex 63b0b4c5..63b0b4c5 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios6-share.png +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios6-share.png diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-ipad-share.png b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-ipad-share.png Binary files differindex 640c94f8..640c94f8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-ipad-share.png +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-ipad-share.png diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-share.png b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-share.png Binary files differindex 7545d10d..7545d10d 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-share.png +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-ios7-share.png diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-wp8-share.jpg b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-wp8-share.jpg Binary files differindex 0ced2eb5..0ced2eb5 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-wp8-share.jpg +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshot-wp8-share.jpg diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshots-ios7-shareconfig.png b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshots-ios7-shareconfig.png Binary files differindex 3afe5fef..3afe5fef 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshots-ios7-shareconfig.png +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/screenshots/screenshots-ios7-shareconfig.png diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/android/nl/xservices/plugins/SocialSharing.java b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/android/nl/xservices/plugins/SocialSharing.java index f1168f89..8de31da8 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/android/nl/xservices/plugins/SocialSharing.java +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/android/nl/xservices/plugins/SocialSharing.java @@ -26,7 +26,9 @@ import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.regex.Matcher; @@ -36,6 +38,7 @@ public class SocialSharing extends CordovaPlugin { private static final String ACTION_AVAILABLE_EVENT = "available"; private static final String ACTION_SHARE_EVENT = "share"; + private static final String ACTION_SHARE_WITH_OPTIONS_EVENT = "shareWithOptions"; private static final String ACTION_CAN_SHARE_VIA = "canShareVia"; private static final String ACTION_CAN_SHARE_VIA_EMAIL = "canShareViaEmail"; private static final String ACTION_SHARE_VIA = "shareVia"; @@ -47,7 +50,10 @@ public class SocialSharing extends CordovaPlugin { private static final String ACTION_SHARE_VIA_SMS_EVENT = "shareViaSMS"; private static final String ACTION_SHARE_VIA_EMAIL_EVENT = "shareViaEmail"; - private static final int ACTIVITY_CODE_SENDVIAEMAIL = 2; + private static final int ACTIVITY_CODE_SEND__BOOLRESULT = 1; + private static final int ACTIVITY_CODE_SEND__OBJECT = 2; + private static final int ACTIVITY_CODE_SENDVIAEMAIL = 3; + private static final int ACTIVITY_CODE_SENDVIAWHATSAPP = 4; private CallbackContext _callbackContext; @@ -55,6 +61,7 @@ public class SocialSharing extends CordovaPlugin { private abstract class SocialSharingRunnable implements Runnable { public CallbackContext callbackContext; + SocialSharingRunnable(CallbackContext cb) { this.callbackContext = cb; } @@ -68,23 +75,29 @@ public class SocialSharing extends CordovaPlugin { callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK)); return true; } else if (ACTION_SHARE_EVENT.equals(action)) { - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), null, false); + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), null, null, false, true); + } else if (ACTION_SHARE_WITH_OPTIONS_EVENT.equals(action)) { + return shareWithOptions(callbackContext, args.getJSONObject(0)); } else if (ACTION_SHARE_VIA_TWITTER_EVENT.equals(action)) { - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "twitter", false); + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "twitter", null, false, true); } else if (ACTION_SHARE_VIA_FACEBOOK_EVENT.equals(action)) { - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "com.facebook.katana", false); + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "com.facebook.katana", null, false, true); } else if (ACTION_SHARE_VIA_FACEBOOK_WITH_PASTEMESSAGEHINT.equals(action)) { this.pasteMessage = args.getString(4); - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "com.facebook.katana", false); + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "com.facebook.katana", null, false, true); } else if (ACTION_SHARE_VIA_WHATSAPP_EVENT.equals(action)) { - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "whatsapp", false); + if (notEmpty(args.getString(4))) { + return shareViaWhatsAppDirectly(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), args.getString(4)); + } else { + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "whatsapp", null, false, true); + } } else if (ACTION_SHARE_VIA_INSTAGRAM_EVENT.equals(action)) { if (notEmpty(args.getString(0))) { copyHintToClipboard(args.getString(0), "Instagram paste message"); } - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "instagram", false); + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), "instagram", null, false, true); } else if (ACTION_CAN_SHARE_VIA.equals(action)) { - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), args.getString(4), true); + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), args.getString(4), null, true, true); } else if (ACTION_CAN_SHARE_VIA_EMAIL.equals(action)) { if (isEmailAvailable()) { callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK)); @@ -94,7 +107,7 @@ public class SocialSharing extends CordovaPlugin { return false; } } else if (ACTION_SHARE_VIA.equals(action)) { - return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), args.getString(4), false); + return doSendIntent(callbackContext, args.getString(0), args.getString(1), args.getJSONArray(2), args.getString(3), args.getString(4), null, false, true); } else if (ACTION_SHARE_VIA_SMS_EVENT.equals(action)) { return invokeSMSIntent(callbackContext, args.getJSONObject(0), args.getString(1)); } else if (ACTION_SHARE_VIA_EMAIL_EVENT.equals(action)) { @@ -158,8 +171,17 @@ public class SocialSharing extends CordovaPlugin { callbackContext.error(e.getMessage()); } + // this was added to start the intent in a new window as suggested in #300 to prevent crashes upon return + draft.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + draft.setType("application/octet-stream"); - cordova.startActivityForResult(plugin, Intent.createChooser(draft, "Choose Email App"), ACTIVITY_CODE_SENDVIAEMAIL); + + // as an experiment for #300 we're explicitly running it on the ui thread here + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + cordova.startActivityForResult(plugin, Intent.createChooser(draft, "Choose Email App"), ACTIVITY_CODE_SENDVIAEMAIL); + } + }); } }); @@ -178,7 +200,30 @@ public class SocialSharing extends CordovaPlugin { } } - private boolean doSendIntent(final CallbackContext callbackContext, final String msg, final String subject, final JSONArray files, final String url, final String appPackageName, final boolean peek) { + private boolean shareWithOptions(CallbackContext callbackContext, JSONObject jsonObject) { + return doSendIntent( + callbackContext, + jsonObject.optString("message", null), + jsonObject.optString("subject", null), + jsonObject.optJSONArray("files") == null ? new JSONArray() : jsonObject.optJSONArray("files"), + jsonObject.optString("url", null), + null, + jsonObject.optString("chooserTitle", null), + false, + false + ); + } + + private boolean doSendIntent( + final CallbackContext callbackContext, + final String msg, + final String subject, + final JSONArray files, + final String url, + final String appPackageName, + final String chooserTitle, + final boolean peek, + final boolean boolResult) { final CordovaInterface mycordova = cordova; final CordovaPlugin plugin = this; @@ -222,6 +267,7 @@ public class SocialSharing extends CordovaPlugin { if (notEmpty(subject)) { sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject); } + // add the URL to the message, as there seems to be no separate field if (notEmpty(url)) { if (notEmpty(message)) { @@ -238,6 +284,9 @@ public class SocialSharing extends CordovaPlugin { } } + // this was added to start the intent in a new window as suggested in #300 to prevent crashes upon return + sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (appPackageName != null) { String packageName = appPackageName; String passedActivityName = null; @@ -254,7 +303,13 @@ public class SocialSharing extends CordovaPlugin { sendIntent.addCategory(Intent.CATEGORY_LAUNCHER); sendIntent.setComponent(new ComponentName(activity.applicationInfo.packageName, passedActivityName != null ? passedActivityName : activity.name)); - mycordova.startActivityForResult(plugin, sendIntent, 0); + + // as an experiment for #300 we're explicitly running it on the ui thread here + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + mycordova.startActivityForResult(plugin, sendIntent, 0); + } + }); if (pasteMessage != null) { // add a little delay because target app (facebook only atm) needs to be started first @@ -275,7 +330,13 @@ public class SocialSharing extends CordovaPlugin { if (peek) { callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK)); } else { - mycordova.startActivityForResult(plugin, Intent.createChooser(sendIntent, null), 1); + // experimenting a bit + // as an experiment for #300 we're explicitly running it on the ui thread here + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + mycordova.startActivityForResult(plugin, Intent.createChooser(sendIntent, chooserTitle), boolResult ? ACTIVITY_CODE_SEND__BOOLRESULT : ACTIVITY_CODE_SEND__OBJECT); + } + }); } } } @@ -306,7 +367,12 @@ public class SocialSharing extends CordovaPlugin { private Uri getFileUriAndSetType(Intent sendIntent, String dir, String image, String subject, int nthFile) throws IOException { // we're assuming an image, but this can be any filetype you like String localImage = image; - sendIntent.setType("image/*"); + if (image.endsWith("mp4") || image.endsWith("mov") || image.endsWith("3gp")){ + sendIntent.setType("video/*"); + } else { + sendIntent.setType("image/*"); + } + if (image.startsWith("http") || image.startsWith("www/")) { String filename = getFileName(image); localImage = "file://" + dir + "/" + filename; @@ -319,6 +385,10 @@ public class SocialSharing extends CordovaPlugin { Matcher matcher = dispositionPattern.matcher(disposition); if (matcher.find()) { filename = matcher.group(1).replaceAll("[^a-zA-Z0-9._-]", ""); + if (filename.length() == 0) { + // in this case we can't determine a filetype so some targets (gmail) may not render it correctly + filename = "file"; + } localImage = "file://" + dir + "/" + filename; } } @@ -365,10 +435,160 @@ public class SocialSharing extends CordovaPlugin { localImage = "file://" + dir + "/" + fileName; } else if (!image.startsWith("file://")) { throw new IllegalArgumentException("URL_NOT_SUPPORTED"); + } else { + //get file MIME type + String type = getMIMEType(image); + //set intent data and Type + sendIntent.setType(type); } return Uri.parse(localImage); } + private String getMIMEType(String fileName) { + String type = "*/*"; + int dotIndex = fileName.lastIndexOf("."); + if (dotIndex == -1) { + return type; + } + final String end = fileName.substring(dotIndex+1, fileName.length()).toLowerCase(); + String fromMap = MIME_Map.get(end); + return fromMap == null ? type : fromMap; + } + + private static final Map<String, String> MIME_Map = new HashMap<String, String>(); + static { + MIME_Map.put("3gp", "video/3gpp"); + MIME_Map.put("apk", "application/vnd.android.package-archive"); + MIME_Map.put("asf", "video/x-ms-asf"); + MIME_Map.put("avi", "video/x-msvideo"); + MIME_Map.put("bin", "application/octet-stream"); + MIME_Map.put("bmp", "image/bmp"); + MIME_Map.put("c", "text/plain"); + MIME_Map.put("class", "application/octet-stream"); + MIME_Map.put("conf", "text/plain"); + MIME_Map.put("cpp", "text/plain"); + MIME_Map.put("doc", "application/msword"); + MIME_Map.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + MIME_Map.put("xls", "application/vnd.ms-excel"); + MIME_Map.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + MIME_Map.put("exe", "application/octet-stream"); + MIME_Map.put("gif", "image/gif"); + MIME_Map.put("gtar", "application/x-gtar"); + MIME_Map.put("gz", "application/x-gzip"); + MIME_Map.put("h", "text/plain"); + MIME_Map.put("htm", "text/html"); + MIME_Map.put("html", "text/html"); + MIME_Map.put("jar", "application/java-archive"); + MIME_Map.put("java", "text/plain"); + MIME_Map.put("jpeg", "image/jpeg"); + MIME_Map.put("jpg", "image/*"); + MIME_Map.put("js", "application/x-javascript"); + MIME_Map.put("log", "text/plain"); + MIME_Map.put("m3u", "audio/x-mpegurl"); + MIME_Map.put("m4a", "audio/mp4a-latm"); + MIME_Map.put("m4b", "audio/mp4a-latm"); + MIME_Map.put("m4p", "audio/mp4a-latm"); + MIME_Map.put("m4u", "video/vnd.mpegurl"); + MIME_Map.put("m4v", "video/x-m4v"); + MIME_Map.put("mov", "video/quicktime"); + MIME_Map.put("mp2", "audio/x-mpeg"); + MIME_Map.put("mp3", "audio/x-mpeg"); + MIME_Map.put("mp4", "video/mp4"); + MIME_Map.put("mpc", "application/vnd.mpohun.certificate"); + MIME_Map.put("mpe", "video/mpeg"); + MIME_Map.put("mpeg", "video/mpeg"); + MIME_Map.put("mpg", "video/mpeg"); + MIME_Map.put("mpg4", "video/mp4"); + MIME_Map.put("mpga", "audio/mpeg"); + MIME_Map.put("msg", "application/vnd.ms-outlook"); + MIME_Map.put("ogg", "audio/ogg"); + MIME_Map.put("pdf", "application/pdf"); + MIME_Map.put("png", "image/png"); + MIME_Map.put("pps", "application/vnd.ms-powerpoint"); + MIME_Map.put("ppt", "application/vnd.ms-powerpoint"); + MIME_Map.put("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); + MIME_Map.put("prop", "text/plain"); + MIME_Map.put("rc", "text/plain"); + MIME_Map.put("rmvb", "audio/x-pn-realaudio"); + MIME_Map.put("rtf", "application/rtf"); + MIME_Map.put("sh", "text/plain"); + MIME_Map.put("tar", "application/x-tar"); + MIME_Map.put("tgz", "application/x-compressed"); + MIME_Map.put("txt", "text/plain"); + MIME_Map.put("wav", "audio/x-wav"); + MIME_Map.put("wma", "audio/x-ms-wma"); + MIME_Map.put("wmv", "audio/x-ms-wmv"); + MIME_Map.put("wps", "application/vnd.ms-works"); + MIME_Map.put("xml", "text/plain"); + MIME_Map.put("z", "application/x-compress"); + MIME_Map.put("zip", "application/x-zip-compressed"); + MIME_Map.put("", "*/*"); + } + + private boolean shareViaWhatsAppDirectly(final CallbackContext callbackContext, String message, final String subject, final JSONArray files, final String url, final String number) { + // add the URL to the message, as there seems to be no separate field + if (notEmpty(url)) { + if (notEmpty(message)) { + message += " " + url; + } else { + message = url; + } + } + final String shareMessage = message; + final SocialSharing plugin = this; + cordova.getThreadPool().execute(new SocialSharingRunnable(callbackContext) { + public void run() { + final Intent intent = new Intent(Intent.ACTION_SENDTO); + intent.setData(Uri.parse("smsto:" + number)); + + intent.putExtra("sms_body", shareMessage); + intent.putExtra("sms_subject", subject); + intent.setPackage("com.whatsapp"); + + try { + if (files.length() > 0 && !"".equals(files.getString(0))) { + final boolean hasMultipleAttachments = files.length() > 1; + final String dir = getDownloadDir(); + if (dir != null) { + ArrayList<Uri> fileUris = new ArrayList<Uri>(); + Uri fileUri = null; + for (int i = 0; i < files.length(); i++) { + fileUri = getFileUriAndSetType(intent, dir, files.getString(i), subject, i); + if (fileUri != null) { + fileUris.add(fileUri); + } + } + if (!fileUris.isEmpty()) { + if (hasMultipleAttachments) { + intent.putExtra(Intent.EXTRA_STREAM, fileUris); + } else { + intent.putExtra(Intent.EXTRA_STREAM, fileUri); + } + } + } + } + } catch (Exception e) { + callbackContext.error(e.getMessage()); + } + try { + // this was added to start the intent in a new window as suggested in #300 to prevent crashes upon return + // update: didn't help (doesn't seem to hurt either though) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + // as an experiment for #300 we're explicitly running it on the ui thread here + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + cordova.startActivityForResult(plugin, intent, ACTIVITY_CODE_SENDVIAWHATSAPP); + } + }); + } catch (Exception e) { + callbackContext.error(e.getMessage()); + } + } + }); + return true; + } + private boolean invokeSMSIntent(final CallbackContext callbackContext, JSONObject options, String p_phonenumbers) { final String message = options.optString("message"); // TODO test this on a real SMS enabled device before releasing it @@ -404,6 +624,9 @@ public class SocialSharing extends CordovaPlugin { intent.putExtra(Intent.EXTRA_STREAM, fileUri); } } + // this was added to start the intent in a new window as suggested in #300 to prevent crashes upon return + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + cordova.startActivityForResult(plugin, intent, 0); } catch (Exception e) { callbackContext.error(e.getMessage()); @@ -451,10 +674,26 @@ public class SocialSharing extends CordovaPlugin { public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (_callbackContext != null) { - if (ACTIVITY_CODE_SENDVIAEMAIL == requestCode) { - _callbackContext.success(); - } else { - _callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, resultCode == Activity.RESULT_OK)); + switch (requestCode) { + case ACTIVITY_CODE_SEND__BOOLRESULT: + _callbackContext.sendPluginResult(new PluginResult( + PluginResult.Status.OK, + resultCode == Activity.RESULT_OK)); + break; + case ACTIVITY_CODE_SEND__OBJECT: + JSONObject json = new JSONObject(); + try { + json.put("completed", resultCode == Activity.RESULT_OK); + json.put("app", ""); // we need a completely different approach if we want to support this on Android. Idea: https://clickclickclack.wordpress.com/2012/01/03/intercepting-androids-action_send-intents/ + _callbackContext.sendPluginResult(new PluginResult( + PluginResult.Status.OK, + json)); + } catch (JSONException e) { + _callbackContext.error(e.getMessage()); + } + break; + default: + _callbackContext.success(); } } } @@ -471,13 +710,16 @@ public class SocialSharing extends CordovaPlugin { } private static String getFileName(String url) { + if (url.endsWith("/")) { + url = url.substring(0, url.length()-1); + } final String pattern = ".*/([^?#]+)?"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(url); if (m.find()) { return m.group(1); } else { - return null; + return "file"; } } diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.h b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.h new file mode 100644 index 00000000..d7da331d --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.h @@ -0,0 +1,5 @@ +#import <Foundation/Foundation.h> + +@interface NSString (URLEncoding) +@property (readonly) NSString *URLEncodedString; +@end diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.m b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.m new file mode 100644 index 00000000..b737626c --- /dev/null +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/NSString+URLEncoding.m @@ -0,0 +1,30 @@ +#import "NSString+URLEncoding.h" + +@implementation NSString (URLEncoding) +- (NSString*)URLEncodedString +{ + NSString* result = (NSString *)CFBridgingRelease( + CFURLCreateStringByAddingPercentEscapes( + kCFAllocatorDefault, + (CFStringRef)self, + CFSTR("#%"), // don't escape these + NULL, // allow escaping these + kCFStringEncodingUTF8 + ) + ); + + // we may have a URL with more than one '#' now - which iOS doesn't allow, so escape all but the first one + NSArray *parts = [result componentsSeparatedByString:@"#"]; + NSString *finalResult = parts[0]; + for (int i=1; i<parts.count; i++) { + NSString *part = [parts objectAtIndex:i]; + if (i==1) { + finalResult = [finalResult stringByAppendingString:@"#"]; + } else { + finalResult = [finalResult stringByAppendingString:@"%23"]; + } + finalResult = [finalResult stringByAppendingString:part]; + } + return finalResult; +} +@end
\ No newline at end of file diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.h b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.h index b51474d3..0c731450 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.h +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.h @@ -4,13 +4,14 @@ @interface SocialSharing : CDVPlugin <UIPopoverControllerDelegate, MFMailComposeViewControllerDelegate, UIDocumentInteractionControllerDelegate> @property (nonatomic, strong) MFMailComposeViewController *globalMailComposer; -@property (retain) UIDocumentInteractionController * documentInteractionController; +@property (nonatomic, strong) UIDocumentInteractionController * documentInteractionController; @property (retain) NSString * tempStoredFile; @property (retain) CDVInvokedUrlCommand * command; - (void)available:(CDVInvokedUrlCommand*)command; - (void)setIPadPopupCoordinates:(CDVInvokedUrlCommand*)command; - (void)share:(CDVInvokedUrlCommand*)command; +- (void)shareWithOptions:(CDVInvokedUrlCommand*)command; - (void)canShareVia:(CDVInvokedUrlCommand*)command; - (void)canShareViaEmail:(CDVInvokedUrlCommand*)command; - (void)shareVia:(CDVInvokedUrlCommand*)command; diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.m b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.m index cd0913a4..014925bd 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.m +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/ios/SocialSharing.m @@ -1,4 +1,5 @@ #import "SocialSharing.h" +#import "NSString+URLEncoding.h" #import <Cordova/CDV.h> #import <Social/Social.h> #import <Foundation/NSException.h> @@ -6,6 +7,11 @@ #import <MessageUI/MFMailComposeViewController.h> #import <MobileCoreServices/MobileCoreServices.h> +static NSString *const kShareOptionMessage = @"message"; +static NSString *const kShareOptionSubject = @"subject"; +static NSString *const kShareOptionFiles = @"files"; +static NSString *const kShareOptionUrl = @"url"; + @implementation SocialSharing { UIPopoverController *_popover; NSString *_popupCoordinates; @@ -51,23 +57,46 @@ } - (void)share:(CDVInvokedUrlCommand*)command { + [self shareInternal:command + withOptions:@{ + kShareOptionMessage: [command.arguments objectAtIndex:0], + kShareOptionSubject: [command.arguments objectAtIndex:1], + kShareOptionFiles: [command.arguments objectAtIndex:2], + kShareOptionUrl: [command.arguments objectAtIndex:3] + } + isBooleanResponse:YES +]; +} + +- (void)shareWithOptions:(CDVInvokedUrlCommand*)command { + NSDictionary* options = [command.arguments objectAtIndex:0]; + [self shareInternal:command + withOptions:options + isBooleanResponse:NO + ]; +} + +- (void)shareInternal:(CDVInvokedUrlCommand*)command withOptions:(NSDictionary*)options isBooleanResponse:(BOOL)boolResponse { [self.commandDelegate runInBackground:^{ //avoid main thread block especially if sharing big files from url if (!NSClassFromString(@"UIActivityViewController")) { CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"not available"]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; return; } - - NSString *message = [command.arguments objectAtIndex:0]; - NSString *subject = [command.arguments objectAtIndex:1]; - NSArray *filenames = [command.arguments objectAtIndex:2]; - NSString *urlString = [command.arguments objectAtIndex:3]; - + + NSString *message = options[kShareOptionMessage]; + NSString *subject = options[kShareOptionSubject]; + NSArray *filenames = options[kShareOptionFiles]; + NSString *urlString = options[kShareOptionUrl]; + NSMutableArray *activityItems = [[NSMutableArray alloc] init]; + + if (message != (id)[NSNull null] && message != nil) { [activityItems addObject:message]; - - NSMutableArray *files = [[NSMutableArray alloc] init]; - if (filenames != (id)[NSNull null] && filenames.count > 0) { + } + + if (filenames != (id)[NSNull null] && filenames != nil && filenames.count > 0) { + NSMutableArray *files = [[NSMutableArray alloc] init]; for (NSString* filename in filenames) { NSObject *file = [self getImage:filename]; if (file == nil) { @@ -79,31 +108,47 @@ } [activityItems addObjectsFromArray:files]; } - - if (urlString != (id)[NSNull null]) { - [activityItems addObject:[NSURL URLWithString:urlString]]; + + if (urlString != (id)[NSNull null] && urlString != nil) { + [activityItems addObject:[NSURL URLWithString:[urlString URLEncodedString]]]; } - + UIActivity *activity = [[UIActivity alloc] init]; NSArray *applicationActivities = [[NSArray alloc] initWithObjects:activity, nil]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]; - if (subject != (id)[NSNull null]) { + if (subject != (id)[NSNull null] && subject != nil) { [activityVC setValue:subject forKey:@"subject"]; } - - // TODO deprecated in iOS 8.0, change this some day - [activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) { - [self cleanupStoredFiles]; - NSLog(@"SocialSharing app selected: %@", activityType); - CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:completed]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; - + + if ([activityVC respondsToSelector:(@selector(setCompletionWithItemsHandler:))]) { + [activityVC setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray * returnedItems, NSError * activityError) { + [self cleanupStoredFiles]; + if (boolResponse) { + [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:completed] + callbackId:command.callbackId]; + } else { + NSDictionary * result = @{@"completed":@(completed), @"app":activityType == nil ? @"" : activityType}; + [self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:result] + callbackId:command.callbackId]; + } + }]; + } else { + // let's suppress this warning otherwise folks will start opening issues while it's not relevant +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + [activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) { + [self cleanupStoredFiles]; + NSDictionary * result = @{@"completed":@(completed), @"app":activityType}; + CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:result]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; +#pragma GCC diagnostic warning "-Wdeprecated-declarations" + } + NSArray * socialSharingExcludeActivities = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"SocialSharingExcludeActivities"]; if (socialSharingExcludeActivities!=nil && [socialSharingExcludeActivities count] > 0) { activityVC.excludedActivityTypes = socialSharingExcludeActivities; } - + dispatch_async(dispatch_get_main_queue(), ^(void){ // iPad on iOS >= 8 needs a different approach if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) { @@ -230,27 +275,27 @@ - (void)shareViaInternal:(CDVInvokedUrlCommand*)command type:(NSString *) type { - + NSString *message = [command.arguments objectAtIndex:0]; // subject is not supported by the SLComposeViewController NSArray *filenames = [command.arguments objectAtIndex:2]; NSString *urlString = [command.arguments objectAtIndex:3]; - + // boldly invoke the target app, because the phone will display a nice message asking to configure the app SLComposeViewController *composeViewController = [SLComposeViewController composeViewControllerForServiceType:type]; if (message != (id)[NSNull null]) { [composeViewController setInitialText:message]; } - + for (NSString* filename in filenames) { UIImage* image = [self getImage:filename]; if (image != nil) { [composeViewController addImage:image]; } } - + if (urlString != (id)[NSNull null]) { - [composeViewController addURL:[NSURL URLWithString:urlString]]; + [composeViewController addURL:[NSURL URLWithString:[urlString URLEncodedString]]]; } [composeViewController setCompletionHandler:^(SLComposeViewControllerResult result) { @@ -272,7 +317,7 @@ - (void)shareViaEmail:(CDVInvokedUrlCommand*)command { if ([self isEmailAvailable]) { - + if (TARGET_IPHONE_SIMULATOR && IsAtLeastiOSVersion(@"8.0")) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"SocialSharing plugin" message:@"Sharing via email is not supported on the iOS 8 simulator." @@ -282,38 +327,40 @@ [alert show]; return; } - + + [self cycleTheGlobalMailComposer]; + self.globalMailComposer.mailComposeDelegate = self; - + if ([command.arguments objectAtIndex:0] != (id)[NSNull null]) { NSString *message = [command.arguments objectAtIndex:0]; BOOL isHTML = [message rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch].location != NSNotFound; [self.globalMailComposer setMessageBody:message isHTML:isHTML]; } - + if ([command.arguments objectAtIndex:1] != (id)[NSNull null]) { [self.globalMailComposer setSubject: [command.arguments objectAtIndex:1]]; } - + if ([command.arguments objectAtIndex:2] != (id)[NSNull null]) { [self.globalMailComposer setToRecipients:[command.arguments objectAtIndex:2]]; } - + if ([command.arguments objectAtIndex:3] != (id)[NSNull null]) { [self.globalMailComposer setCcRecipients:[command.arguments objectAtIndex:3]]; } - + if ([command.arguments objectAtIndex:4] != (id)[NSNull null]) { [self.globalMailComposer setBccRecipients:[command.arguments objectAtIndex:4]]; } - + if ([command.arguments objectAtIndex:5] != (id)[NSNull null]) { NSArray* attachments = [command.arguments objectAtIndex:5]; NSFileManager* fileManager = [NSFileManager defaultManager]; for (NSString* path in attachments) { NSURL *file = [self getFile:path]; NSData* data = [fileManager contentsAtPath:file.path]; - + NSString* fileName; NSString* mimeType; NSString* basename = [self getBasenameFromAttachmentPath:path]; @@ -331,14 +378,14 @@ [self.globalMailComposer addAttachmentData:data mimeType:mimeType fileName:fileName]; } } - + // remember the command, because we need it in the didFinishWithResult method _command = command; [self.commandDelegate runInBackground:^{ [[self getTopMostViewController] presentViewController:self.globalMailComposer animated:YES completion:nil]; }]; - + } else { CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"not available"]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; @@ -358,7 +405,7 @@ NSString* pathWithoutPrefix = [path stringByReplacingOccurrencesOfString:@"base64:" withString:@""]; return [pathWithoutPrefix substringToIndex:[pathWithoutPrefix rangeOfString:@"//"].location]; } - return path; + return [path componentsSeparatedByString: @"?"][0]; } - (NSString*) getMimeTypeFromFileExtension:(NSString*)extension { @@ -406,7 +453,7 @@ NSString *message = [options objectForKey:@"message"]; NSString *subject = [options objectForKey:@"subject"]; NSString *image = [options objectForKey:@"image"]; - + MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init]; picker.messageComposeDelegate = (id) self; if (message != (id)[NSNull null]) { @@ -424,7 +471,7 @@ } } } - + if (phonenumbers != (id)[NSNull null]) { [picker setRecipients:[phonenumbers componentsSeparatedByString:@","]]; } @@ -469,7 +516,7 @@ } - (void)shareViaInstagram:(CDVInvokedUrlCommand*)command { - + // on iOS9 canShareVia('instagram'..) will only work if instagram:// is whitelisted. // If it's not, this method will ask permission to the user on iOS9 for opening the app, // which is of course better than Instagram sharing not working at all because you forgot to whitelist it. @@ -492,7 +539,7 @@ image = [self getImage:filename]; break; } - + // NSData *imageObj = [NSData dataFromBase64String:objectAtIndex0]; NSString *tmpDir = NSTemporaryDirectory(); NSString *path = [tmpDir stringByAppendingPathComponent:@"instagram.igo"]; @@ -513,11 +560,15 @@ // remember the command for the delegate method _command = command; - [_documentInteractionController presentOpenInMenuFromRect:CGRectZero inView:self.webView animated:YES]; + + // test for #513 + dispatch_async(dispatch_get_main_queue(), ^(void){ + [_documentInteractionController presentOpenInMenuFromRect:CGRectZero inView:self.webView animated:YES]; + }); } - (void)shareViaWhatsApp:(CDVInvokedUrlCommand*)command { - + // on iOS9 canShareVia('whatsapp'..) will only work if whatsapp:// is whitelisted. // If it's not, this method will ask permission to the user on iOS9 for opening the app, // which is of course better than WhatsApp sharing not working at all because you forgot to whitelist it. @@ -534,6 +585,7 @@ // subject is not supported by the SLComposeViewController NSArray *filenames = [command.arguments objectAtIndex:2]; NSString *urlString = [command.arguments objectAtIndex:3]; + NSString *abid = [command.arguments objectAtIndex:4]; // only use the first image (for now.. maybe we can share in a loop?) UIImage* image = nil; @@ -561,14 +613,18 @@ if ([shareString isEqual: @""]) { shareString = urlString; } else { - shareString = [NSString stringWithFormat:@"%@ %@", shareString, urlString]; + shareString = [NSString stringWithFormat:@"%@ %@", shareString, [urlString URLEncodedString]]; } } NSString * encodedShareString = [shareString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // also encode the '=' character encodedShareString = [encodedShareString stringByReplacingOccurrencesOfString:@"=" withString:@"%3D"]; encodedShareString = [encodedShareString stringByReplacingOccurrencesOfString:@"&" withString:@"%26"]; - NSString * encodedShareStringForWhatsApp = [NSString stringWithFormat:@"whatsapp://send?text=%@", encodedShareString]; + NSString * abidString = @""; + if (abid != (id)[NSNull null]) { + abidString = [NSString stringWithFormat:@"abid=%@&", abid]; + } + NSString * encodedShareStringForWhatsApp = [NSString stringWithFormat:@"whatsapp://send?%@text=%@", abidString, encodedShareString]; NSURL *whatsappURL = [NSURL URLWithString:encodedShareStringForWhatsApp]; [[UIApplication sharedApplication] openURL: whatsappURL]; @@ -641,7 +697,8 @@ if ([fileName hasPrefix:@"http"]) { NSURL *url = [NSURL URLWithString:fileName]; NSData *fileData = [NSData dataWithContentsOfURL:url]; - file = [NSURL fileURLWithPath:[self storeInFile:(NSString*)[[fileName componentsSeparatedByString: @"/"] lastObject] fileData:fileData]]; + NSString *name = (NSString*)[[fileName componentsSeparatedByString: @"/"] lastObject]; + file = [NSURL fileURLWithPath:[self storeInFile:[name componentsSeparatedByString: @"?"][0] fileData:fileData]]; } else if ([fileName hasPrefix:@"www/"]) { NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; NSString *fullPath = [NSString stringWithFormat:@"%@/%@", bundlePath, fileName]; diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/windows/SocialSharingProxy.js b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/windows/SocialSharingProxy.js index 99e0af15..ff257d52 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/windows/SocialSharingProxy.js +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/windows/SocialSharingProxy.js @@ -10,6 +10,36 @@ module.exports = { var fileOrFileArray = args[2]; //Web link var url = args[3]; + + var folder = Windows.Storage.ApplicationData.current.temporaryFolder; + + var getExtension = function (strBase64) { + return strBase64.substring(strBase64.indexOf("/") + 1, strBase64.indexOf(";base64")); + }; + + var replaceAll = function (str, find, replace) { + return str.replace(new RegExp(find, 'g'), replace); + }; + + var sanitizeFilename = function (name) { + return replaceAll(name, "[:\\\\/*?|<> ]", "_"); + }; + + var getFileName = function (position, fileExtension) { + var fileName = (subject ? sanitizeFilename(subject) : "file") + (position == 0 ? "" : "_" + position) + "." + fileExtension; + return fileName; + }; + + var createTemporalFile = function (fileName, buffer) { + + var filePath = ""; + return folder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.replaceExisting).then(function (file) { + filePath = file.path; + return Windows.Storage.FileIO.writeBufferAsync(file, buffer); + }).then(function(){ + return Windows.Storage.StorageFile.getFileFromPathAsync(filePath); + }); + }; var doShare = function (e) { e.request.data.properties.title = subject?subject: "Sharing"; @@ -19,25 +49,49 @@ module.exports = { var deferral = e.request.getDeferral(); var storageItems = []; var filesCount = fileOrFileArray.length; + + var completeFile = function () { + if (!--filesCount) { + storageItems.length && e.request.data.setStorageItems(storageItems); + deferral.complete(); + } + }; + for (var i = 0; i < fileOrFileArray.length; i++) { - Windows.Storage.StorageFile.getFileFromPathAsync(fileOrFileArray[i]).done( - function (file) { - storageItems.push(file); - if (!--filesCount) { - e.request.data.setStorageItems(storageItems); - deferral.complete(); - } - }, - function() { - if (!--filesCount) { - e.request.data.setStorageItems(storageItems); - deferral.complete(); + + var file = fileOrFileArray[i]; + if (file.indexOf("data:") >= 0) { + var fileName = getFileName(i, getExtension(file)); + var buffer = Windows.Security.Cryptography.CryptographicBuffer.decodeFromBase64String(file.split(',')[1]); + if (buffer) { + createTemporalFile(fileName, buffer).done( + function (file) { + storageItems.push(file); + completeFile(); + }, + function () { + completeFile(); + } + ); + } + else { + completeFile(); + } + } + else { + Windows.Storage.StorageFile.getFileFromPathAsync(file).done( + function (file) { + storageItems.push(file); + completeFile(); + }, + function () { + completeFile(); } - } - ); + ); + } } } - } + }; var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView(); @@ -96,7 +150,7 @@ module.exports = { ); } } - } + }; var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView(); diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/wp8/SocialSharing.cs b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/wp8/SocialSharing.cs index 1a165127..9d63b2f4 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/wp8/SocialSharing.cs +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/src/wp8/SocialSharing.cs @@ -26,7 +26,7 @@ namespace Cordova.Extension.Commands var files = JsonHelper.Deserialize<string[]>(options[2]); var link = options[3]; - if (!"null".Equals(link)) + if (link != null && !"null".Equals(link)) { ShareLinkTask shareLinkTask = new ShareLinkTask(); shareLinkTask.Title = title; @@ -100,4 +100,4 @@ namespace Cordova.Extension.Commands public string message { get; set; } } -}
\ No newline at end of file +} diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/plugin.xml b/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/plugin.xml index 1ccb2217..1ccb2217 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/plugin.xml +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/plugin.xml diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/test.js b/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/test.js index 630899db..ad1a8229 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/test.js +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/tests/test.js @@ -1,4 +1,4 @@ -/** +/** * Jasmine Based test suites * * Several of SocialSharing APIs cannot be automatically tested, because diff --git a/StoneIsland/plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js b/StoneIsland/plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js index 6ccd567b..3fc9bb92 100755..100644 --- a/StoneIsland/plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js +++ b/StoneIsland/plugins/cordova-plugin-x-socialsharing/www/SocialSharing.js @@ -1,6 +1,4 @@ -var cordova = require('cordova'); - -function SocialSharing() { +function SocialSharing() { } // Override this method (after deviceready) to set the location where you want the iPad popup arrow to appear. @@ -25,6 +23,11 @@ SocialSharing.prototype.available = function (callback) { }, null, "SocialSharing", "available", []); }; +// this is the recommended way to share as it is the most feature-rich with respect to what you pass in and get back +SocialSharing.prototype.shareWithOptions = function (options, successCallback, errorCallback) { + cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareWithOptions"), "SocialSharing", "shareWithOptions", [options]); +}; + SocialSharing.prototype.share = function (message, subject, fileOrFileArray, url, successCallback, errorCallback) { cordova.exec(successCallback, this._getErrorCallback(errorCallback, "share"), "SocialSharing", "share", [message, subject, this._asArray(fileOrFileArray), url]); }; @@ -49,7 +52,11 @@ SocialSharing.prototype.shareViaFacebookWithPasteMessageHint = function (message }; SocialSharing.prototype.shareViaWhatsApp = function (message, fileOrFileArray, url, successCallback, errorCallback) { - cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaWhatsApp"), "SocialSharing", "shareViaWhatsApp", [message, null, this._asArray(fileOrFileArray), url]); + cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaWhatsApp"), "SocialSharing", "shareViaWhatsApp", [message, null, this._asArray(fileOrFileArray), url, null]); +}; + +SocialSharing.prototype.shareViaWhatsAppToReceiver = function (receiver, message, fileOrFileArray, url, successCallback, errorCallback) { + cordova.exec(successCallback, this._getErrorCallback(errorCallback, "shareViaWhatsAppToReceiver"), "SocialSharing", "shareViaWhatsApp", [message, null, this._asArray(fileOrFileArray), url, receiver]); }; SocialSharing.prototype.shareViaSMS = function (options, phonenumbers, successCallback, errorCallback) { @@ -112,4 +119,4 @@ SocialSharing.install = function () { return window.plugins.socialsharing; }; -cordova.addConstructor(SocialSharing.install); +cordova.addConstructor(SocialSharing.install);
\ No newline at end of file diff --git a/StoneIsland/plugins/fetch.json b/StoneIsland/plugins/fetch.json index cb0dbc6f..38f9ef54 100755 --- a/StoneIsland/plugins/fetch.json +++ b/StoneIsland/plugins/fetch.json @@ -1,40 +1,54 @@ { - "cordova-plugin-geolocation": { + "com.parse.cordova.core.pushplugin": { + "source": { + "type": "git", + "url": "https://github.com/grrrian/phonegap-parse-plugin", + "subdir": "." + }, + "is_top_level": true, + "variables": { + "APP_ID": "GS82ZxpN8Mecpc53rsyu6aLLGK0W4CKi42J25DLB", + "CLIENT_KEY": "hQRtQfsgimYnX5PMivtcdXCG9eZhESeyTr0Rd8Sv" + } + }, + "cordova-plugin-inappbrowser": { "source": { "type": "registry", - "id": "cordova-plugin-geolocation" + "id": "cordova-plugin-inappbrowser@1.5.0" }, "is_top_level": true, "variables": {} }, - "cordova-plugin-splashscreen": { + "cordova-plugin-x-socialsharing": { "source": { "type": "registry", - "id": "cordova-plugin-splashscreen" + "id": "cordova-plugin-x-socialsharing" }, "is_top_level": true, "variables": {} }, - "cordova-plugin-dialogs": { + "cordova-plugin-customurlscheme": { "source": { "type": "registry", - "id": "cordova-plugin-dialogs" + "id": "cordova-plugin-customurlscheme" }, "is_top_level": true, - "variables": {} + "variables": { + "URL_SCHEME": "stoneisland" + } }, - "cordova-plugin-network-information": { + "phonegap-plugin-push": { "source": { "type": "registry", - "id": "cordova-plugin-network-information" + "id": "phonegap-plugin-push@1.8.4" }, "is_top_level": true, "variables": {} }, - "cordova-plugin-device": { + "cordova-plugin-whitelist": { "source": { "type": "registry", - "id": "cordova-plugin-device" + "id": "cordova-plugin-whitelist@1" }, "is_top_level": true, "variables": {} @@ -47,66 +61,60 @@ "is_top_level": true, "variables": {} }, - "com.ionic.keyboard": { + "cordova-plugin-device": { "source": { "type": "registry", - "id": "com.ionic.keyboard" + "id": "cordova-plugin-device" }, "is_top_level": true, "variables": {} }, - "cordova-plugin-whitelist": { + "cordova-plugin-network-information": { "source": { "type": "registry", - "id": "cordova-plugin-whitelist@1" + "id": "cordova-plugin-network-information" }, "is_top_level": true, "variables": {} }, - "phonegap-plugin-push": { + "cordova-plugin-dialogs": { "source": { "type": "registry", - "id": "phonegap-plugin-push" + "id": "cordova-plugin-dialogs" }, "is_top_level": true, "variables": {} }, - "cordova-plugin-customurlscheme": { + "cordova-plugin-splashscreen": { "source": { "type": "registry", - "id": "cordova-plugin-customurlscheme" + "id": "cordova-plugin-splashscreen@4.0.0" }, "is_top_level": true, - "variables": { - "URL_SCHEME": "stoneisland" - } + "variables": {} }, - "cordova-plugin-x-socialsharing": { + "cordova-plugin-geolocation": { "source": { "type": "registry", - "id": "cordova-plugin-x-socialsharing" + "id": "cordova-plugin-geolocation" }, "is_top_level": true, "variables": {} }, - "cordova-plugin-inappbrowser": { + "cordova-plugin-compat": { "source": { "type": "registry", - "id": "cordova-plugin-inappbrowser" + "id": "cordova-plugin-compat" }, - "is_top_level": true, + "is_top_level": false, "variables": {} }, - "com.parse.cordova.core.pushplugin": { + "ionic-plugin-keyboard": { "source": { - "type": "git", - "url": "https://github.com/grrrian/phonegap-parse-plugin", - "subdir": "." + "type": "registry", + "id": "ionic-plugin-keyboard" }, "is_top_level": true, - "variables": { - "APP_ID": "GS82ZxpN8Mecpc53rsyu6aLLGK0W4CKi42J25DLB", - "CLIENT_KEY": "hQRtQfsgimYnX5PMivtcdXCG9eZhESeyTr0Rd8Sv" - } + "variables": {} } }
\ No newline at end of file diff --git a/StoneIsland/plugins/com.ionic.keyboard/LICENSE b/StoneIsland/plugins/ionic-plugin-keyboard/LICENSE index d6f545b8..d6f545b8 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/LICENSE +++ b/StoneIsland/plugins/ionic-plugin-keyboard/LICENSE diff --git a/StoneIsland/plugins/com.ionic.keyboard/README.md b/StoneIsland/plugins/ionic-plugin-keyboard/README.md index 63f70012..44dbda02 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/README.md +++ b/StoneIsland/plugins/ionic-plugin-keyboard/README.md @@ -3,7 +3,7 @@ Keyboard The `cordova.plugins.Keyboard` object provides functions to make interacting with the keyboard easier, and fires events to indicate that the keyboard will hide/show. - cordova plugin add com.ionic.keyboard + cordova plugin add ionic-plugin-keyboard Methods ------- @@ -27,6 +27,9 @@ These events are fired on the window. * A number `keyboardHeight` is given on the event object, which is the pixel height of the keyboard. - native.keyboardhide + +# API reference + Keyboard.hideKeyboardAccessoryBar ================= @@ -51,13 +54,15 @@ Close the keyboard if it is open. Supported Platforms ------------------- -- iOS, Android, Blackberry 10 +- iOS, Android, Blackberry 10, Windows Keyboard.disableScroll ================= -Disable native scrolling, useful if you are using JavaScript to scroll +Prevent the native UIScrollView from moving when an input is focused. The telltale sign that this is happening is the top of your app scrolls out of view (if using Ionic, your header bar will disappear). + +This does *not* prevent any DOM elements from being able to scroll. That needs to happen from CSS and JavaScript, not this plugin. cordova.plugins.Keyboard.disableScroll(true); cordova.plugins.Keyboard.disableScroll(false); @@ -65,23 +70,23 @@ Disable native scrolling, useful if you are using JavaScript to scroll Supported Platforms ------------------- -- iOS +- iOS, Windows Keyboard.show ================= -Force keyboard to be shown on Android. This typically helps if autofocus on a text element does not pop up the keyboard automatically +Force keyboard to be shown. This typically helps if autofocus on a text element does not pop up the keyboard automatically cordova.plugins.Keyboard.show(); Supported Platforms -- Android, Blackberry 10 +- Android, Blackberry 10, Windows native.keyboardshow ================= -This event fires when the keyboard will be shown +This event fires when the keyboard will be shown or when the keyboard frame resizes (when switching between keyboards for example) window.addEventListener('native.keyboardshow', keyboardShowHandler); @@ -98,7 +103,7 @@ keyboardHeight: the height of the keyboard in pixels Supported Platforms ------------------- -- iOS, Android, Blackberry 10 +- iOS, Android, Blackberry 10, Windows native.keyboardhide @@ -120,4 +125,4 @@ None Supported Platforms ------------------- -- iOS, Android, Blackberry 10 +- iOS, Android, Blackberry 10, Windows diff --git a/StoneIsland/plugins/ionic-plugin-keyboard/package.json b/StoneIsland/plugins/ionic-plugin-keyboard/package.json new file mode 100644 index 00000000..7bfa4542 --- /dev/null +++ b/StoneIsland/plugins/ionic-plugin-keyboard/package.json @@ -0,0 +1,30 @@ +{ + "name": "ionic-plugin-keyboard", + "version": "2.2.1", + "cordova": { + "id": "ionic-plugin-keyboard", + "platforms": [ + "android", + "ios", + "blackberry10", + "wp8", + "windows" + ] + }, + "description": "Ionic Keyboard Plugin", + "repository": "https://github.com/driftyco/ionic-plugin-keyboard.git", + "issue": "https://github.com/driftyco/ionic-plugin-keyboard/issues", + "keywords": [ + "ionic", + "cordova", + "keyboard", + "ecosystem:cordova", + "cordova-android", + "cordova-ios", + "cordova-blackberry10", + "cordova-wp8", + "cordova-windows" + ], + "author": "Ionic", + "license": "Apache 2.0" +} diff --git a/StoneIsland/plugins/ionic-plugin-keyboard/plugin.xml b/StoneIsland/plugins/ionic-plugin-keyboard/plugin.xml new file mode 100644 index 00000000..ae85ddfd --- /dev/null +++ b/StoneIsland/plugins/ionic-plugin-keyboard/plugin.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" + id="ionic-plugin-keyboard" + version="2.2.1"> + <name>Keyboard</name> + <description>Ionic Keyboard Plugin</description> + <license>Apache 2.0</license> + <keywords>Ionic,keyboard</keywords> + <repo>https://github.com/driftyco/ionic-plugin-keyboard.git</repo> + <issue>https://github.com/driftyco/ionic-plugin-keyboard/issues</issue> + + + <!-- android --> + <platform name="android"> + <js-module src="www/android/keyboard.js" name="keyboard"> + <runs/> + <clobbers target="cordova.plugins.Keyboard" /> + </js-module> + <config-file target="res/xml/config.xml" parent="/*"> + <feature name="Keyboard"> + <param name="android-package" value="io.ionic.keyboard.IonicKeyboard" /> + <param name="onload" value="true" /> + </feature> + </config-file> + + <source-file src="src/android/IonicKeyboard.java" target-dir="src/io/ionic/keyboard" /> + </platform> + + <!-- ios --> + <platform name="ios"> + <js-module src="www/ios/keyboard.js" name="keyboard"> + <runs/> + <clobbers target="cordova.plugins.Keyboard" /> + </js-module> + <config-file target="config.xml" parent="/*"> + <feature name="Keyboard"> + <param name="ios-package" value="IonicKeyboard" onload="true" /> + </feature> + </config-file> + <header-file src="src/ios/IonicKeyboard.h" /> + <source-file src="src/ios/IonicKeyboard.m" /> + </platform> + + <!-- browser --> + <platform name="browser"> + <js-module src="www/browser/keyboard.js" name="keyboard"> + <runs/> + <clobbers target="cordova.plugins.Keyboard" /> + </js-module> + </platform> + + <!-- blackberry10 --> + <platform name="blackberry10"> + <source-file src="src/blackberry10/index.js" target-dir='Keyboard' /> + <lib-file src="src/blackberry10/native/device/libKeyboard.so" arch="device"/> + <lib-file src="src/blackberry10/native/simulator/libKeyboard.so" arch="simulator"/> + <config-file target="www/config.xml" parent="/widget"> + <feature name="Keyboard" value="io.ionic.keyboard"/> + </config-file> + </platform> + + <!-- windows --> + <platform name="windows"> + <js-module src="src/windows/KeyboardProxy.js" name="KeyboardProxy"> + <runs /> + <clobbers target="cordova.plugins.Keyboard" /> + </js-module> + </platform> + +</plugin> diff --git a/StoneIsland/plugins/ionic-plugin-keyboard/src/android/IonicKeyboard.java b/StoneIsland/plugins/ionic-plugin-keyboard/src/android/IonicKeyboard.java new file mode 100644 index 00000000..128063b9 --- /dev/null +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/android/IonicKeyboard.java @@ -0,0 +1,130 @@ +package io.ionic.keyboard; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PluginResult; +import org.apache.cordova.PluginResult.Status; +import org.json.JSONArray; +import org.json.JSONException; + +import android.content.Context; +import android.graphics.Rect; +import android.util.DisplayMetrics; +import android.view.View; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; +import android.view.inputmethod.InputMethodManager; + +// import additionally required classes for calculating screen height +import android.view.Display; +import android.graphics.Point; +import android.os.Build; + +public class IonicKeyboard extends CordovaPlugin { + + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); + } + + public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { + if ("close".equals(action)) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + //http://stackoverflow.com/a/7696791/1091751 + InputMethodManager inputManager = (InputMethodManager) cordova.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + View v = cordova.getActivity().getCurrentFocus(); + + if (v == null) { + callbackContext.error("No current focus"); + } else { + inputManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + callbackContext.success(); // Thread-safe. + } + } + }); + return true; + } + if ("show".equals(action)) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + ((InputMethodManager) cordova.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); + callbackContext.success(); // Thread-safe. + } + }); + return true; + } + if ("init".equals(action)) { + cordova.getThreadPool().execute(new Runnable() { + public void run() { + //calculate density-independent pixels (dp) + //http://developer.android.com/guide/practices/screens_support.html + DisplayMetrics dm = new DisplayMetrics(); + cordova.getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); + final float density = dm.density; + + //http://stackoverflow.com/a/4737265/1091751 detect if keyboard is showing + final View rootView = cordova.getActivity().getWindow().getDecorView().findViewById(android.R.id.content).getRootView(); + OnGlobalLayoutListener list = new OnGlobalLayoutListener() { + int previousHeightDiff = 0; + @Override + public void onGlobalLayout() { + Rect r = new Rect(); + //r will be populated with the coordinates of your view that area still visible. + rootView.getWindowVisibleDisplayFrame(r); + + PluginResult result; + + // cache properties for later use + int rootViewHeight = rootView.getRootView().getHeight(); + int resultBottom = r.bottom; + + // calculate screen height differently for android versions >= 21: Lollipop 5.x, Marshmallow 6.x + //http://stackoverflow.com/a/29257533/3642890 beware of nexus 5 + int screenHeight; + + if (Build.VERSION.SDK_INT >= 21) { + Display display = cordova.getActivity().getWindowManager().getDefaultDisplay(); + Point size = new Point(); + display.getSize(size); + screenHeight = size.y; + } else { + screenHeight = rootViewHeight; + } + + int heightDiff = screenHeight - resultBottom; + + int pixelHeightDiff = (int)(heightDiff / density); + if (pixelHeightDiff > 100 && pixelHeightDiff != previousHeightDiff) { // if more than 100 pixels, its probably a keyboard... + String msg = "S" + Integer.toString(pixelHeightDiff); + result = new PluginResult(PluginResult.Status.OK, msg); + result.setKeepCallback(true); + callbackContext.sendPluginResult(result); + } + else if ( pixelHeightDiff != previousHeightDiff && ( previousHeightDiff - pixelHeightDiff ) > 100 ){ + String msg = "H"; + result = new PluginResult(PluginResult.Status.OK, msg); + result.setKeepCallback(true); + callbackContext.sendPluginResult(result); + } + previousHeightDiff = pixelHeightDiff; + } + }; + + rootView.getViewTreeObserver().addOnGlobalLayoutListener(list); + + + PluginResult dataResult = new PluginResult(PluginResult.Status.OK); + dataResult.setKeepCallback(true); + callbackContext.sendPluginResult(dataResult); + } + }); + return true; + } + return false; // Returning false results in a "MethodNotFound" error. + } + + +} + + diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/index.js b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/index.js index 40294158..a91b94a2 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/index.js +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/index.js @@ -1,14 +1,9 @@ - - var keyboard, resultObjs = {}, threadCallback = null, - _utils = require("../../lib/utils"); - _event = require("../../lib/event"); - _webview = require("../../lib/webview"); - - - + _utils = require("../../lib/utils"); + _event = require("../../lib/event"); + _webview = require("../../lib/webview"); module.exports = { @@ -20,17 +15,17 @@ module.exports = { // communication through the JNEXT plugin to keyboard_js.cpp startService: function (success, fail, args, env) { var result = new PluginResult(args, env); - + result.ok(keyboard.getInstance().startService(), false); }, show: function (success, fail, args, env) { var result = new PluginResult(args, env); - + result.ok(keyboard.getInstance().showKeyboard(), false); }, close: function (success, fail, args, env) { var result = new PluginResult(args, env); - + result.ok(keyboard.getInstance().closeKeyboard(), false); } }; @@ -38,16 +33,14 @@ module.exports = { keyboardShow = function(a){ _webview.executeJavascript("cordova.plugins.Keyboard.isVisible = true"); _webview.executeJavascript("cordova.fireDocumentEvent('native.keyboardshow',"+a+")"); - -} +}; keyboardHide = function(){ _webview.executeJavascript("cordova.plugins.Keyboard.isVisible = false"); _webview.executeJavascript("cordova.fireDocumentEvent('native.keyboardhide','')"); - -} +}; onStart = function() { - _webview.executeJavascript("cordova.exec("+null+", "+null+", 'Keyboard', 'startService', '')"); - } + _webview.executeJavascript("cordova.exec("+null+", "+null+", 'Keyboard', 'startService', '')"); +}; setTimeout(onStart,2000); @@ -92,20 +85,18 @@ JNEXT.Keyboard = function () { return JNEXT.invoke(self.m_id, "closeKeyboard"); }; - self.onEvent = function (strData) { // Fired by the Event framework (used by asynchronous callbacks) + self.onEvent = function (strData) { // Fired by the Event framework (used by asynchronous callbacks) var arData = strData.split(" "), - strEventDesc = arData[0], - jsonData; - - if (strEventDesc === "native.keyboardshow") { - jsonData = arData.slice(1, arData.length).join(" "); - keyboardShow(jsonData); - - } - else if (strEventDesc === "native.keyboardhide") { - keyboardHide(); - } + strEventDesc = arData[0], + jsonData; + if (strEventDesc === "native.keyboardshow") { + jsonData = arData.slice(1, arData.length).join(" "); + keyboardShow(jsonData); + } + else if (strEventDesc === "native.keyboardhide") { + keyboardHide(); + } }; // Thread methods @@ -132,4 +123,3 @@ JNEXT.Keyboard = function () { }; keyboard = new JNEXT.Keyboard(); - diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/.cproject b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/.cproject index 7b118eec..7b118eec 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/.cproject +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/.cproject diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/.project b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/.project index 8a39f221..8a39f221 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/.project +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/.project diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/autolink.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/autolink.h index 37c9258e..37c9258e 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/autolink.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/autolink.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/config.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/config.h index 5d334cbc..5d334cbc 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/config.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/config.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/features.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/features.h index 5a9adec1..5a9adec1 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/features.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/features.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/forwards.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/forwards.h index d0ce8300..d0ce8300 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/forwards.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/forwards.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/json.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/json.h index c71ed65a..c71ed65a 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/json.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/json.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/reader.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/reader.h index ee1d6a24..ee1d6a24 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/reader.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/reader.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/value.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/value.h index 58bfd88e..58bfd88e 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/value.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/value.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/writer.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/writer.h index 5f4b83be..5f4b83be 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json/writer.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json/writer.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_batchallocator.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_batchallocator.h index 87ea5ed8..87ea5ed8 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_batchallocator.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_batchallocator.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_internalarray.inl b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_internalarray.inl index 9b985d25..9b985d25 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_internalarray.inl +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_internalarray.inl diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_internalmap.inl b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_internalmap.inl index 19771488..19771488 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_internalmap.inl +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_internalmap.inl diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_reader.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_reader.cpp index 5af16c8d..5af16c8d 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_reader.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_reader.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_value.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_value.cpp index 6e5dcd3e..6e5dcd3e 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_value.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_value.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_valueiterator.inl b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_valueiterator.inl index 736e260e..736e260e 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_valueiterator.inl +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_valueiterator.inl diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_writer.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_writer.cpp index cdf4188f..cdf4188f 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/json_writer.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/json_writer.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/plugin.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/plugin.cpp index 6906275e..6906275e 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/plugin.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/plugin.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/plugin.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/plugin.h index 4ef71169..4ef71169 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/plugin.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/plugin.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/tokenizer.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/tokenizer.cpp index 4a39573b..4a39573b 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/tokenizer.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/tokenizer.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/tokenizer.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/tokenizer.h index 75f567ce..75f567ce 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/public/tokenizer.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/public/tokenizer.h diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/Logger.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/Logger.cpp index 57b7075e..57b7075e 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/Logger.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/Logger.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/Logger.hpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/Logger.hpp index ca379ca7..ca379ca7 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/Logger.hpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/Logger.hpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_js.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_js.cpp index 64250a14..64250a14 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_js.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_js.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_js.hpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_js.hpp index 1ed3bb78..1ed3bb78 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_js.hpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_js.hpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_ndk.cpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_ndk.cpp index 26b2e39a..26b2e39a 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_ndk.cpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_ndk.cpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_ndk.hpp b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_ndk.hpp index 01062274..01062274 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/blackberry10/native/src/keyboard_ndk.hpp +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/blackberry10/native/src/keyboard_ndk.hpp diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/ios/IonicKeyboard.h b/StoneIsland/plugins/ionic-plugin-keyboard/src/ios/IonicKeyboard.h index b54f430d..63935dc3 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/ios/IonicKeyboard.h +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/ios/IonicKeyboard.h @@ -1,8 +1,11 @@ #import <Cordova/CDVPlugin.h> +#import <objc/runtime.h> @interface IonicKeyboard : CDVPlugin <UIScrollViewDelegate> { @protected id _keyboardShowObserver, _keyboardHideObserver; + IMP wkOriginalImp, uiOriginalImp, nilImp; + Method wkMethod, uiMethod; } @property (readwrite, assign) BOOL hideKeyboardAccessoryBar; diff --git a/StoneIsland/plugins/com.ionic.keyboard/src/ios/IonicKeyboard.m b/StoneIsland/plugins/ionic-plugin-keyboard/src/ios/IonicKeyboard.m index 045cc65f..d072ca7f 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/src/ios/IonicKeyboard.m +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/ios/IonicKeyboard.m @@ -1,5 +1,5 @@ #import "IonicKeyboard.h" -#import "UIWebViewExtension.h" +// #import "UIWebViewExtension.h" #import <Cordova/CDVAvailability.h> @implementation IonicKeyboard @@ -9,29 +9,38 @@ //@synthesize styleDark = _styleDark; - (void)pluginInitialize { - - NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; - __weak IonicKeyboard* weakSelf = self; + Class wkClass = NSClassFromString([@[@"UI", @"Web", @"Browser", @"View"] componentsJoinedByString:@""]); + wkMethod = class_getInstanceMethod(wkClass, @selector(inputAccessoryView)); + wkOriginalImp = method_getImplementation(wkMethod); + Class uiClass = NSClassFromString([@[@"WK", @"Content", @"View"] componentsJoinedByString:@""]); + uiMethod = class_getInstanceMethod(uiClass, @selector(inputAccessoryView)); + uiOriginalImp = method_getImplementation(uiMethod); + nilImp = imp_implementationWithBlock(^(id _s) { + return nil; + }); + //set defaults - self.hideKeyboardAccessoryBar = NO; + self.hideKeyboardAccessoryBar = YES; self.disableScroll = NO; //self.styleDark = NO; + NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; + __weak IonicKeyboard* weakSelf = self; _keyboardShowObserver = [nc addObserverForName:UIKeyboardWillShowNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) { - + CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; keyboardFrame = [self.viewController.view convertRect:keyboardFrame fromView:nil]; - + [weakSelf.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.plugins.Keyboard.isVisible = true; cordova.fireWindowEvent('native.keyboardshow', { 'keyboardHeight': %@ }); ", [@(keyboardFrame.size.height) stringValue]]]; //deprecated [weakSelf.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireWindowEvent('native.showkeyboard', { 'keyboardHeight': %@ }); ", [@(keyboardFrame.size.height) stringValue]]]; }]; - + _keyboardHideObserver = [nc addObserverForName:UIKeyboardWillHideNotification object:nil queue:[NSOperationQueue mainQueue] @@ -42,6 +51,7 @@ [weakSelf.commandDelegate evalJs:@"cordova.fireWindowEvent('native.hidekeyboard'); "]; }]; } + - (BOOL)disableScroll { return _disableScroll; } @@ -62,6 +72,8 @@ _disableScroll = disableScroll; } +//keyboard swizzling inspired by: +//https://github.com/cjpearson/cordova-plugin-keyboard/ - (BOOL)hideKeyboardAccessoryBar { return _hideKeyboardAccessoryBar; @@ -71,13 +83,15 @@ if (hideKeyboardAccessoryBar == _hideKeyboardAccessoryBar) { return; } + if (hideKeyboardAccessoryBar) { - self.webView.hackishlyHidesInputAccessoryView = YES; + method_setImplementation(wkMethod, nilImp); + method_setImplementation(uiMethod, nilImp); + } else { + method_setImplementation(wkMethod, wkOriginalImp); + method_setImplementation(uiMethod, uiOriginalImp); } - else { - self.webView.hackishlyHidesInputAccessoryView = NO; - } - + _hideKeyboardAccessoryBar = hideKeyboardAccessoryBar; } @@ -124,17 +138,19 @@ return; } id value = [command.arguments objectAtIndex:0]; - - self.disableScroll = [value boolValue]; + if (value != [NSNull null]) { + self.disableScroll = [value boolValue]; + } } - (void) hideKeyboardAccessoryBar:(CDVInvokedUrlCommand*)command { if (!command.arguments || ![command.arguments count]){ - return; + return; } id value = [command.arguments objectAtIndex:0]; - - self.hideKeyboardAccessoryBar = [value boolValue]; + if (value != [NSNull null]) { + self.hideKeyboardAccessoryBar = [value boolValue]; + } } - (void) close:(CDVInvokedUrlCommand*)command { @@ -151,7 +167,7 @@ return; } id value = [command.arguments objectAtIndex:0]; - + self.styleDark = [value boolValue]; } */ diff --git a/StoneIsland/plugins/ionic-plugin-keyboard/src/windows/KeyboardProxy.js b/StoneIsland/plugins/ionic-plugin-keyboard/src/windows/KeyboardProxy.js new file mode 100644 index 00000000..2ce74e9f --- /dev/null +++ b/StoneIsland/plugins/ionic-plugin-keyboard/src/windows/KeyboardProxy.js @@ -0,0 +1,37 @@ + +/*global Windows, WinJS, cordova, module, require*/ + +var inputPane = Windows.UI.ViewManagement.InputPane.getForCurrentView(); +var keyboardScrollDisabled = false; + +inputPane.addEventListener('hiding', function() { + cordova.fireWindowEvent('native.keyboardhide'); + cordova.plugins.Keyboard.isVisible = false; +}); + +inputPane.addEventListener('showing', function(e) { + if (keyboardScrollDisabled) { + // this disables automatic scrolling of view contents to show focused control + e.ensuredFocusedElementInView = true; + } + cordova.fireWindowEvent('native.keyboardshow', { keyboardHeight: e.occludedRect.height }); + cordova.plugins.Keyboard.isVisible = true; +}); + +module.exports.disableScroll = function (disable) { + keyboardScrollDisabled = disable; +}; + +module.exports.show = function () { + if (typeof inputPane.tryShow === 'function') { + inputPane.tryShow(); + } +}; + +module.exports.close = function () { + if (typeof inputPane.tryShow === 'function') { + inputPane.tryHide(); + } +}; + +require("cordova/exec/proxy").add("Keyboard", module.exports); diff --git a/StoneIsland/plugins/ionic-plugin-keyboard/www/android/keyboard.js b/StoneIsland/plugins/ionic-plugin-keyboard/www/android/keyboard.js new file mode 100644 index 00000000..125a5a29 --- /dev/null +++ b/StoneIsland/plugins/ionic-plugin-keyboard/www/android/keyboard.js @@ -0,0 +1,60 @@ + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'), + channel = require('cordova/channel'); + + +var Keyboard = function() { +}; + +Keyboard.hideKeyboardAccessoryBar = function(hide) { + exec(null, null, "Keyboard", "hideKeyboardAccessoryBar", [hide]); +}; + +Keyboard.close = function() { + exec(null, null, "Keyboard", "close", []); +}; + +Keyboard.show = function() { + exec(null, null, "Keyboard", "show", []); +}; + +Keyboard.disableScroll = function(disable) { + exec(null, null, "Keyboard", "disableScroll", [disable]); +}; + +/* +Keyboard.styleDark = function(dark) { + exec(null, null, "Keyboard", "styleDark", [dark]); +}; +*/ + +Keyboard.isVisible = false; + +channel.onCordovaReady.subscribe(function() { + exec(success, null, 'Keyboard', 'init', []); + + function success(msg) { + var action = msg.charAt(0); + if ( action === 'S' ) { + var keyboardHeight = msg.substr(1); + cordova.plugins.Keyboard.isVisible = true; + cordova.fireWindowEvent('native.keyboardshow', { 'keyboardHeight': + keyboardHeight }); + + //deprecated + cordova.fireWindowEvent('native.showkeyboard', { 'keyboardHeight': + keyboardHeight }); + } else if ( action === 'H' ) { + cordova.plugins.Keyboard.isVisible = false; + cordova.fireWindowEvent('native.keyboardhide'); + + //deprecated + cordova.fireWindowEvent('native.hidekeyboard'); + } + } +}); + +module.exports = Keyboard; + + + diff --git a/StoneIsland/plugins/com.ionic.keyboard/www/keyboard.js b/StoneIsland/plugins/ionic-plugin-keyboard/www/browser/keyboard.js index 21b3bf63..8b73e621 100755..100644 --- a/StoneIsland/plugins/com.ionic.keyboard/www/keyboard.js +++ b/StoneIsland/plugins/ionic-plugin-keyboard/www/browser/keyboard.js @@ -8,19 +8,19 @@ var Keyboard = function() { }; Keyboard.hideKeyboardAccessoryBar = function(hide) { - exec(null, null, "Keyboard", "hideKeyboardAccessoryBar", [hide]); + return null; }; -Keyboard.close = function() { - exec(null, null, "Keyboard", "close", []); +Keyboard.close = function() { + return null; }; Keyboard.show = function() { - exec(null, null, "Keyboard", "show", []); + return null; }; Keyboard.disableScroll = function(disable) { - exec(null, null, "Keyboard", "disableScroll", [disable]); + return null; }; /* @@ -32,6 +32,3 @@ Keyboard.styleDark = function(dark) { Keyboard.isVisible = false; module.exports = Keyboard; - - - diff --git a/StoneIsland/plugins/ionic-plugin-keyboard/www/ios/keyboard.js b/StoneIsland/plugins/ionic-plugin-keyboard/www/ios/keyboard.js new file mode 100644 index 00000000..888a18a3 --- /dev/null +++ b/StoneIsland/plugins/ionic-plugin-keyboard/www/ios/keyboard.js @@ -0,0 +1,40 @@ + +var argscheck = require('cordova/argscheck'), + utils = require('cordova/utils'), + exec = require('cordova/exec'); + + +var Keyboard = function() { +}; + +Keyboard.hideKeyboardAccessoryBar = function(hide) { + exec(null, null, "Keyboard", "hideKeyboardAccessoryBar", [hide]); +}; + +Keyboard.close = function() { + exec(null, null, "Keyboard", "close", []); +}; + +Keyboard.show = function() { + console.warn('Showing keyboard not supported in iOS due to platform limitations.') + console.warn('Instead, use input.focus(), and ensure that you have the following setting in your config.xml: \n'); + console.warn(' <preference name="KeyboardDisplayRequiresUserAction" value="false"/>\n'); + // exec(null, null, "Keyboard", "show", []); +}; + +Keyboard.disableScroll = function(disable) { + exec(null, null, "Keyboard", "disableScroll", [disable]); +}; + +/* +Keyboard.styleDark = function(dark) { + exec(null, null, "Keyboard", "styleDark", [dark]); +}; +*/ + +Keyboard.isVisible = false; + +module.exports = Keyboard; + + + diff --git a/StoneIsland/plugins/ios.json b/StoneIsland/plugins/ios.json index fdcc6cfc..f922c31a 100644 --- a/StoneIsland/plugins/ios.json +++ b/StoneIsland/plugins/ios.json @@ -7,46 +7,47 @@ "files": {} }, "installed_plugins": { - "com.ionic.keyboard": { + "com.parse.cordova.core.pushplugin": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "com.parse.cordova.core.pushplugin": { + "cordova-plugin-inappbrowser": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-console": { + "cordova-plugin-x-socialsharing": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, "cordova-plugin-customurlscheme": { "URL_SCHEME": "stoneisland", "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-device": { - "PACKAGE_NAME": "us.okfoc.stoneisland" - }, - "cordova-plugin-dialogs": { + "cordova-plugin-whitelist": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-geolocation": { + "cordova-plugin-console": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-inappbrowser": { + "cordova-plugin-device": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, "cordova-plugin-network-information": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-splashscreen": { + "cordova-plugin-dialogs": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-whitelist": { + "cordova-plugin-splashscreen": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "cordova-plugin-x-socialsharing": { + "cordova-plugin-geolocation": { "PACKAGE_NAME": "us.okfoc.stoneisland" }, - "phonegap-plugin-push": { + "ionic-plugin-keyboard": { "PACKAGE_NAME": "us.okfoc.stoneisland" } }, - "dependent_plugins": {} + "dependent_plugins": { + "cordova-plugin-compat": { + "PACKAGE_NAME": "us.okfoc.stoneisland" + } + } }
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/CHANGELOG.md b/StoneIsland/plugins/phonegap-plugin-push/CHANGELOG.md deleted file mode 100755 index 38100051..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/CHANGELOG.md +++ /dev/null @@ -1,215 +0,0 @@ -# Change Log - - -## [1.4.0](https://github.com/phonegap/phonegap-plugin-push/tree/1.4.0) (2015-10-27) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.3.0...1.4.0) - -**Implemented enhancements:** - -- Use Google's InstanceID API [\#188](https://github.com/phonegap/phonegap-plugin-push/issues/188) - -**Closed issues:** - -- How to handle a re-installed app? [\#203](https://github.com/phonegap/phonegap-plugin-push/issues/203) -- interactive push notifications? [\#266](https://github.com/phonegap/phonegap-plugin-push/issues/266) -- Empty registrationId Android [\#265](https://github.com/phonegap/phonegap-plugin-push/issues/265) -- Run callback when clicking of notification body [\#261](https://github.com/phonegap/phonegap-plugin-push/issues/261) -- Android BUILD FAILED [\#251](https://github.com/phonegap/phonegap-plugin-push/issues/251) -- Re-register [\#250](https://github.com/phonegap/phonegap-plugin-push/issues/250) -- how to work in background ? [\#249](https://github.com/phonegap/phonegap-plugin-push/issues/249) -- installing plugin [\#244](https://github.com/phonegap/phonegap-plugin-push/issues/244) -- No Sound and vibration [\#242](https://github.com/phonegap/phonegap-plugin-push/issues/242) -- Unable to build apk [\#241](https://github.com/phonegap/phonegap-plugin-push/issues/241) -- still having problems with build. [\#239](https://github.com/phonegap/phonegap-plugin-push/issues/239) -- Registering on iOS 9 [\#238](https://github.com/phonegap/phonegap-plugin-push/issues/238) -- Custom sound repeated multiple times on Android [\#237](https://github.com/phonegap/phonegap-plugin-push/issues/237) -- Android: status bar notification is not shown [\#236](https://github.com/phonegap/phonegap-plugin-push/issues/236) -- Multiple Push Notifications - phonegap build [\#234](https://github.com/phonegap/phonegap-plugin-push/issues/234) -- error: cannot find symbol String token = InstanceID.getInstance\(getApplicationContext\(\)\).getToken\(senderID, GCM\); [\#231](https://github.com/phonegap/phonegap-plugin-push/issues/231) -- Problem using "ledColor" and "VibrationPattern" [\#229](https://github.com/phonegap/phonegap-plugin-push/issues/229) -- Notificaction event receive, but not notification showing on android [\#228](https://github.com/phonegap/phonegap-plugin-push/issues/228) -- Events for registration not being fired [\#227](https://github.com/phonegap/phonegap-plugin-push/issues/227) -- 'registration' event not firing on windows phone [\#224](https://github.com/phonegap/phonegap-plugin-push/issues/224) -- Can i subscribe to a topic in using plugin? [\#219](https://github.com/phonegap/phonegap-plugin-push/issues/219) -- GCMIntentService.java:472: error: cannot find symbol iconColor [\#217](https://github.com/phonegap/phonegap-plugin-push/issues/217) -- Push Plugin registering on iOS 9 Devices but not showing Notification [\#216](https://github.com/phonegap/phonegap-plugin-push/issues/216) -- Receiving a notification "outside app" while in it? [\#213](https://github.com/phonegap/phonegap-plugin-push/issues/213) -- iOS push not working for device tokens when spaces removed [\#212](https://github.com/phonegap/phonegap-plugin-push/issues/212) -- Error: Plugin PushPlugin failed to install. [\#210](https://github.com/phonegap/phonegap-plugin-push/issues/210) -- Build error [\#205](https://github.com/phonegap/phonegap-plugin-push/issues/205) -- Android push.on\('registration', cb\) fires correctly on device, but not in emulator. [\#204](https://github.com/phonegap/phonegap-plugin-push/issues/204) -- 1.3.0 version not compatible with "crosswalk" by PGB [\#199](https://github.com/phonegap/phonegap-plugin-push/issues/199) -- How to get data on didReceiveNotification Background Process [\#198](https://github.com/phonegap/phonegap-plugin-push/issues/198) -- PushNotification is not defined in some devices [\#196](https://github.com/phonegap/phonegap-plugin-push/issues/196) -- not getting notifications on the Android device [\#195](https://github.com/phonegap/phonegap-plugin-push/issues/195) -- Installation Errors [\#186](https://github.com/phonegap/phonegap-plugin-push/issues/186) -- IOS: on registration fired twice [\#185](https://github.com/phonegap/phonegap-plugin-push/issues/185) -- Build failed with exit code 8 [\#184](https://github.com/phonegap/phonegap-plugin-push/issues/184) -- iOS: Not able to schedule local notification after adding the plugin [\#183](https://github.com/phonegap/phonegap-plugin-push/issues/183) -- How to show multiple notifications individually in android? [\#181](https://github.com/phonegap/phonegap-plugin-push/issues/181) -- iOS init option type [\#180](https://github.com/phonegap/phonegap-plugin-push/issues/180) -- Building for Android is a quest [\#179](https://github.com/phonegap/phonegap-plugin-push/issues/179) -- How do i tell if the user open the app by tapping the notification? [\#176](https://github.com/phonegap/phonegap-plugin-push/issues/176) -- IOS custom push sound when app is in background [\#175](https://github.com/phonegap/phonegap-plugin-push/issues/175) -- Hi guys please post full working procedure, I'm not able to get registration id also. Please help [\#174](https://github.com/phonegap/phonegap-plugin-push/issues/174) -- Has anyone tested this plugin on windows? [\#173](https://github.com/phonegap/phonegap-plugin-push/issues/173) - -## [1.3.0](https://github.com/phonegap/phonegap-plugin-push/tree/1.3.0) (2015-09-21) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.2.3...1.3.0) - -**Implemented enhancements:** - -- How to use GCM 3.0 with this plugin? [\#127](https://github.com/phonegap/phonegap-plugin-push/issues/127) -- Android: possibility to send a notification with a title and without message [\#122](https://github.com/phonegap/phonegap-plugin-push/issues/122) -- Enhancement - Led, Vibration Pattern, Priority on Android [\#105](https://github.com/phonegap/phonegap-plugin-push/issues/105) - -**Fixed bugs:** - -- It is using in gcm data.additionalData ? [\#126](https://github.com/phonegap/phonegap-plugin-push/issues/126) -- iOS notification from cold boot [\#117](https://github.com/phonegap/phonegap-plugin-push/issues/117) -- Notification LED is not working [\#97](https://github.com/phonegap/phonegap-plugin-push/issues/97) - -**Closed issues:** - -- Know which version is used in build service [\#151](https://github.com/phonegap/phonegap-plugin-push/issues/151) -- Registration is not working in IOS9 [\#150](https://github.com/phonegap/phonegap-plugin-push/issues/150) -- build fail on android [\#149](https://github.com/phonegap/phonegap-plugin-push/issues/149) -- iconColor does not set icon background on Android [\#146](https://github.com/phonegap/phonegap-plugin-push/issues/146) -- Prevent windows toast notification when in foreground [\#145](https://github.com/phonegap/phonegap-plugin-push/issues/145) -- How to implement push notification for ios with this plug-in? [\#143](https://github.com/phonegap/phonegap-plugin-push/issues/143) -- After installing this plugin I can't build on Android [\#141](https://github.com/phonegap/phonegap-plugin-push/issues/141) -- version 1.2.3 [\#134](https://github.com/phonegap/phonegap-plugin-push/issues/134) -- New inbox style on android [\#131](https://github.com/phonegap/phonegap-plugin-push/issues/131) -- impossible to install the phonegap-plugin-push Error [\#130](https://github.com/phonegap/phonegap-plugin-push/issues/130) -- Hello, i am developing a cordova app which requires push notifications to be sent to users android phone, so i tried using this new phonegap push plugin as old one is deprecated, and it keeps giving me an error in console: Uncaught ReferenceError: module is not defined --- Line 154 Push.js and i dont have much experience with cordova, so can anyone assist me ? [\#128](https://github.com/phonegap/phonegap-plugin-push/issues/128) -- INVALID\_REGISTRATION when http post request with to IOS [\#123](https://github.com/phonegap/phonegap-plugin-push/issues/123) -- Andriod :More than 2 notifications in status bar it is not works. [\#121](https://github.com/phonegap/phonegap-plugin-push/issues/121) -- Release notes for 1.2.x [\#119](https://github.com/phonegap/phonegap-plugin-push/issues/119) -- Google cloud messaging GCM - Push Notification not being sent \(Server Side\) [\#110](https://github.com/phonegap/phonegap-plugin-push/issues/110) - -## [1.2.3](https://github.com/phonegap/phonegap-plugin-push/tree/1.2.3) (2015-09-08) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.2.2...1.2.3) - -**Fixed bugs:** - -- Notification not showing..... [\#101](https://github.com/phonegap/phonegap-plugin-push/issues/101) -- Same data payload for messages with action buttons [\#90](https://github.com/phonegap/phonegap-plugin-push/issues/90) - -**Closed issues:** - -- Notification doesn't show the app icon [\#112](https://github.com/phonegap/phonegap-plugin-push/issues/112) -- Notification doesn't show the app icon [\#111](https://github.com/phonegap/phonegap-plugin-push/issues/111) -- Issue with plugin facebook connect [\#107](https://github.com/phonegap/phonegap-plugin-push/issues/107) -- Cordova Support [\#99](https://github.com/phonegap/phonegap-plugin-push/issues/99) -- Uncaught ReferenceError: cordova is not defined, http://localhost:8100/lib/push.js, Line: 7 [\#98](https://github.com/phonegap/phonegap-plugin-push/issues/98) -- Notifications never received on Android [\#96](https://github.com/phonegap/phonegap-plugin-push/issues/96) -- How know the way the app was launched [\#95](https://github.com/phonegap/phonegap-plugin-push/issues/95) -- Android, example doesn't work when it goes into background [\#94](https://github.com/phonegap/phonegap-plugin-push/issues/94) -- Utilizing push plugin [\#91](https://github.com/phonegap/phonegap-plugin-push/issues/91) - -## [1.2.2](https://github.com/phonegap/phonegap-plugin-push/tree/1.2.2) (2015-08-31) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.2.1...1.2.2) - -**Closed issues:** - -- PushPlugin notification icon is too big [\#88](https://github.com/phonegap/phonegap-plugin-push/issues/88) - -## [1.2.1](https://github.com/phonegap/phonegap-plugin-push/tree/1.2.1) (2015-08-31) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.2.0...1.2.1) - -**Implemented enhancements:** - -- Question about GCM Notifications and data in the message payload [\#87](https://github.com/phonegap/phonegap-plugin-push/issues/87) - -**Fixed bugs:** - -- Notification callback for pushes without a message [\#80](https://github.com/phonegap/phonegap-plugin-push/issues/80) - -**Closed issues:** - -- Android: No notification displayed on device. Notification event never called. [\#86](https://github.com/phonegap/phonegap-plugin-push/issues/86) -- it seem no wp8 version for now [\#56](https://github.com/phonegap/phonegap-plugin-push/issues/56) - -## [1.2.0](https://github.com/phonegap/phonegap-plugin-push/tree/1.2.0) (2015-08-25) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.1.1...1.2.0) - -**Implemented enhancements:** - -- Implement Inbox style for Android [\#74](https://github.com/phonegap/phonegap-plugin-push/issues/74) -- multi-line text support [\#63](https://github.com/phonegap/phonegap-plugin-push/issues/63) - -**Fixed bugs:** - -- Pushes being deleted from notification bar when cold start [\#67](https://github.com/phonegap/phonegap-plugin-push/issues/67) - -**Closed issues:** - -- oficial push plugin and windows and wp8 compatibility [\#71](https://github.com/phonegap/phonegap-plugin-push/issues/71) -- On Android, GCMIntentService.onError\(\) doesn't get passed to the JavaScript "error" event [\#65](https://github.com/phonegap/phonegap-plugin-push/issues/65) -- Android: add property to vibrate phone on received notification [\#61](https://github.com/phonegap/phonegap-plugin-push/issues/61) -- push.on =\> "registration" will trigger twice times that only in iOS [\#57](https://github.com/phonegap/phonegap-plugin-push/issues/57) - -## [1.1.1](https://github.com/phonegap/phonegap-plugin-push/tree/1.1.1) (2015-07-27) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.1.0...1.1.1) - -## [1.1.0](https://github.com/phonegap/phonegap-plugin-push/tree/1.1.0) (2015-07-27) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.0.1...1.1.0) - -**Implemented enhancements:** - -- iOS doesn't add foreground key [\#41](https://github.com/phonegap/phonegap-plugin-push/issues/41) -- Android: Notification icon problem [\#20](https://github.com/phonegap/phonegap-plugin-push/issues/20) -- iOS badge number [\#18](https://github.com/phonegap/phonegap-plugin-push/issues/18) -- How i can set icons for push notifications in status bar and push view in android [\#14](https://github.com/phonegap/phonegap-plugin-push/issues/14) -- Support Win8.1 + Phone 8.1 Universal Apps \(WNS\), drop support for WP8.0 \(MPNS\) [\#13](https://github.com/phonegap/phonegap-plugin-push/issues/13) - -**Fixed bugs:** - -- iOS only reads out "aps" payload [\#29](https://github.com/phonegap/phonegap-plugin-push/issues/29) -- Event not fired when in background [\#24](https://github.com/phonegap/phonegap-plugin-push/issues/24) -- Custom notification sound in background mode? [\#17](https://github.com/phonegap/phonegap-plugin-push/issues/17) - -**Closed issues:** - -- iOS only receives first notification in foreground [\#42](https://github.com/phonegap/phonegap-plugin-push/issues/42) -- Cannot register on iOS [\#30](https://github.com/phonegap/phonegap-plugin-push/issues/30) -- Fix Android paths in src folder [\#23](https://github.com/phonegap/phonegap-plugin-push/issues/23) -- PushNotification not defined [\#21](https://github.com/phonegap/phonegap-plugin-push/issues/21) -- Error trying to remove the plugin [\#19](https://github.com/phonegap/phonegap-plugin-push/issues/19) -- Handling multiple notifications on Android devices [\#12](https://github.com/phonegap/phonegap-plugin-push/issues/12) -- PGB \(build.phonegap.com\) problem [\#11](https://github.com/phonegap/phonegap-plugin-push/issues/11) -- reporting location via gcm [\#6](https://github.com/phonegap/phonegap-plugin-push/issues/6) - -**Merged pull requests:** - -- Updating Readme to document toast capable setting [\#47](https://github.com/phonegap/phonegap-plugin-push/pull/47) ([rakatyal](https://github.com/rakatyal)) -- fix issue \#41 [\#44](https://github.com/phonegap/phonegap-plugin-push/pull/44) ([Deminetix](https://github.com/Deminetix)) -- fix issue \#42 [\#43](https://github.com/phonegap/phonegap-plugin-push/pull/43) ([Deminetix](https://github.com/Deminetix)) -- Adding hyperlinks to README [\#40](https://github.com/phonegap/phonegap-plugin-push/pull/40) ([rakatyal](https://github.com/rakatyal)) -- Updating Readme [\#37](https://github.com/phonegap/phonegap-plugin-push/pull/37) ([rakatyal](https://github.com/rakatyal)) -- Adding windows support to plugin [\#36](https://github.com/phonegap/phonegap-plugin-push/pull/36) ([rakatyal](https://github.com/rakatyal)) -- Raghav/update [\#35](https://github.com/phonegap/phonegap-plugin-push/pull/35) ([rakatyal](https://github.com/rakatyal)) -- Adding behavior for different notification types [\#28](https://github.com/phonegap/phonegap-plugin-push/pull/28) ([rakatyal](https://github.com/rakatyal)) -- Initial commit to add support for windows universal platform [\#15](https://github.com/phonegap/phonegap-plugin-push/pull/15) ([rakatyal](https://github.com/rakatyal)) - -## [1.0.1](https://github.com/phonegap/phonegap-plugin-push/tree/1.0.1) (2015-06-08) -[Full Changelog](https://github.com/phonegap/phonegap-plugin-push/compare/1.0.0...1.0.1) - -**Closed issues:** - -- documentation "senderId" correction [\#10](https://github.com/phonegap/phonegap-plugin-push/issues/10) -- add to our ci page [\#9](https://github.com/phonegap/phonegap-plugin-push/issues/9) -- Update installation instructions [\#7](https://github.com/phonegap/phonegap-plugin-push/issues/7) - -## [1.0.0](https://github.com/phonegap/phonegap-plugin-push/tree/1.0.0) (2015-06-05) -**Closed issues:** - -- Update code using enabledRemoteNotificationTypes because it is “not supported in iOS 8†[\#8](https://github.com/phonegap/phonegap-plugin-push/issues/8) -- Register method not working [\#4](https://github.com/phonegap/phonegap-plugin-push/issues/4) -- Publish plugin to npm [\#3](https://github.com/phonegap/phonegap-plugin-push/issues/3) -- Update example to use new API [\#2](https://github.com/phonegap/phonegap-plugin-push/issues/2) -- Lowercase Example/ directory [\#1](https://github.com/phonegap/phonegap-plugin-push/issues/1) - - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/MIT-LICENSE b/StoneIsland/plugins/phonegap-plugin-push/MIT-LICENSE deleted file mode 100755 index 55ab5e39..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2012 Bob Easterday, Adobe Systems - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/README.md b/StoneIsland/plugins/phonegap-plugin-push/README.md deleted file mode 100755 index fbdc3626..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/README.md +++ /dev/null @@ -1,694 +0,0 @@ -#phonegap-plugin-push [](https://travis-ci.org/phonegap/phonegap-plugin-push) - -> Register and receive push notifications - -## Installation - -This requires phonegap/cordova CLI 5.0+ ( current stable v1.4.4 ) - -``` -phonegap plugin add phonegap-plugin-push -``` -or - -``` -cordova plugin add phonegap-plugin-push -``` - -It is also possible to install via repo url directly ( unstable ) - -``` -phonegap plugin add https://github.com/phonegap/phonegap-plugin-push -``` - -or - -``` -cordova plugin add https://github.com/phonegap/phonegap-plugin-push -``` - -## Supported Platforms - -- Android -- iOS -- Windows Universal - -## Quick Example - -```javascript - var push = PushNotification.init({ "android": {"senderID": "12345679"}, - "ios": {"alert": "true", "badge": "true", "sound": "true"}, "windows": {} } ); - - push.on('registration', function(data) { - // data.registrationId - }); - - push.on('notification', function(data) { - // data.message, - // data.title, - // data.count, - // data.sound, - // data.image, - // data.additionalData - }); - - push.on('error', function(e) { - // e.message - }); -``` - -## API - -### PushNotification.init(options) - -Parameter | Description ---------- | ------------ -`options` | `JSON Object` platform specific initialization options. -`options.android` | `JSON Object` Android specific initialization options. -`options.android.senderID` | `String` Maps to the project number in the Google Developer Console. -`options.android.icon` | `String` Optional. The name of a drawable resource to use as the small-icon. The name should not include the extension. -`options.android.iconColor` | `String` Optional. Sets the background color of the small icon on Android 5.0 and greater. [Supported Formats](http://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)) -`options.android.sound` | `Boolean` Optional. If `true` it plays the sound specified in the push data or the default system sound. Default is `true`. -`options.android.vibrate` | `Boolean` Optional. If `true` the device vibrates on receipt of notification. Default is `true`. -`options.android.clearNotifications` | `Boolean` Optional. If `true` the app clears all pending notifications when it is closed. Default is `true`. -`options.android.forceShow` | `Boolean` Optional. If `true` will always show a notification, even when the app is on the foreground. Default is `false`. -`options.ios` | `JSON Object` iOS specific initialization options. -`options.ios.alert` | `Boolean`\|`String` Optional. If `true`\|`"true"` the device shows an alert on receipt of notification. Default is `false`\|`"false"`. **Note:** the value you set this option to the first time you call the init method will be how the application always acts. Once this is set programmatically in the init method it can only be changed manually by the user in Settings>Notifications>`App Name`. This is normal iOS behaviour. -`options.ios.badge` | `Boolean`\|`String` Optional. If `true`\|`"true"` the device sets the badge number on receipt of notification. Default is `false`\|`"false"`. **Note:** the value you set this option to the first time you call the init method will be how the application always acts. Once this is set programmatically in the init method it can only be changed manually by the user in Settings>Notifications>`App Name`. This is normal iOS behaviour. -`options.ios.sound` | `Boolean`\|`String` Optional. If `true`\|`"true"` the device plays a sound on receipt of notification. Default is `false`\|`"false"`. **Note:** the value you set this option to the first time you call the init method will be how the application always acts. Once this is set programmatically in the init method it can only be changed manually by the user in Settings>Notifications>`App Name`. This is normal iOS behaviour. -`options.ios.clearBadge` | `Boolean`\|`String` Optional. If `true`\|`"true"` the badge will be cleared on app startup. Default is `false`\|`"false"`. -`options.windows` | `JSON Object` Windows specific initialization options. - -#### Returns - -- Instance of `PushNotification`. - -#### Example - -```javascript - var push = PushNotification.init({ "android": {"senderID": "12345679"}, - "ios": {"alert": "true", "badge": "true", "sound": "true"}, "windows": {} } ); -``` - -### push.on(event, callback) - -Parameter | Description ---------- | ------------ -`event` | `String` Name of the event to listen to. See below for all the event names. -`callback` | `Function` is called when the event is triggered. - -### push.on('registration', callback) - -The event `registration` will be triggered on each successful registration with the 3rd party push service. - -Callback Parameter | Description ------------------- | ----------- -`data.registrationId` | `String` The registration ID provided by the 3rd party remote push service. - -#### Example - -```javascript -push.on('registration', function(data) { - // data.registrationId -}); -``` - -### push.on('notification', callback) - -The event `notification` will be triggered each time a push notification is received by a 3rd party push service on the device. - -Callback Parameter | Description ------------------- | ----------- -`data.message` | `String` The text of the push message sent from the 3rd party service. -`data.title` | `String` The optional title of the push message sent from the 3rd party service. -`data.count` | `String` The number of messages to be displayed in the badge iOS or message count in the notification shade in Android. For windows, it represents the value in the badge notification which could be a number or a status glyph. -`data.sound` | `String` The name of the sound file to be played upon receipt of the notification. -`data.image` | `String` The path of the image file to be displayed in the notification. -`data.additionalData` | `JSON Object` An optional collection of data sent by the 3rd party push service that does not fit in the above properties. -`data.additionalData.foreground` | `Boolean` Whether the notification was received while the app was in the foreground - -#### Example - -```javascript - push.on('notification', function(data) { - // data.message, - // data.title, - // data.count, - // data.sound, - // data.image, - // data.additionalData - }); -``` - -### push.on('error', callback) - -The event `error` will trigger when an internal error occurs and the cache is aborted. - -Callback Parameter | Description ------------------- | ----------- -`e` | `Error` Standard JavaScript error object that describes the error. - -#### Example - -```javascript -push.on('error', function(e) { - // e.message -}); -``` - -### push.off(event, handle) - -Parameter | Description ---------- | ------------ -`event` | `String` Name of the event type. The possible event names are the same as for the ```push.on``` function. -`handle` | `Function` handle to the function to get removed. - -#### Example -```javascript -var eventHandler = function(data){ /*...*/}; - -//Adding handler for notification event -push.on('notification', eventHandler); - -//Removing handler for notification event -push.off('notification', eventHandler); -``` - -As stated in the example, you will have to store your event handler if you are planning to remove it. - -### push.unregister(successHandler, errorHandler) - -The unregister method is used when the application no longer wants to receive push notifications. - -#### Example - -```javascript -push.unregister(successHandler, errorHandler); -``` - -### push.setApplicationIconBadgeNumber(successHandler, errorHandler, count) - iOS only - -Set the badge count visible when the app is not running - -The `count` is an integer indicating what number should show up in the badge. Passing 0 will clear the badge. Each `notification` event contains a `data.count` value which can be used to set the badge to correct number. - -#### Example - -```javascript -push.setApplicationIconBadgeNumber(successHandler, errorHandler, count); -``` - -### push.getApplicationIconBadgeNumber(successHandler, errorHandler) - iOS only - -Get the current badge count visible when the app is not running - -successHandler gets called with an integer which is the current badge count - -#### Example - -```javascript -push.getApplicationIconBadgeNumber(successHandler, errorHandler); -``` - -### push.finish(successHandler, errorHandler) - iOS only - -Tells the OS that you are done processing a background push notification. - -successHandler gets called when background push processing is successfully completed. - -#### Example - -```javascript -push.finish(successHandler, errorHandler); -``` - -## PhoneGap Build Support - -Including this plugin in a project that is built by PhoneGap Build is as easy as adding: - -``` -<gap:plugin name="phonegap-plugin-push" source="npm" /> -``` - -into your apps `config.xml` file. PhoneGap Build will pick up the latest version of phonegap-plugin-push published on npm. If you want to specify a particular version of the plugin you can add the `version` attribute to the `gap` tag. - -``` -<gap:plugin name="phonegap-plugin-push" source="npm" version="1.2.3" /> -``` - -Note: version 1.3.0 of this plugin begins to use Gradle to install the Android Support Framework. Support for Gradle has recently been added to PhoneGap Build. Please read [this blog post](http://phonegap.com/blog/2015/09/28/android-using-gradle/) for more information. - -## Android Behaviour - -### Compiling - -As of version 1.3.0 the plugin has been switched to using Gradle/Maven for building. You will need to ensure that you have installed the Android Support Library version 23 or greater, Android Support Repository version 20 or greater, Google Play Services version 27 or greater and Google Repository version 22 or greater. - - - -For more detailed instructions on how to install the Android Support Library visit [Google's documentation](https://developer.android.com/tools/support-library/setup.html). - -### Images - -By default the icon displayed in your push notification will be your apps icon. So when you initialize the plugin like this: - -```javascript - var push = PushNotification.init({ "android": {"senderID": "12345679"}, - "ios": {"alert": "true", "badge": "true", "sound": "true"}, "windows": {} } ); -``` - -The result will look much like this: - - - -This is because Android now uses Material design and the default icon for push will be completely white. - -In order to get a better user experience you can specify an alternate icon and background color to be shown when receiving a push notification. The code would look like this: - -```javascript - var push = PushNotification.init({ - "android": { - "senderID": "123456789", "icon": "phonegap", "iconColor": "blue"}, - "ios": {"alert": "true", "badge": "true", "sound": "true"}, "windows": {} - }); -``` - -Where *icon* is the name of an image in the Android *drawables* folder. Writing a hook to describe how to copy an image to the Android *drawables* folder is out of scope for this README but there is an [excellent tutorial](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) that you can copy. - -*iconColor* is one of the supported formats #RRGGBB or #AARRGGBB or one of the following names: 'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', 'teal'. *iconColor* is supported on Android 5.0 and greater. - -Please follow the [Android icon design guidelines](https://www.google.com/design/spec/style/icons.html#) when creating your icon. - - - -Additionally, each push can include a large icon which is used to personalize each push. The location of the image may one of three types. - -The first is the *drawables* folder in your app. This JSON sent from GCM: - -```javascript -{ - title:"Large Icon", - message: "Loaded from drawables folder", - image: "twitter" -} -``` - -Would look for the *twitter* image in the drawables folder and produce the following notification. - - - -The second is the *assets* folder in your app. This JSON sent from GCM: - -```javascript -{ - title:"Large Icon", - message: "Loaded from assets folder", - image: "www/image/logo.png" -} -``` - -Would look for the *logo.png* file in the assets/www/img folder. Since your apps www folder gets copied into the Android assets folder it is an excellent spot to store the images without needing to write a hook to copy them to the *drawables* folder. It produces the following notification. - - - - -The third is the remote *URL*. This JSON sent from GCM: - -```javascript -{ - title:"Large Icon", - message: "Loaded from URL", - image: "https://dl.dropboxusercontent.com/u/887989/antshot.png" -} -``` - -Produces the following notification. - - - -### Sound - -In order for your your notification to play a custom sound you will need to add the files to your Android project's `res/raw` directory. Then send the follow JSON from GCM: - -```javascript -{ - title:"Sound Test", - message: "Loaded res/raw", - soundname: "test" -} -``` - -*Note:* when you specify the custom sound file name omit the file's extension. - -### Stacking - -By default when using this plugin on Android each notification that your app receives will replace the previous notification in the shade. - -If you want to see multiple notifications in the shade you will need to provide a notification ID as part of the push data sent to the app. For instance if you send: - -```javascript -{ - title: "Test Push", - message: "Push number 1" -} -``` - -Followed by: - -```javascript -{ - title: "Test Push", - message: "Push number 2" -} -``` - -You will only see "Push number 2" in the shade. However, if you send: - -```javascript -{ - title: "Test Push", - message: "Push number 1", - notId: 1 -} -``` - -and: - -```javascript -{ - title: "Test Push", - message: "Push number 2", - notId: 2 -} -``` - -You will only see both "Push number 1" and "Push number 2" in the shade. - -### Inbox Stacking ### - -A better alternative to stacking your notifications is to use the inbox style to have up to 8 lines of notification text in a single notification. If you send the following JSON from GCM you will see: - -```javascript -{ - title:"My Title", - message: "My first message", - style: "inbox", - summaryText: "There are %n% notifications" -} -``` - -It will produce a normal looking notification: - - - -But, if you follow it up with subsequent notifications like: - -```javascript -{ - title:"My Title", - message: "My second message", - style: "inbox", - summaryText: "There are %n% notifications" -} -``` - -You will get an inbox view so you can display multiple notifications in a single panel. - - - -If you use `%n%` in the `summaryText` of the JSON coming down from GCM it will be replaced by the number of messages that are currently in the queue. - -### Action Buttons - -Your notification can include action buttons. If you wish to include an icon along with the button name they must be placed in the `res/drawable` directory of your Android project. Then you can send the following JSON from GCM: - -```javascript -{ - title:"AUX Scrum", - message: "Scrum: Daily touchbase @ 10am Please be on time so we can cover everything on the agenda.", - actions: [ - { icon: "emailGuests", title: "EMAIL GUESTS", callback: "app.emailGuests"}, - { icon: "snooze", title: "SNOOZE", callback: "app.snooze"}, - ] -} -``` - -This will produce the following notification in your tray: - - - -If your users clicks on the main body of the notification your app will be opened. However if they click on either of the action buttons the app will open (or start) and the specified JavaScript callback will be executed. In this case it is `app.emailGuests` and `app.snooze` respectively. - -### Led in Notifications - -You can use a Led notifcation and choose the color of it. Just add a `ledColor` field in your notification in the ARGB format array: - -```javascript -{ - title:"Green LED", - message: "This is my message with a Green LED", - ledColor: [0, 0, 255, 0] -} -``` - -### Vibration Pattern in Notifications - -You can set a Vibration Pattern for your notifications. Just add a `vibrationPattern` field in your notification: - -```javascript -{ - title:"Vibration Pattern", - message: "Device should wait for 2 seconds, vibrate for 1 second then be silent for 500 ms then vibrate for 500 ms", - vibrationPattern: [2000, 1000, 500, 500] -} -``` - -### Priority in Notifications - -You can set a priority parameter for your notifications. Just add a `priority` field in your notification. -2: minimum, -1: low, 0: default , 1: high, 2: maximum priority: - -```javascript -{ - title:"This is a maximum priority Notification", - message: "This notification should appear in front of all others", - priority: 2 -} -``` - -### Picture Messages - -Perhaps you want to include a large picture in the notification that you are sending to your users. Luckily you can do that too buy sending the following JSON from GCM. - -```javascript -{ - title:"Big Picture", - message: "This is my big picture message", - style: "picture", - picture: "http://36.media.tumblr.com/c066cc2238103856c9ac506faa6f3bc2/tumblr_nmstmqtuo81tssmyno1_1280.jpg", - summaryText: "The internet is built on cat pictures" -} -``` - -This will produce the following notification in your tray: - - - -### Co-existing with FaceBook Plugin - -There are a number of Cordova FaceBook Plugins available but the one that we recommend is [Jeduan's fork](https://github.com/jeduan/cordova-plugin-facebook4) of the original Wizcorp plugin. It is setup to use Gradle/Maven properly and the latest FaceBook SDK. - -To add to your app: - -``` -phonegap plugin add https://github.com/jeduan/cordova-plugin-facebook4 --variable APP_ID="App ID" --variable APP_NAME="App Name" -``` -or - -``` -cordova plugin add https://github.com/jeduan/cordova-plugin-facebook4 --variable APP_ID="App ID" --variable APP_NAME="App Name" -``` - -If you have an issue compiling the app and you are getting this error: - -``` -* What went wrong: -Execution failed for task ':processDebugManifest'. -> Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller than version 15 declared in library /Users/smacdona/code/bookface/platforms/android/build/intermediates/exploded-aar/com.facebook.android/facebook-android-sdk/4.6.0/AndroidManifest.xml - Suggestion: use tools:overrideLibrary="com.facebook" to force usage -``` - -Then you can add the following entry into your config.xml file in the android platform tag. - -```xml -<platform name="android"> - <preference name="android-minSdkVersion" value="15"/> - </platform> -``` - - -### Background Notifications - -On Android if you want your `on('notification')` event handler to be called when your app is in the background it is relatively simple. - -The JSON you send to GCM should not contain a title or message parameter. For instance the following JSON: - -```javascript -{ - title: "Test Push", - message: "Push number 1", - info: "super secret info" -} -``` - -will produce a notification in the notification shade and call your `on('notification')` event handler. - -However if you want your `on('notification')` event handler called but no notification to be shown in the shader you would omit the `alert` property and send the following JSON to GCM: - -```javascript -{ - info: "super secret info" -} -``` - -Omitting the message and title properties will keep your push from being added to the notification shade but it will still trigger your `on('notification')` event handler. - -## iOS Behaviour - -### Sound - -In order for your your notification to play a custom sound you will need to add the files to root of your iOS project. The files must be in the proper format. See the [Local and Remote Notification Programming Guide](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW6) for more info on proper file formats and how to convert existing sound files. - -Then send the follow JSON from APNS: - -```javascript -{ - "aps": { - "alert": "Test sound", - "sound": "sub.caf" - } -} -``` - -### Background Notifications - -On iOS if you want your `on('notification')` event handler to be called when your app is in the background you will need to do a few things. - -First the JSON you send from APNS will need to include `content-available: 1` to the `aps` object. The `content-available: 1` property in your push message is a signal to iOS to wake up your app and give it up to 30 seconds of background processing. If do not want this type of behaviour just omit `content-available: 1` from your push data. - - -For instance the following JSON: - -```javascript -{ - "aps": { - "alert": "Test background push", - "content-available": "1" - } -} -``` - -will produce a notification in the notification shade and call your `on('notification')` event handler. - -However if you want your `on('notification')` event handler called but no notification to be shown in the shader you would omit the `alert` property and send the following JSON to APNS: - -```javascript -{ - "aps": { - "data": "Test silent background push", - "moredata": "Do more stuff", - "content-available": "1" - } -} -``` - -That covers what you need to do on the server side to accept background pushes on iOS. However, it is critically important that you continue reading as there will be a change in your `on('notification')`. When you receive a background push on iOS you will be given 30 seconds of time in which to complete a task. If you spend longer than 30 seconds on the task the OS may decide that your app is misbehaving and kill it. In order to signal iOS that your `on('notification')` handler is done you will need to call the new `push.finish()` method. - -For example: - -```javascript -var push = PushNotification.init({ - "ios": { - "sound": true, - "vibration": true, - "badge": true, - "clearBadge": true - } -}); - -push.on('registration', function(data) { - // send data.registrationId to push service -}); - - -push.on('notification', function(data) { - // do something with the push data - // then call finish to let the OS know we are done - push.finish(function() { - console.log("processing of push data is finished"); - }); -}); -``` - -It is absolutely critical that you call `push.finish()` when you have successfully processed your background push data. - -## Windows Behaviour - -###Notifications - -The plugin supports all types of windows platform notifications namely [Tile, Toast, Badge and Raw](https://msdn.microsoft.com/en-us/library/windows/apps/Hh779725.aspx). The API supports the basic cases of the notification templates with title corresponding to the first text element and message corresponding to the second if title is present else the first one. The image corresponds to the first image element of the notification xml. - -The count is present only for the badge notification in which it represent the value of the notification which could be a number from 0-99 or a status glyph. - -For advanced templates and usage, the notification object is included in [`data.additionalData.pushNotificationReceivedEventArgs`](https://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.pushnotifications.pushnotificationreceivedeventargs). - -### Setting Toast Capable Option for Windows - -This plugin automatically sets the toast capable flag to be true for Cordova 5.1.1+. For lower versions, you must declare that it is Toast Capable in your app's manifest file. - -### Disabling the default processing of notifications by Windows - -The default handling can be disabled by setting the 'cancel' property in the notification object. - -``` -data.additionalData.pushNotificationReceivedEventArgs.cancel = true -``` - -## Native Requirements - -- There should be no dependency on any other plugins. -- All platforms should use the same API! - -## Running Tests - -``` -npm test -``` - -## Contributing - -### Editor Config - -The project uses [.editorconfig](http://editorconfig.org/) to define the coding -style of each file. We recommend that you install the Editor Config extension -for your preferred IDE. - -### JSHint - -The project uses [.jshint](http://jshint.com/docs) to define the JavaScript -coding conventions. Most editors now have a JSHint add-on to provide on-save -or on-edit linting. - -#### Install JSHint for vim - -1. Install [jshint](https://www.npmjs.com/package/jshint). -1. Install [jshint.vim](https://github.com/wookiehangover/jshint.vim). - -#### Install JSHint for Sublime - -1. Install [Package Control](https://packagecontrol.io/installation) -1. Restart Sublime -1. Type `CMD+SHIFT+P` -1. Type _Install Package_ -1. Type _JSHint Gutter_ -1. Sublime -> Preferences -> Package Settings -> JSHint Gutter -1. Set `lint_on_load` and `lint_on_save` to `true` diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/beep.wav b/StoneIsland/plugins/phonegap-plugin-push/example/www/beep.wav Binary files differdeleted file mode 100755 index bdadf530..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/beep.wav +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/css/index.css b/StoneIsland/plugins/phonegap-plugin-push/example/www/css/index.css deleted file mode 100755 index 51daa797..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/css/index.css +++ /dev/null @@ -1,115 +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. - */ -* { - -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ -} - -body { - -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ - -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ - -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ - background-color:#E4E4E4; - background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); - background-image:-webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #A7A7A7), - color-stop(0.51, #E4E4E4) - ); - background-attachment:fixed; - font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; - font-size:12px; - height:100%; - margin:0px; - padding:0px; - text-transform:uppercase; - width:100%; -} - -/* Portrait layout (default) */ -.app { - background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ - position:absolute; /* position in the center of the screen */ - left:50%; - top:50%; - height:50px; /* text area height */ - width:225px; /* text area width */ - text-align:center; - padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ - margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ - /* offset horizontal: half of text area width */ -} - -/* Landscape layout (with min-width) */ -@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { - .app { - background-position:left center; - padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ - margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ - /* offset horizontal: half of image width and text area width */ - } -} - -h1 { - font-size:24px; - font-weight:normal; - margin:0px; - overflow:visible; - padding:0px; - text-align:center; -} - -.event { - border-radius:4px; - -webkit-border-radius:4px; - color:#FFFFFF; - font-size:12px; - margin:0px 30px; - padding:2px 0px; -} - -.event.listening { - background-color:#333333; - display:block; -} - -.event.received { - background-color:#4B946A; - display:none; -} - -@keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -@-webkit-keyframes fade { - from { opacity: 1.0; } - 50% { opacity: 0.4; } - to { opacity: 1.0; } -} - -.blink { - animation:fade 3000ms infinite; - -webkit-animation:fade 3000ms infinite; -} diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/css/materialize.min.css b/StoneIsland/plugins/phonegap-plugin-push/example/www/css/materialize.min.css deleted file mode 100755 index e956485c..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/css/materialize.min.css +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * Materialize v0.96.1 (http://materializecss.com) - * Copyright 2014-2015 Materialize - * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) - */ -.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#aa00ff !important}.purple-text.text-accent-4{color:#aa00ff !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ffff00 !important}.yellow-text.text-accent-2{color:#ffff00 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eeeeee !important}.grey-text.text-lighten-3{color:#eeeeee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.shades.black{background-color:#000000 !important}.shades-text.text-black{color:#000000 !important}.shades.white{background-color:#FFFFFF !important}.shades-text.text-white{color:#FFFFFF !important}.shades.transparent{background-color:transparent !important}.shades-text.text-transparent{color:transparent !important}.black{background-color:#000000 !important}.black-text{color:#000000 !important}.white{background-color:#FFFFFF !important}.white-text{color:#FFFFFF !important}.transparent{background-color:transparent !important}.transparent-text{color:transparent !important}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}html input[type="button"],button,input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.valign-wrapper .valign{display:block}ul{padding:0}ul li{list-style-type:none}.clearfix{clear:both}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-floating,.dropdown-content,.collapsible,.side-nav{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);-moz-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-floating:hover{-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);-moz-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15)}.z-depth-2{-webkit-box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);-moz-box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.z-depth-3{-webkit-box-shadow:0 12px 15px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);-moz-box-shadow:0 12px 15px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);box-shadow:0 12px 15px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19)}.z-depth-4,.modal{-webkit-box-shadow:0 16px 28px 0 rgba(0,0,0,0.22),0 25px 55px 0 rgba(0,0,0,0.21);-moz-box-shadow:0 16px 28px 0 rgba(0,0,0,0.22),0 25px 55px 0 rgba(0,0,0,0.21);box-shadow:0 16px 28px 0 rgba(0,0,0,0.22),0 25px 55px 0 rgba(0,0,0,0.21)}.z-depth-5{-webkit-box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);-moz-box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22);box-shadow:0 27px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #EF9A9A}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{font-size:1.2rem;float:left;width:30px;height:30px;margin:0 10px;border-radius:2px;text-align:center}.pagination li a{color:#444}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{color:#999}.pagination li i{font-size:2rem;line-height:1.8rem}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax img{display:none;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;transform-origin:0 50%}@media only screen and (max-width : 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important;}}@media only screen and (max-width : 992px){.hide-on-med-and-down{display:none !important;}}@media only screen and (min-width : 601px){.hide-on-med-and-up{display:none !important;}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important;}}@media only screen and (min-width : 993px){.hide-on-large-only{display:none !important;}}@media only screen and (min-width : 993px){.show-on-large{display:initial !important;}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:initial !important;}}@media only screen and (max-width : 600px){.show-on-small{display:initial !important;}}@media only screen and (min-width : 601px){.show-on-medium-and-up{display:initial !important;}}@media only screen and (max-width : 992px){.show-on-medium-and-down{display:initial !important;}}@media only screen and (max-width : 600px){.center-on-small-only{text-align:center;}}footer.page-footer{margin-top:20px;padding-top:20px;background-color:#ee6e73}footer.page-footer .footer-copyright{overflow:hidden;height:50px;line-height:50px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table}table.bordered tr{border-bottom:1px solid #d0d0d0}table.striped tbody tr:nth-child(odd){background-color:#f2f2f2}table.hoverable tbody tr{-webkit-transition:background-color .25s ease;-moz-transition:background-color .25s ease;-o-transition:background-color .25s ease;-ms-transition:background-color .25s ease;transition:background-color .25s ease}table.hoverable tbody tr:hover{background-color:#f2f2f2}table.centered thead tr th,table.centered tbody tr td{text-align:center}thead{border-bottom:1px solid #d0d0d0}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width : 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:"\00a0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid #d0d0d0}table.responsive-table.bordered th{border-bottom:0;border-left:0}table.responsive-table.bordered td{border-left:0;border-right:0;border-bottom:0}table.responsive-table.bordered tr{border:0}table.responsive-table.bordered tbody tr{border-right:1px solid #d0d0d0}}.collection{margin:0.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar .circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection a.collection-item{display:block;-webkit-transition:0.25s;-moz-transition:0.25s;-o-transition:0.25s;-ms-transition:0.25s;transition:0.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.secondary-content{float:right;color:#26a69a}span.badge{min-width:3rem;padding:0 6px;text-align:center;font-size:1rem;line-height:inherit;color:#757575;position:absolute;right:15px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}span.badge.new{font-weight:300;font-size:0.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container.no-controls{padding-top:0}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:0.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;background-color:inherit;top:0;bottom:0;background-color:#26a69a;-webkit-transition:width .3s linear;-moz-transition:width .3s linear;-o-transition:width .3s linear;-ms-transition:width .3s linear;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;-moz-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;-ms-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;-o-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-moz-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-ms-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-o-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-webkit-animation-delay:1.15s;-moz-animation-delay:1.15s;-ms-animation-delay:1.15s;-o-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-moz-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@-moz-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}@font-face{font-family:"Material-Design-Icons";src:url("../font/material-design-icons/Material-Design-Icons.eot?#iefix") format("embedded-opentype"),url("../font/material-design-icons/Material-Design-Icons.woff2") format("woff2"),url("../font/material-design-icons/Material-Design-Icons.woff") format("woff"),url("../font/material-design-icons/Material-Design-Icons.ttf") format("truetype"),url("../font/material-design-icons/Material-Design-Icons.svg#Material-Design-Icons") format("svg");font-weight:normal;font-style:normal;}[class^="mdi-"],[class*=" mdi-"]{font-family:"Material-Design-Icons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-action-3d-rotation:before{content:"\e600"}.mdi-action-accessibility:before{content:"\e601"}.mdi-action-account-balance:before{content:"\e602"}.mdi-action-account-balance-wallet:before{content:"\e603"}.mdi-action-account-box:before{content:"\e604"}.mdi-action-account-child:before{content:"\e605"}.mdi-action-account-circle:before{content:"\e606"}.mdi-action-add-shopping-cart:before{content:"\e607"}.mdi-action-alarm:before{content:"\e608"}.mdi-action-alarm-add:before{content:"\e609"}.mdi-action-alarm-off:before{content:"\e60a"}.mdi-action-alarm-on:before{content:"\e60b"}.mdi-action-android:before{content:"\e60c"}.mdi-action-announcement:before{content:"\e60d"}.mdi-action-aspect-ratio:before{content:"\e60e"}.mdi-action-assessment:before{content:"\e60f"}.mdi-action-assignment:before{content:"\e610"}.mdi-action-assignment-ind:before{content:"\e611"}.mdi-action-assignment-late:before{content:"\e612"}.mdi-action-assignment-return:before{content:"\e613"}.mdi-action-assignment-returned:before{content:"\e614"}.mdi-action-assignment-turned-in:before{content:"\e615"}.mdi-action-autorenew:before{content:"\e616"}.mdi-action-backup:before{content:"\e617"}.mdi-action-book:before{content:"\e618"}.mdi-action-bookmark:before{content:"\e619"}.mdi-action-bookmark-outline:before{content:"\e61a"}.mdi-action-bug-report:before{content:"\e61b"}.mdi-action-cached:before{content:"\e61c"}.mdi-action-class:before{content:"\e61d"}.mdi-action-credit-card:before{content:"\e61e"}.mdi-action-dashboard:before{content:"\e61f"}.mdi-action-delete:before{content:"\e620"}.mdi-action-description:before{content:"\e621"}.mdi-action-dns:before{content:"\e622"}.mdi-action-done:before{content:"\e623"}.mdi-action-done-all:before{content:"\e624"}.mdi-action-event:before{content:"\e625"}.mdi-action-exit-to-app:before{content:"\e626"}.mdi-action-explore:before{content:"\e627"}.mdi-action-extension:before{content:"\e628"}.mdi-action-face-unlock:before{content:"\e629"}.mdi-action-favorite:before{content:"\e62a"}.mdi-action-favorite-outline:before{content:"\e62b"}.mdi-action-find-in-page:before{content:"\e62c"}.mdi-action-find-replace:before{content:"\e62d"}.mdi-action-flip-to-back:before{content:"\e62e"}.mdi-action-flip-to-front:before{content:"\e62f"}.mdi-action-get-app:before{content:"\e630"}.mdi-action-grade:before{content:"\e631"}.mdi-action-group-work:before{content:"\e632"}.mdi-action-help:before{content:"\e633"}.mdi-action-highlight-remove:before{content:"\e634"}.mdi-action-history:before{content:"\e635"}.mdi-action-home:before{content:"\e636"}.mdi-action-https:before{content:"\e637"}.mdi-action-info:before{content:"\e638"}.mdi-action-info-outline:before{content:"\e639"}.mdi-action-input:before{content:"\e63a"}.mdi-action-invert-colors:before{content:"\e63b"}.mdi-action-label:before{content:"\e63c"}.mdi-action-label-outline:before{content:"\e63d"}.mdi-action-language:before{content:"\e63e"}.mdi-action-launch:before{content:"\e63f"}.mdi-action-list:before{content:"\e640"}.mdi-action-lock:before{content:"\e641"}.mdi-action-lock-open:before{content:"\e642"}.mdi-action-lock-outline:before{content:"\e643"}.mdi-action-loyalty:before{content:"\e644"}.mdi-action-markunread-mailbox:before{content:"\e645"}.mdi-action-note-add:before{content:"\e646"}.mdi-action-open-in-browser:before{content:"\e647"}.mdi-action-open-in-new:before{content:"\e648"}.mdi-action-open-with:before{content:"\e649"}.mdi-action-pageview:before{content:"\e64a"}.mdi-action-payment:before{content:"\e64b"}.mdi-action-perm-camera-mic:before{content:"\e64c"}.mdi-action-perm-contact-cal:before{content:"\e64d"}.mdi-action-perm-data-setting:before{content:"\e64e"}.mdi-action-perm-device-info:before{content:"\e64f"}.mdi-action-perm-identity:before{content:"\e650"}.mdi-action-perm-media:before{content:"\e651"}.mdi-action-perm-phone-msg:before{content:"\e652"}.mdi-action-perm-scan-wifi:before{content:"\e653"}.mdi-action-picture-in-picture:before{content:"\e654"}.mdi-action-polymer:before{content:"\e655"}.mdi-action-print:before{content:"\e656"}.mdi-action-query-builder:before{content:"\e657"}.mdi-action-question-answer:before{content:"\e658"}.mdi-action-receipt:before{content:"\e659"}.mdi-action-redeem:before{content:"\e65a"}.mdi-action-report-problem:before{content:"\e65b"}.mdi-action-restore:before{content:"\e65c"}.mdi-action-room:before{content:"\e65d"}.mdi-action-schedule:before{content:"\e65e"}.mdi-action-search:before{content:"\e65f"}.mdi-action-settings:before{content:"\e660"}.mdi-action-settings-applications:before{content:"\e661"}.mdi-action-settings-backup-restore:before{content:"\e662"}.mdi-action-settings-bluetooth:before{content:"\e663"}.mdi-action-settings-cell:before{content:"\e664"}.mdi-action-settings-display:before{content:"\e665"}.mdi-action-settings-ethernet:before{content:"\e666"}.mdi-action-settings-input-antenna:before{content:"\e667"}.mdi-action-settings-input-component:before{content:"\e668"}.mdi-action-settings-input-composite:before{content:"\e669"}.mdi-action-settings-input-hdmi:before{content:"\e66a"}.mdi-action-settings-input-svideo:before{content:"\e66b"}.mdi-action-settings-overscan:before{content:"\e66c"}.mdi-action-settings-phone:before{content:"\e66d"}.mdi-action-settings-power:before{content:"\e66e"}.mdi-action-settings-remote:before{content:"\e66f"}.mdi-action-settings-voice:before{content:"\e670"}.mdi-action-shop:before{content:"\e671"}.mdi-action-shopping-basket:before{content:"\e672"}.mdi-action-shopping-cart:before{content:"\e673"}.mdi-action-shop-two:before{content:"\e674"}.mdi-action-speaker-notes:before{content:"\e675"}.mdi-action-spellcheck:before{content:"\e676"}.mdi-action-star-rate:before{content:"\e677"}.mdi-action-stars:before{content:"\e678"}.mdi-action-store:before{content:"\e679"}.mdi-action-subject:before{content:"\e67a"}.mdi-action-swap-horiz:before{content:"\e67b"}.mdi-action-swap-vert:before{content:"\e67c"}.mdi-action-swap-vert-circle:before{content:"\e67d"}.mdi-action-system-update-tv:before{content:"\e67e"}.mdi-action-tab:before{content:"\e67f"}.mdi-action-tab-unselected:before{content:"\e680"}.mdi-action-theaters:before{content:"\e681"}.mdi-action-thumb-down:before{content:"\e682"}.mdi-action-thumbs-up-down:before{content:"\e683"}.mdi-action-thumb-up:before{content:"\e684"}.mdi-action-toc:before{content:"\e685"}.mdi-action-today:before{content:"\e686"}.mdi-action-track-changes:before{content:"\e687"}.mdi-action-translate:before{content:"\e688"}.mdi-action-trending-down:before{content:"\e689"}.mdi-action-trending-neutral:before{content:"\e68a"}.mdi-action-trending-up:before{content:"\e68b"}.mdi-action-turned-in:before{content:"\e68c"}.mdi-action-turned-in-not:before{content:"\e68d"}.mdi-action-verified-user:before{content:"\e68e"}.mdi-action-view-agenda:before{content:"\e68f"}.mdi-action-view-array:before{content:"\e690"}.mdi-action-view-carousel:before{content:"\e691"}.mdi-action-view-column:before{content:"\e692"}.mdi-action-view-day:before{content:"\e693"}.mdi-action-view-headline:before{content:"\e694"}.mdi-action-view-list:before{content:"\e695"}.mdi-action-view-module:before{content:"\e696"}.mdi-action-view-quilt:before{content:"\e697"}.mdi-action-view-stream:before{content:"\e698"}.mdi-action-view-week:before{content:"\e699"}.mdi-action-visibility:before{content:"\e69a"}.mdi-action-visibility-off:before{content:"\e69b"}.mdi-action-wallet-giftcard:before{content:"\e69c"}.mdi-action-wallet-membership:before{content:"\e69d"}.mdi-action-wallet-travel:before{content:"\e69e"}.mdi-action-work:before{content:"\e69f"}.mdi-alert-error:before{content:"\e6a0"}.mdi-alert-warning:before{content:"\e6a1"}.mdi-av-album:before{content:"\e6a2"}.mdi-av-timer:before{content:"\e6a3"}.mdi-av-closed-caption:before{content:"\e6a4"}.mdi-av-equalizer:before{content:"\e6a5"}.mdi-av-explicit:before{content:"\e6a6"}.mdi-av-fast-forward:before{content:"\e6a7"}.mdi-av-fast-rewind:before{content:"\e6a8"}.mdi-av-games:before{content:"\e6a9"}.mdi-av-hearing:before{content:"\e6aa"}.mdi-av-high-quality:before{content:"\e6ab"}.mdi-av-loop:before{content:"\e6ac"}.mdi-av-mic:before{content:"\e6ad"}.mdi-av-mic-none:before{content:"\e6ae"}.mdi-av-mic-off:before{content:"\e6af"}.mdi-av-movie:before{content:"\e6b0"}.mdi-av-my-library-add:before{content:"\e6b1"}.mdi-av-my-library-books:before{content:"\e6b2"}.mdi-av-my-library-music:before{content:"\e6b3"}.mdi-av-new-releases:before{content:"\e6b4"}.mdi-av-not-interested:before{content:"\e6b5"}.mdi-av-pause:before{content:"\e6b6"}.mdi-av-pause-circle-fill:before{content:"\e6b7"}.mdi-av-pause-circle-outline:before{content:"\e6b8"}.mdi-av-play-arrow:before{content:"\e6b9"}.mdi-av-play-circle-fill:before{content:"\e6ba"}.mdi-av-play-circle-outline:before{content:"\e6bb"}.mdi-av-playlist-add:before{content:"\e6bc"}.mdi-av-play-shopping-bag:before{content:"\e6bd"}.mdi-av-queue:before{content:"\e6be"}.mdi-av-queue-music:before{content:"\e6bf"}.mdi-av-radio:before{content:"\e6c0"}.mdi-av-recent-actors:before{content:"\e6c1"}.mdi-av-repeat:before{content:"\e6c2"}.mdi-av-repeat-one:before{content:"\e6c3"}.mdi-av-replay:before{content:"\e6c4"}.mdi-av-shuffle:before{content:"\e6c5"}.mdi-av-skip-next:before{content:"\e6c6"}.mdi-av-skip-previous:before{content:"\e6c7"}.mdi-av-snooze:before{content:"\e6c8"}.mdi-av-stop:before{content:"\e6c9"}.mdi-av-subtitles:before{content:"\e6ca"}.mdi-av-surround-sound:before{content:"\e6cb"}.mdi-av-videocam:before{content:"\e6cc"}.mdi-av-videocam-off:before{content:"\e6cd"}.mdi-av-video-collection:before{content:"\e6ce"}.mdi-av-volume-down:before{content:"\e6cf"}.mdi-av-volume-mute:before{content:"\e6d0"}.mdi-av-volume-off:before{content:"\e6d1"}.mdi-av-volume-up:before{content:"\e6d2"}.mdi-av-web:before{content:"\e6d3"}.mdi-communication-business:before{content:"\e6d4"}.mdi-communication-call:before{content:"\e6d5"}.mdi-communication-call-end:before{content:"\e6d6"}.mdi-communication-call-made:before{content:"\e6d7"}.mdi-communication-call-merge:before{content:"\e6d8"}.mdi-communication-call-missed:before{content:"\e6d9"}.mdi-communication-call-received:before{content:"\e6da"}.mdi-communication-call-split:before{content:"\e6db"}.mdi-communication-chat:before{content:"\e6dc"}.mdi-communication-clear-all:before{content:"\e6dd"}.mdi-communication-comment:before{content:"\e6de"}.mdi-communication-contacts:before{content:"\e6df"}.mdi-communication-dialer-sip:before{content:"\e6e0"}.mdi-communication-dialpad:before{content:"\e6e1"}.mdi-communication-dnd-on:before{content:"\e6e2"}.mdi-communication-email:before{content:"\e6e3"}.mdi-communication-forum:before{content:"\e6e4"}.mdi-communication-import-export:before{content:"\e6e5"}.mdi-communication-invert-colors-off:before{content:"\e6e6"}.mdi-communication-invert-colors-on:before{content:"\e6e7"}.mdi-communication-live-help:before{content:"\e6e8"}.mdi-communication-location-off:before{content:"\e6e9"}.mdi-communication-location-on:before{content:"\e6ea"}.mdi-communication-message:before{content:"\e6eb"}.mdi-communication-messenger:before{content:"\e6ec"}.mdi-communication-no-sim:before{content:"\e6ed"}.mdi-communication-phone:before{content:"\e6ee"}.mdi-communication-portable-wifi-off:before{content:"\e6ef"}.mdi-communication-quick-contacts-dialer:before{content:"\e6f0"}.mdi-communication-quick-contacts-mail:before{content:"\e6f1"}.mdi-communication-ring-volume:before{content:"\e6f2"}.mdi-communication-stay-current-landscape:before{content:"\e6f3"}.mdi-communication-stay-current-portrait:before{content:"\e6f4"}.mdi-communication-stay-primary-landscape:before{content:"\e6f5"}.mdi-communication-stay-primary-portrait:before{content:"\e6f6"}.mdi-communication-swap-calls:before{content:"\e6f7"}.mdi-communication-textsms:before{content:"\e6f8"}.mdi-communication-voicemail:before{content:"\e6f9"}.mdi-communication-vpn-key:before{content:"\e6fa"}.mdi-content-add:before{content:"\e6fb"}.mdi-content-add-box:before{content:"\e6fc"}.mdi-content-add-circle:before{content:"\e6fd"}.mdi-content-add-circle-outline:before{content:"\e6fe"}.mdi-content-archive:before{content:"\e6ff"}.mdi-content-backspace:before{content:"\e700"}.mdi-content-block:before{content:"\e701"}.mdi-content-clear:before{content:"\e702"}.mdi-content-content-copy:before{content:"\e703"}.mdi-content-content-cut:before{content:"\e704"}.mdi-content-content-paste:before{content:"\e705"}.mdi-content-create:before{content:"\e706"}.mdi-content-drafts:before{content:"\e707"}.mdi-content-filter-list:before{content:"\e708"}.mdi-content-flag:before{content:"\e709"}.mdi-content-forward:before{content:"\e70a"}.mdi-content-gesture:before{content:"\e70b"}.mdi-content-inbox:before{content:"\e70c"}.mdi-content-link:before{content:"\e70d"}.mdi-content-mail:before{content:"\e70e"}.mdi-content-markunread:before{content:"\e70f"}.mdi-content-redo:before{content:"\e710"}.mdi-content-remove:before{content:"\e711"}.mdi-content-remove-circle:before{content:"\e712"}.mdi-content-remove-circle-outline:before{content:"\e713"}.mdi-content-reply:before{content:"\e714"}.mdi-content-reply-all:before{content:"\e715"}.mdi-content-report:before{content:"\e716"}.mdi-content-save:before{content:"\e717"}.mdi-content-select-all:before{content:"\e718"}.mdi-content-send:before{content:"\e719"}.mdi-content-sort:before{content:"\e71a"}.mdi-content-text-format:before{content:"\e71b"}.mdi-content-undo:before{content:"\e71c"}.mdi-device-access-alarm:before{content:"\e71d"}.mdi-device-access-alarms:before{content:"\e71e"}.mdi-device-access-time:before{content:"\e71f"}.mdi-device-add-alarm:before{content:"\e720"}.mdi-device-airplanemode-off:before{content:"\e721"}.mdi-device-airplanemode-on:before{content:"\e722"}.mdi-device-battery-20:before{content:"\e723"}.mdi-device-battery-30:before{content:"\e724"}.mdi-device-battery-50:before{content:"\e725"}.mdi-device-battery-60:before{content:"\e726"}.mdi-device-battery-80:before{content:"\e727"}.mdi-device-battery-90:before{content:"\e728"}.mdi-device-battery-alert:before{content:"\e729"}.mdi-device-battery-charging-20:before{content:"\e72a"}.mdi-device-battery-charging-30:before{content:"\e72b"}.mdi-device-battery-charging-50:before{content:"\e72c"}.mdi-device-battery-charging-60:before{content:"\e72d"}.mdi-device-battery-charging-80:before{content:"\e72e"}.mdi-device-battery-charging-90:before{content:"\e72f"}.mdi-device-battery-charging-full:before{content:"\e730"}.mdi-device-battery-full:before{content:"\e731"}.mdi-device-battery-std:before{content:"\e732"}.mdi-device-battery-unknown:before{content:"\e733"}.mdi-device-bluetooth:before{content:"\e734"}.mdi-device-bluetooth-connected:before{content:"\e735"}.mdi-device-bluetooth-disabled:before{content:"\e736"}.mdi-device-bluetooth-searching:before{content:"\e737"}.mdi-device-brightness-auto:before{content:"\e738"}.mdi-device-brightness-high:before{content:"\e739"}.mdi-device-brightness-low:before{content:"\e73a"}.mdi-device-brightness-medium:before{content:"\e73b"}.mdi-device-data-usage:before{content:"\e73c"}.mdi-device-developer-mode:before{content:"\e73d"}.mdi-device-devices:before{content:"\e73e"}.mdi-device-dvr:before{content:"\e73f"}.mdi-device-gps-fixed:before{content:"\e740"}.mdi-device-gps-not-fixed:before{content:"\e741"}.mdi-device-gps-off:before{content:"\e742"}.mdi-device-location-disabled:before{content:"\e743"}.mdi-device-location-searching:before{content:"\e744"}.mdi-device-multitrack-audio:before{content:"\e745"}.mdi-device-network-cell:before{content:"\e746"}.mdi-device-network-wifi:before{content:"\e747"}.mdi-device-nfc:before{content:"\e748"}.mdi-device-now-wallpaper:before{content:"\e749"}.mdi-device-now-widgets:before{content:"\e74a"}.mdi-device-screen-lock-landscape:before{content:"\e74b"}.mdi-device-screen-lock-portrait:before{content:"\e74c"}.mdi-device-screen-lock-rotation:before{content:"\e74d"}.mdi-device-screen-rotation:before{content:"\e74e"}.mdi-device-sd-storage:before{content:"\e74f"}.mdi-device-settings-system-daydream:before{content:"\e750"}.mdi-device-signal-cellular-0-bar:before{content:"\e751"}.mdi-device-signal-cellular-1-bar:before{content:"\e752"}.mdi-device-signal-cellular-2-bar:before{content:"\e753"}.mdi-device-signal-cellular-3-bar:before{content:"\e754"}.mdi-device-signal-cellular-4-bar:before{content:"\e755"}.mdi-device-signal-cellular-connected-no-internet-0-bar:before{content:"\e756"}.mdi-device-signal-cellular-connected-no-internet-1-bar:before{content:"\e757"}.mdi-device-signal-cellular-connected-no-internet-2-bar:before{content:"\e758"}.mdi-device-signal-cellular-connected-no-internet-3-bar:before{content:"\e759"}.mdi-device-signal-cellular-connected-no-internet-4-bar:before{content:"\e75a"}.mdi-device-signal-cellular-no-sim:before{content:"\e75b"}.mdi-device-signal-cellular-null:before{content:"\e75c"}.mdi-device-signal-cellular-off:before{content:"\e75d"}.mdi-device-signal-wifi-0-bar:before{content:"\e75e"}.mdi-device-signal-wifi-1-bar:before{content:"\e75f"}.mdi-device-signal-wifi-2-bar:before{content:"\e760"}.mdi-device-signal-wifi-3-bar:before{content:"\e761"}.mdi-device-signal-wifi-4-bar:before{content:"\e762"}.mdi-device-signal-wifi-off:before{content:"\e763"}.mdi-device-storage:before{content:"\e764"}.mdi-device-usb:before{content:"\e765"}.mdi-device-wifi-lock:before{content:"\e766"}.mdi-device-wifi-tethering:before{content:"\e767"}.mdi-editor-attach-file:before{content:"\e768"}.mdi-editor-attach-money:before{content:"\e769"}.mdi-editor-border-all:before{content:"\e76a"}.mdi-editor-border-bottom:before{content:"\e76b"}.mdi-editor-border-clear:before{content:"\e76c"}.mdi-editor-border-color:before{content:"\e76d"}.mdi-editor-border-horizontal:before{content:"\e76e"}.mdi-editor-border-inner:before{content:"\e76f"}.mdi-editor-border-left:before{content:"\e770"}.mdi-editor-border-outer:before{content:"\e771"}.mdi-editor-border-right:before{content:"\e772"}.mdi-editor-border-style:before{content:"\e773"}.mdi-editor-border-top:before{content:"\e774"}.mdi-editor-border-vertical:before{content:"\e775"}.mdi-editor-format-align-center:before{content:"\e776"}.mdi-editor-format-align-justify:before{content:"\e777"}.mdi-editor-format-align-left:before{content:"\e778"}.mdi-editor-format-align-right:before{content:"\e779"}.mdi-editor-format-bold:before{content:"\e77a"}.mdi-editor-format-clear:before{content:"\e77b"}.mdi-editor-format-color-fill:before{content:"\e77c"}.mdi-editor-format-color-reset:before{content:"\e77d"}.mdi-editor-format-color-text:before{content:"\e77e"}.mdi-editor-format-indent-decrease:before{content:"\e77f"}.mdi-editor-format-indent-increase:before{content:"\e780"}.mdi-editor-format-italic:before{content:"\e781"}.mdi-editor-format-line-spacing:before{content:"\e782"}.mdi-editor-format-list-bulleted:before{content:"\e783"}.mdi-editor-format-list-numbered:before{content:"\e784"}.mdi-editor-format-paint:before{content:"\e785"}.mdi-editor-format-quote:before{content:"\e786"}.mdi-editor-format-size:before{content:"\e787"}.mdi-editor-format-strikethrough:before{content:"\e788"}.mdi-editor-functions:before{content:"\e789"}.mdi-editor-format-textdirection-l-to-r:before{content:"\e78a"}.mdi-editor-format-underline:before{content:"\e78b"}.mdi-editor-format-textdirection-r-to-l:before{content:"\e78c"}.mdi-editor-insert-chart:before{content:"\e78d"}.mdi-editor-insert-comment:before{content:"\e78e"}.mdi-editor-insert-drive-file:before{content:"\e78f"}.mdi-editor-insert-emoticon:before{content:"\e790"}.mdi-editor-insert-invitation:before{content:"\e791"}.mdi-editor-insert-link:before{content:"\e792"}.mdi-editor-insert-photo:before{content:"\e793"}.mdi-editor-merge-type:before{content:"\e794"}.mdi-editor-mode-comment:before{content:"\e795"}.mdi-editor-mode-edit:before{content:"\e796"}.mdi-editor-publish:before{content:"\e797"}.mdi-editor-vertical-align-bottom:before{content:"\e798"}.mdi-editor-vertical-align-center:before{content:"\e799"}.mdi-editor-vertical-align-top:before{content:"\e79a"}.mdi-editor-wrap-text:before{content:"\e79b"}.mdi-file-attachment:before{content:"\e79c"}.mdi-file-cloud:before{content:"\e79d"}.mdi-file-cloud-circle:before{content:"\e79e"}.mdi-file-cloud-done:before{content:"\e79f"}.mdi-file-cloud-download:before{content:"\e7a0"}.mdi-file-cloud-off:before{content:"\e7a1"}.mdi-file-cloud-queue:before{content:"\e7a2"}.mdi-file-cloud-upload:before{content:"\e7a3"}.mdi-file-file-download:before{content:"\e7a4"}.mdi-file-file-upload:before{content:"\e7a5"}.mdi-file-folder:before{content:"\e7a6"}.mdi-file-folder-open:before{content:"\e7a7"}.mdi-file-folder-shared:before{content:"\e7a8"}.mdi-hardware-cast:before{content:"\e7a9"}.mdi-hardware-cast-connected:before{content:"\e7aa"}.mdi-hardware-computer:before{content:"\e7ab"}.mdi-hardware-desktop-mac:before{content:"\e7ac"}.mdi-hardware-desktop-windows:before{content:"\e7ad"}.mdi-hardware-dock:before{content:"\e7ae"}.mdi-hardware-gamepad:before{content:"\e7af"}.mdi-hardware-headset:before{content:"\e7b0"}.mdi-hardware-headset-mic:before{content:"\e7b1"}.mdi-hardware-keyboard:before{content:"\e7b2"}.mdi-hardware-keyboard-alt:before{content:"\e7b3"}.mdi-hardware-keyboard-arrow-down:before{content:"\e7b4"}.mdi-hardware-keyboard-arrow-left:before{content:"\e7b5"}.mdi-hardware-keyboard-arrow-right:before{content:"\e7b6"}.mdi-hardware-keyboard-arrow-up:before{content:"\e7b7"}.mdi-hardware-keyboard-backspace:before{content:"\e7b8"}.mdi-hardware-keyboard-capslock:before{content:"\e7b9"}.mdi-hardware-keyboard-control:before{content:"\e7ba"}.mdi-hardware-keyboard-hide:before{content:"\e7bb"}.mdi-hardware-keyboard-return:before{content:"\e7bc"}.mdi-hardware-keyboard-tab:before{content:"\e7bd"}.mdi-hardware-keyboard-voice:before{content:"\e7be"}.mdi-hardware-laptop:before{content:"\e7bf"}.mdi-hardware-laptop-chromebook:before{content:"\e7c0"}.mdi-hardware-laptop-mac:before{content:"\e7c1"}.mdi-hardware-laptop-windows:before{content:"\e7c2"}.mdi-hardware-memory:before{content:"\e7c3"}.mdi-hardware-mouse:before{content:"\e7c4"}.mdi-hardware-phone-android:before{content:"\e7c5"}.mdi-hardware-phone-iphone:before{content:"\e7c6"}.mdi-hardware-phonelink:before{content:"\e7c7"}.mdi-hardware-phonelink-off:before{content:"\e7c8"}.mdi-hardware-security:before{content:"\e7c9"}.mdi-hardware-sim-card:before{content:"\e7ca"}.mdi-hardware-smartphone:before{content:"\e7cb"}.mdi-hardware-speaker:before{content:"\e7cc"}.mdi-hardware-tablet:before{content:"\e7cd"}.mdi-hardware-tablet-android:before{content:"\e7ce"}.mdi-hardware-tablet-mac:before{content:"\e7cf"}.mdi-hardware-tv:before{content:"\e7d0"}.mdi-hardware-watch:before{content:"\e7d1"}.mdi-image-add-to-photos:before{content:"\e7d2"}.mdi-image-adjust:before{content:"\e7d3"}.mdi-image-assistant-photo:before{content:"\e7d4"}.mdi-image-audiotrack:before{content:"\e7d5"}.mdi-image-blur-circular:before{content:"\e7d6"}.mdi-image-blur-linear:before{content:"\e7d7"}.mdi-image-blur-off:before{content:"\e7d8"}.mdi-image-blur-on:before{content:"\e7d9"}.mdi-image-brightness-1:before{content:"\e7da"}.mdi-image-brightness-2:before{content:"\e7db"}.mdi-image-brightness-3:before{content:"\e7dc"}.mdi-image-brightness-4:before{content:"\e7dd"}.mdi-image-brightness-5:before{content:"\e7de"}.mdi-image-brightness-6:before{content:"\e7df"}.mdi-image-brightness-7:before{content:"\e7e0"}.mdi-image-brush:before{content:"\e7e1"}.mdi-image-camera:before{content:"\e7e2"}.mdi-image-camera-alt:before{content:"\e7e3"}.mdi-image-camera-front:before{content:"\e7e4"}.mdi-image-camera-rear:before{content:"\e7e5"}.mdi-image-camera-roll:before{content:"\e7e6"}.mdi-image-center-focus-strong:before{content:"\e7e7"}.mdi-image-center-focus-weak:before{content:"\e7e8"}.mdi-image-collections:before{content:"\e7e9"}.mdi-image-colorize:before{content:"\e7ea"}.mdi-image-color-lens:before{content:"\e7eb"}.mdi-image-compare:before{content:"\e7ec"}.mdi-image-control-point:before{content:"\e7ed"}.mdi-image-control-point-duplicate:before{content:"\e7ee"}.mdi-image-crop:before{content:"\e7ef"}.mdi-image-crop-3-2:before{content:"\e7f0"}.mdi-image-crop-5-4:before{content:"\e7f1"}.mdi-image-crop-7-5:before{content:"\e7f2"}.mdi-image-crop-16-9:before{content:"\e7f3"}.mdi-image-crop-din:before{content:"\e7f4"}.mdi-image-crop-free:before{content:"\e7f5"}.mdi-image-crop-landscape:before{content:"\e7f6"}.mdi-image-crop-original:before{content:"\e7f7"}.mdi-image-crop-portrait:before{content:"\e7f8"}.mdi-image-crop-square:before{content:"\e7f9"}.mdi-image-dehaze:before{content:"\e7fa"}.mdi-image-details:before{content:"\e7fb"}.mdi-image-edit:before{content:"\e7fc"}.mdi-image-exposure:before{content:"\e7fd"}.mdi-image-exposure-minus-1:before{content:"\e7fe"}.mdi-image-exposure-minus-2:before{content:"\e7ff"}.mdi-image-exposure-plus-1:before{content:"\e800"}.mdi-image-exposure-plus-2:before{content:"\e801"}.mdi-image-exposure-zero:before{content:"\e802"}.mdi-image-filter:before{content:"\e803"}.mdi-image-filter-1:before{content:"\e804"}.mdi-image-filter-2:before{content:"\e805"}.mdi-image-filter-3:before{content:"\e806"}.mdi-image-filter-4:before{content:"\e807"}.mdi-image-filter-5:before{content:"\e808"}.mdi-image-filter-6:before{content:"\e809"}.mdi-image-filter-7:before{content:"\e80a"}.mdi-image-filter-8:before{content:"\e80b"}.mdi-image-filter-9:before{content:"\e80c"}.mdi-image-filter-9-plus:before{content:"\e80d"}.mdi-image-filter-b-and-w:before{content:"\e80e"}.mdi-image-filter-center-focus:before{content:"\e80f"}.mdi-image-filter-drama:before{content:"\e810"}.mdi-image-filter-frames:before{content:"\e811"}.mdi-image-filter-hdr:before{content:"\e812"}.mdi-image-filter-none:before{content:"\e813"}.mdi-image-filter-tilt-shift:before{content:"\e814"}.mdi-image-filter-vintage:before{content:"\e815"}.mdi-image-flare:before{content:"\e816"}.mdi-image-flash-auto:before{content:"\e817"}.mdi-image-flash-off:before{content:"\e818"}.mdi-image-flash-on:before{content:"\e819"}.mdi-image-flip:before{content:"\e81a"}.mdi-image-gradient:before{content:"\e81b"}.mdi-image-grain:before{content:"\e81c"}.mdi-image-grid-off:before{content:"\e81d"}.mdi-image-grid-on:before{content:"\e81e"}.mdi-image-hdr-off:before{content:"\e81f"}.mdi-image-hdr-on:before{content:"\e820"}.mdi-image-hdr-strong:before{content:"\e821"}.mdi-image-hdr-weak:before{content:"\e822"}.mdi-image-healing:before{content:"\e823"}.mdi-image-image:before{content:"\e824"}.mdi-image-image-aspect-ratio:before{content:"\e825"}.mdi-image-iso:before{content:"\e826"}.mdi-image-landscape:before{content:"\e827"}.mdi-image-leak-add:before{content:"\e828"}.mdi-image-leak-remove:before{content:"\e829"}.mdi-image-lens:before{content:"\e82a"}.mdi-image-looks:before{content:"\e82b"}.mdi-image-looks-3:before{content:"\e82c"}.mdi-image-looks-4:before{content:"\e82d"}.mdi-image-looks-5:before{content:"\e82e"}.mdi-image-looks-6:before{content:"\e82f"}.mdi-image-looks-one:before{content:"\e830"}.mdi-image-looks-two:before{content:"\e831"}.mdi-image-loupe:before{content:"\e832"}.mdi-image-movie-creation:before{content:"\e833"}.mdi-image-nature:before{content:"\e834"}.mdi-image-nature-people:before{content:"\e835"}.mdi-image-navigate-before:before{content:"\e836"}.mdi-image-navigate-next:before{content:"\e837"}.mdi-image-palette:before{content:"\e838"}.mdi-image-panorama:before{content:"\e839"}.mdi-image-panorama-fisheye:before{content:"\e83a"}.mdi-image-panorama-horizontal:before{content:"\e83b"}.mdi-image-panorama-vertical:before{content:"\e83c"}.mdi-image-panorama-wide-angle:before{content:"\e83d"}.mdi-image-photo:before{content:"\e83e"}.mdi-image-photo-album:before{content:"\e83f"}.mdi-image-photo-camera:before{content:"\e840"}.mdi-image-photo-library:before{content:"\e841"}.mdi-image-portrait:before{content:"\e842"}.mdi-image-remove-red-eye:before{content:"\e843"}.mdi-image-rotate-left:before{content:"\e844"}.mdi-image-rotate-right:before{content:"\e845"}.mdi-image-slideshow:before{content:"\e846"}.mdi-image-straighten:before{content:"\e847"}.mdi-image-style:before{content:"\e848"}.mdi-image-switch-camera:before{content:"\e849"}.mdi-image-switch-video:before{content:"\e84a"}.mdi-image-tag-faces:before{content:"\e84b"}.mdi-image-texture:before{content:"\e84c"}.mdi-image-timelapse:before{content:"\e84d"}.mdi-image-timer:before{content:"\e84e"}.mdi-image-timer-3:before{content:"\e84f"}.mdi-image-timer-10:before{content:"\e850"}.mdi-image-timer-auto:before{content:"\e851"}.mdi-image-timer-off:before{content:"\e852"}.mdi-image-tonality:before{content:"\e853"}.mdi-image-transform:before{content:"\e854"}.mdi-image-tune:before{content:"\e855"}.mdi-image-wb-auto:before{content:"\e856"}.mdi-image-wb-cloudy:before{content:"\e857"}.mdi-image-wb-incandescent:before{content:"\e858"}.mdi-image-wb-irradescent:before{content:"\e859"}.mdi-image-wb-sunny:before{content:"\e85a"}.mdi-maps-beenhere:before{content:"\e85b"}.mdi-maps-directions:before{content:"\e85c"}.mdi-maps-directions-bike:before{content:"\e85d"}.mdi-maps-directions-bus:before{content:"\e85e"}.mdi-maps-directions-car:before{content:"\e85f"}.mdi-maps-directions-ferry:before{content:"\e860"}.mdi-maps-directions-subway:before{content:"\e861"}.mdi-maps-directions-train:before{content:"\e862"}.mdi-maps-directions-transit:before{content:"\e863"}.mdi-maps-directions-walk:before{content:"\e864"}.mdi-maps-flight:before{content:"\e865"}.mdi-maps-hotel:before{content:"\e866"}.mdi-maps-layers:before{content:"\e867"}.mdi-maps-layers-clear:before{content:"\e868"}.mdi-maps-local-airport:before{content:"\e869"}.mdi-maps-local-atm:before{content:"\e86a"}.mdi-maps-local-attraction:before{content:"\e86b"}.mdi-maps-local-bar:before{content:"\e86c"}.mdi-maps-local-cafe:before{content:"\e86d"}.mdi-maps-local-car-wash:before{content:"\e86e"}.mdi-maps-local-convenience-store:before{content:"\e86f"}.mdi-maps-local-drink:before{content:"\e870"}.mdi-maps-local-florist:before{content:"\e871"}.mdi-maps-local-gas-station:before{content:"\e872"}.mdi-maps-local-grocery-store:before{content:"\e873"}.mdi-maps-local-hospital:before{content:"\e874"}.mdi-maps-local-hotel:before{content:"\e875"}.mdi-maps-local-laundry-service:before{content:"\e876"}.mdi-maps-local-library:before{content:"\e877"}.mdi-maps-local-mall:before{content:"\e878"}.mdi-maps-local-movies:before{content:"\e879"}.mdi-maps-local-offer:before{content:"\e87a"}.mdi-maps-local-parking:before{content:"\e87b"}.mdi-maps-local-pharmacy:before{content:"\e87c"}.mdi-maps-local-phone:before{content:"\e87d"}.mdi-maps-local-pizza:before{content:"\e87e"}.mdi-maps-local-play:before{content:"\e87f"}.mdi-maps-local-post-office:before{content:"\e880"}.mdi-maps-local-print-shop:before{content:"\e881"}.mdi-maps-local-restaurant:before{content:"\e882"}.mdi-maps-local-see:before{content:"\e883"}.mdi-maps-local-shipping:before{content:"\e884"}.mdi-maps-local-taxi:before{content:"\e885"}.mdi-maps-location-history:before{content:"\e886"}.mdi-maps-map:before{content:"\e887"}.mdi-maps-my-location:before{content:"\e888"}.mdi-maps-navigation:before{content:"\e889"}.mdi-maps-pin-drop:before{content:"\e88a"}.mdi-maps-place:before{content:"\e88b"}.mdi-maps-rate-review:before{content:"\e88c"}.mdi-maps-restaurant-menu:before{content:"\e88d"}.mdi-maps-satellite:before{content:"\e88e"}.mdi-maps-store-mall-directory:before{content:"\e88f"}.mdi-maps-terrain:before{content:"\e890"}.mdi-maps-traffic:before{content:"\e891"}.mdi-navigation-apps:before{content:"\e892"}.mdi-navigation-arrow-back:before{content:"\e893"}.mdi-navigation-arrow-drop-down:before{content:"\e894"}.mdi-navigation-arrow-drop-down-circle:before{content:"\e895"}.mdi-navigation-arrow-drop-up:before{content:"\e896"}.mdi-navigation-arrow-forward:before{content:"\e897"}.mdi-navigation-cancel:before{content:"\e898"}.mdi-navigation-check:before{content:"\e899"}.mdi-navigation-chevron-left:before{content:"\e89a"}.mdi-navigation-chevron-right:before{content:"\e89b"}.mdi-navigation-close:before{content:"\e89c"}.mdi-navigation-expand-less:before{content:"\e89d"}.mdi-navigation-expand-more:before{content:"\e89e"}.mdi-navigation-fullscreen:before{content:"\e89f"}.mdi-navigation-fullscreen-exit:before{content:"\e8a0"}.mdi-navigation-menu:before{content:"\e8a1"}.mdi-navigation-more-horiz:before{content:"\e8a2"}.mdi-navigation-more-vert:before{content:"\e8a3"}.mdi-navigation-refresh:before{content:"\e8a4"}.mdi-navigation-unfold-less:before{content:"\e8a5"}.mdi-navigation-unfold-more:before{content:"\e8a6"}.mdi-notification-adb:before{content:"\e8a7"}.mdi-notification-bluetooth-audio:before{content:"\e8a8"}.mdi-notification-disc-full:before{content:"\e8a9"}.mdi-notification-dnd-forwardslash:before{content:"\e8aa"}.mdi-notification-do-not-disturb:before{content:"\e8ab"}.mdi-notification-drive-eta:before{content:"\e8ac"}.mdi-notification-event-available:before{content:"\e8ad"}.mdi-notification-event-busy:before{content:"\e8ae"}.mdi-notification-event-note:before{content:"\e8af"}.mdi-notification-folder-special:before{content:"\e8b0"}.mdi-notification-mms:before{content:"\e8b1"}.mdi-notification-more:before{content:"\e8b2"}.mdi-notification-network-locked:before{content:"\e8b3"}.mdi-notification-phone-bluetooth-speaker:before{content:"\e8b4"}.mdi-notification-phone-forwarded:before{content:"\e8b5"}.mdi-notification-phone-in-talk:before{content:"\e8b6"}.mdi-notification-phone-locked:before{content:"\e8b7"}.mdi-notification-phone-missed:before{content:"\e8b8"}.mdi-notification-phone-paused:before{content:"\e8b9"}.mdi-notification-play-download:before{content:"\e8ba"}.mdi-notification-play-install:before{content:"\e8bb"}.mdi-notification-sd-card:before{content:"\e8bc"}.mdi-notification-sim-card-alert:before{content:"\e8bd"}.mdi-notification-sms:before{content:"\e8be"}.mdi-notification-sms-failed:before{content:"\e8bf"}.mdi-notification-sync:before{content:"\e8c0"}.mdi-notification-sync-disabled:before{content:"\e8c1"}.mdi-notification-sync-problem:before{content:"\e8c2"}.mdi-notification-system-update:before{content:"\e8c3"}.mdi-notification-tap-and-play:before{content:"\e8c4"}.mdi-notification-time-to-leave:before{content:"\e8c5"}.mdi-notification-vibration:before{content:"\e8c6"}.mdi-notification-voice-chat:before{content:"\e8c7"}.mdi-notification-vpn-lock:before{content:"\e8c8"}.mdi-social-cake:before{content:"\e8c9"}.mdi-social-domain:before{content:"\e8ca"}.mdi-social-group:before{content:"\e8cb"}.mdi-social-group-add:before{content:"\e8cc"}.mdi-social-location-city:before{content:"\e8cd"}.mdi-social-mood:before{content:"\e8ce"}.mdi-social-notifications:before{content:"\e8cf"}.mdi-social-notifications-none:before{content:"\e8d0"}.mdi-social-notifications-off:before{content:"\e8d1"}.mdi-social-notifications-on:before{content:"\e8d2"}.mdi-social-notifications-paused:before{content:"\e8d3"}.mdi-social-pages:before{content:"\e8d4"}.mdi-social-party-mode:before{content:"\e8d5"}.mdi-social-people:before{content:"\e8d6"}.mdi-social-people-outline:before{content:"\e8d7"}.mdi-social-person:before{content:"\e8d8"}.mdi-social-person-add:before{content:"\e8d9"}.mdi-social-person-outline:before{content:"\e8da"}.mdi-social-plus-one:before{content:"\e8db"}.mdi-social-poll:before{content:"\e8dc"}.mdi-social-public:before{content:"\e8dd"}.mdi-social-school:before{content:"\e8de"}.mdi-social-share:before{content:"\e8df"}.mdi-social-whatshot:before{content:"\e8e0"}.mdi-toggle-check-box:before{content:"\e8e1"}.mdi-toggle-check-box-outline-blank:before{content:"\e8e2"}.mdi-toggle-radio-button-off:before{content:"\e8e3"}.mdi-toggle-radio-button-on:before{content:"\e8e4"}.container{padding:0 1.5rem;margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width : 601px){.container{width:85%}}@media only screen and (min-width : 993px){.container{width:70%}}.container .row{margin-left:-0.75rem;margin-right:-0.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 0.75rem}.row .col.s1{width:8.33333%;margin-left:0}.row .col.s2{width:16.66667%;margin-left:0}.row .col.s3{width:25%;margin-left:0}.row .col.s4{width:33.33333%;margin-left:0}.row .col.s5{width:41.66667%;margin-left:0}.row .col.s6{width:50%;margin-left:0}.row .col.s7{width:58.33333%;margin-left:0}.row .col.s8{width:66.66667%;margin-left:0}.row .col.s9{width:75%;margin-left:0}.row .col.s10{width:83.33333%;margin-left:0}.row .col.s11{width:91.66667%;margin-left:0}.row .col.s12{width:100%;margin-left:0}.row .col.offset-s1{margin-left:8.33333%}.row .col.offset-s2{margin-left:16.66667%}.row .col.offset-s3{margin-left:25%}.row .col.offset-s4{margin-left:33.33333%}.row .col.offset-s5{margin-left:41.66667%}.row .col.offset-s6{margin-left:50%}.row .col.offset-s7{margin-left:58.33333%}.row .col.offset-s8{margin-left:66.66667%}.row .col.offset-s9{margin-left:75%}.row .col.offset-s10{margin-left:83.33333%}.row .col.offset-s11{margin-left:91.66667%}.row .col.offset-s12{margin-left:100%}@media only screen and (min-width : 601px){.row .col.m1{width:8.33333%;margin-left:0}.row .col.m2{width:16.66667%;margin-left:0}.row .col.m3{width:25%;margin-left:0}.row .col.m4{width:33.33333%;margin-left:0}.row .col.m5{width:41.66667%;margin-left:0}.row .col.m6{width:50%;margin-left:0}.row .col.m7{width:58.33333%;margin-left:0}.row .col.m8{width:66.66667%;margin-left:0}.row .col.m9{width:75%;margin-left:0}.row .col.m10{width:83.33333%;margin-left:0}.row .col.m11{width:91.66667%;margin-left:0}.row .col.m12{width:100%;margin-left:0}.row .col.offset-m1{margin-left:8.33333%}.row .col.offset-m2{margin-left:16.66667%}.row .col.offset-m3{margin-left:25%}.row .col.offset-m4{margin-left:33.33333%}.row .col.offset-m5{margin-left:41.66667%}.row .col.offset-m6{margin-left:50%}.row .col.offset-m7{margin-left:58.33333%}.row .col.offset-m8{margin-left:66.66667%}.row .col.offset-m9{margin-left:75%}.row .col.offset-m10{margin-left:83.33333%}.row .col.offset-m11{margin-left:91.66667%}.row .col.offset-m12{margin-left:100%}}@media only screen and (min-width : 993px){.row .col.l1{width:8.33333%;margin-left:0}.row .col.l2{width:16.66667%;margin-left:0}.row .col.l3{width:25%;margin-left:0}.row .col.l4{width:33.33333%;margin-left:0}.row .col.l5{width:41.66667%;margin-left:0}.row .col.l6{width:50%;margin-left:0}.row .col.l7{width:58.33333%;margin-left:0}.row .col.l8{width:66.66667%;margin-left:0}.row .col.l9{width:75%;margin-left:0}.row .col.l10{width:83.33333%;margin-left:0}.row .col.l11{width:91.66667%;margin-left:0}.row .col.l12{width:100%;margin-left:0}.row .col.offset-l1{margin-left:8.33333%}.row .col.offset-l2{margin-left:16.66667%}.row .col.offset-l3{margin-left:25%}.row .col.offset-l4{margin-left:33.33333%}.row .col.offset-l5{margin-left:41.66667%}.row .col.offset-l6{margin-left:50%}.row .col.offset-l7{margin-left:58.33333%}.row .col.offset-l8{margin-left:66.66667%}.row .col.offset-l9{margin-left:75%}.row .col.offset-l10{margin-left:83.33333%}.row .col.offset-l11{margin-left:91.66667%}.row .col.offset-l12{margin-left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav a{color:#fff}nav .nav-wrapper{position:relative;height:100%}nav .nav-wrapper i{display:block;font-size:2rem}@media only screen and (min-width : 993px){nav a.button-collapse{display:none}}nav .button-collapse{float:left;position:relative;z-index:1;height:56px}nav .button-collapse i{font-size:2.7rem;height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width : 992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);}}nav .brand-logo.right{right:0.5rem;padding:0}nav ul{margin:0}nav ul li{-webkit-transition:background-color .3s;-moz-transition:background-color .3s;-o-transition:background-color .3s;-ms-transition:background-color .3s;transition:background-color .3s;float:left;padding:0}nav ul li:hover,nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{font-size:1rem;color:#fff;display:block;padding:0 15px}nav ul.left{float:left}nav .input-field{margin:0}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);-webkit-transition:color .3s;-moz-transition:color .3s;-o-transition:color .3s;-ms-transition:color .3s;transition:color .3s}nav .input-field label.active i{color:#fff}nav .input-field label.active{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}.navbar-fixed{position:relative;height:56px;z-index:998}.navbar-fixed nav{position:fixed}@media only screen and (min-width : 601px){nav,nav .nav-wrapper i,nav a.button-collapse,nav a.button-collapse i{height:64px;line-height:64px}.navbar-fixed{height:64px}}@font-face{font-family:"Roboto";src:url("../font/roboto/Roboto-Thin.woff2") format("woff2"),url("../font/roboto/Roboto-Thin.woff") format("woff"),url("../font/roboto/Roboto-Thin.ttf") format("truetype");font-weight:200;}@font-face{font-family:"Roboto";src:url("../font/roboto/Roboto-Light.woff2") format("woff2"),url("../font/roboto/Roboto-Light.woff") format("woff"),url("../font/roboto/Roboto-Light.ttf") format("truetype");font-weight:300;}@font-face{font-family:"Roboto";src:url("../font/roboto/Roboto-Regular.woff2") format("woff2"),url("../font/roboto/Roboto-Regular.woff") format("woff"),url("../font/roboto/Roboto-Regular.ttf") format("truetype");font-weight:400;}@font-face{font-family:"Roboto";src:url("../font/roboto/Roboto-Medium.woff2") format("woff2"),url("../font/roboto/Roboto-Medium.woff") format("woff"),url("../font/roboto/Roboto-Medium.ttf") format("truetype");font-weight:500;}@font-face{font-family:"Roboto";src:url("../font/roboto/Roboto-Bold.woff2") format("woff2"),url("../font/roboto/Roboto-Bold.woff") format("woff"),url("../font/roboto/Roboto-Bold.ttf") format("truetype");font-weight:700;}a{text-decoration:none}html{line-height:1.5;font-family:"Roboto", sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px;}}@media only screen and (min-width: 992px){html{font-size:14.5px;}}@media only screen and (min-width: 1200px){html{font-size:15px;}}h1,h2,h3,h4,h5,h6{font-weight:400}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:4.62rem;margin:2.1rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:3.916rem;margin:1.78rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:3.212rem;margin:1.46rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:2.508rem;margin:1.14rem 0 0.912rem 0}h5{font-size:1.64rem;line-height:1.804rem;margin:0.82rem 0 0.656rem 0}h6{font-size:1rem;line-height:1.1rem;margin:0.5rem 0 0.4rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light,footer.page-footer .footer-copyright{font-weight:300}.thin{font-weight:200}.flow-text{font-weight:300}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem;}}@media only screen and (min-width: 0px){.flow-text{line-height:.8rem;}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem;}}@media only screen and (min-width: 30px){.flow-text{line-height:.904rem;}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem;}}@media only screen and (min-width: 60px){.flow-text{line-height:1.008rem;}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem;}}@media only screen and (min-width: 90px){.flow-text{line-height:1.112rem;}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem;}}@media only screen and (min-width: 120px){.flow-text{line-height:1.216rem;}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem;}}@media only screen and (min-width: 150px){.flow-text{line-height:1.32rem;}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem;}}@media only screen and (min-width: 180px){.flow-text{line-height:1.424rem;}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem;}}@media only screen and (min-width: 210px){.flow-text{line-height:1.528rem;}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem;}}@media only screen and (min-width: 240px){.flow-text{line-height:1.632rem;}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem;}}@media only screen and (min-width: 270px){.flow-text{line-height:1.736rem;}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem;}}@media only screen and (min-width: 300px){.flow-text{line-height:1.84rem;}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem;}}@media only screen and (min-width: 330px){.flow-text{line-height:1.944rem;}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem;}}@media only screen and (min-width: 360px){.flow-text{line-height:2.048rem;}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem;}}@media only screen and (min-width: 390px){.flow-text{line-height:2.152rem;}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem;}}@media only screen and (min-width: 420px){.flow-text{line-height:2.256rem;}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem;}}@media only screen and (min-width: 450px){.flow-text{line-height:2.36rem;}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem;}}@media only screen and (min-width: 480px){.flow-text{line-height:2.464rem;}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem;}}@media only screen and (min-width: 510px){.flow-text{line-height:2.568rem;}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem;}}@media only screen and (min-width: 540px){.flow-text{line-height:2.672rem;}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem;}}@media only screen and (min-width: 570px){.flow-text{line-height:2.776rem;}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem;}}@media only screen and (min-width: 600px){.flow-text{line-height:2.88rem;}}.card-panel{padding:20px;margin:0.5rem 0 1rem 0;border-radius:2px;background-color:#fff}.card{position:relative;overflow:hidden;margin:0.5rem 0 1rem 0;background-color:#fff;border-radius:2px}.card .card-title{color:#fff;font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{overflow:hidden}.card.small .card-content,.card.medium .card-content,.card.large .card-content{overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.small .card-image{height:150px}.card.small .card-content{height:150px}.card.medium{height:400px}.card.medium .card-image{height:250px}.card.medium .card-content{height:150px}.card.large{height:500px}.card.large .card-image{height:330px}.card.large .card-content{height:170px}.card .card-image{position:relative}.card .card-image img{border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{position:absolute;bottom:0;left:0;padding:20px}.card .card-content{padding:20px;border-radius:0 0 2px 2px}.card .card-content p{margin:0;color:inherit}.card .card-content .card-title{line-height:48px}.card .card-action{border-top:1px solid rgba(160,160,160,0.2);padding:20px}.card .card-action a{color:#ffab40;margin-right:20px;-webkit-transition:color .3s ease;-moz-transition:color .3s ease;-o-transition:color .3s ease;-ms-transition:color .3s ease;transition:color .3s ease;text-transform:uppercase}.card .card-action a:hover{color:#ffd8a6}.card .card-reveal{padding:20px;position:absolute;background-color:#FFF;width:100%;overflow-y:auto;top:100%;height:100%;z-index:1;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:1001}@media only screen and (max-width : 600px){#toast-container{min-width:100%;bottom:0%;}}@media only screen and (min-width : 601px) and (max-width : 992px){#toast-container{min-width:30%;left:5%;bottom:7%;}}@media only screen and (min-width : 993px){#toast-container{min-width:8%;top:10%;right:7%;}}.toast{border-radius:2px;top:0;width:auto;clear:both;margin-top:10px;position:relative;max-width:100%;height:48px;line-height:48px;background-color:#323232;padding:0 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.toast .btn,.toast .btn-large,.toast .btn-flat{margin:0;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width : 600px){.toast{width:100%;border-radius:0;}}@media only screen and (min-width : 601px) and (max-width : 992px){.toast{float:left;}}@media only screen and (min-width : 993px){.toast{float:right;}}.tabs{position:relative;height:48px;background-color:#fff;margin:0 auto;width:100%;white-space:nowrap}.tabs .tab{display:block;float:left;text-align:center;line-height:48px;height:48px;padding:0 20px;margin:0;text-transform:uppercase;letter-spacing:.8px;width:15%}.tabs .tab a{color:#ee6e73;display:block;width:100%;height:100%;-webkit-transition:color .28s ease;-moz-transition:color .28s ease;-o-transition:color .28s ease;-ms-transition:color .28s ease;transition:color .28s ease}.tabs .tab a:hover{color:#f9c9cb}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left, right}.tabs .tab{padding:0}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:1000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:1rem;opacity:0;display:none;position:absolute;text-align:center;overflow:hidden;left:0;top:0;will-change:top, left}.backdrop{position:absolute;opacity:0;display:none;height:7px;width:14px;border-radius:0 0 14px 14px;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 10%;-moz-transform-origin:50% 10%;-ms-transform-origin:50% 10%;-o-transform-origin:50% 10%;transform-origin:50% 10%;will-change:transform, opacity}.btn,.btn-large,.btn-flat{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;outline:0;padding:0 2rem;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.btn-floating.disabled,.btn-large.disabled,.btn:disabled,.btn-large:disabled,.btn-large:disabled,.btn-floating:disabled{background-color:#DFDFDF;box-shadow:none;color:#9F9F9F;cursor:default}.btn.disabled *,.disabled.btn-large *,.btn-floating.disabled *,.btn-large.disabled *,.btn:disabled *,.btn-large:disabled *,.btn-large:disabled *,.btn-floating:disabled *{pointer-events:none}.btn.disabled:hover,.disabled.btn-large:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-large:disabled:hover,.btn-floating:disabled:hover{background-color:#DFDFDF;color:#9F9F9F}.btn i,.btn-large i,.btn-floating i,.btn-large i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn,.btn-large{text-decoration:none;color:#FFF;background-color:#26a69a;text-align:center;letter-spacing:.5px;-webkit-transition:.2s ease-out;-moz-transition:.2s ease-out;-o-transition:.2s ease-out;-ms-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#FFF;position:relative;overflow:hidden;z-index:1;width:37px;height:37px;line-height:37px;padding:0;background-color:#26a69a;border-radius:50%;transition:.3s;cursor:pointer;vertical-align:middle}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#FFF;font-size:1.6rem;line-height:37px}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:55.5px;height:55.5px}.btn-floating.btn-large i{line-height:55.5px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:998}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.btn-flat{box-shadow:none;background-color:transparent;color:#343434;cursor:pointer}.btn-flat.disabled{color:#b3b3b3;cursor:default}.btn-large{height:54px;line-height:56px}.btn-large i{font-size:1.6rem}.dropdown-content{background-color:#FFFFFF;margin:0;display:none;min-width:100px;max-height:650px;overflow-y:auto;opacity:0;position:absolute;white-space:nowrap;z-index:1;will-change:width, height}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;line-height:1.5rem;width:100%;text-align:left;text-transform:none}.dropdown-content li:hover,.dropdown-content li.active{background-color:#eee}.dropdown-content li>a,.dropdown-content li>span{font-size:1.2rem;color:#26a69a;display:block;padding:1rem 1rem}/*! - * Waves v0.6.0 - * http://fian.my.id/Waves - * - * Copyright 2014 Alfiana E. Sibuea and other contributors - * Released under the MIT license - * https://github.com/fians/Waves/blob/master/LICENSE - */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;will-change:opacity, transform;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);-webkit-transition:all 0.7s ease-out;-moz-transition:all 0.7s ease-out;-o-transition:all 0.7s ease-out;-ms-transition:all 0.7s ease-out;transition:all 0.7s ease-out;-webkit-transition-property:-webkit-transform, opacity;-moz-transition-property:-moz-transform, opacity;-o-transition-property:-o-transform, opacity;transition-property:transform, opacity;-webkit-transform:scale(0);-moz-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;-ms-transition:none !important;transition:none !important}.waves-circle{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.waves-input-wrapper{border-radius:0.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}a.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;z-index:1000;border-radius:2px;-webkit-transform:translate(0);-moz-transform:translate(0);-ms-transform:translate(0);-o-transform:translate(0);transform:translate(0);will-change:top, opacity}@media only screen and (max-width : 992px){.modal{width:80%;}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-flat{float:right;margin:6px 0}#lean-overlay{position:fixed;z-index:999;top:0;left:0;bottom:0;right:0;height:115%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:fixed;max-height:100%;padding-bottom:64px;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:fixed;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom, opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:0.5rem 0 1rem 0}.collapsible-header{display:block;cursor:pointer;height:3rem;line-height:3rem;padding:0 1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header i{width:2rem;font-size:1.6rem;line-height:3rem;display:block;float:left;text-align:center;margin-right:1rem}.collapsible-body{overflow:hidden;display:none;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.collapsible-body p{margin:0;padding:2rem}.side-nav .collapsible{border:none;box-shadow:none}.side-nav .collapsible li{padding:0}.side-nav .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;margin:0 1rem}.side-nav .collapsible-header i{line-height:inherit}.side-nav .collapsible-body{border:0;background-color:#FFF}.side-nav .collapsible-body li a{margin:0 1rem 0 2rem}.collapsible.popout{border:none;box-shadow:none}.collapsible.popout>li{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);transform:scaleX(.92) translate3d(0, 0, 0);transition:margin .35s cubic-bezier(0.25, 0.46, 0.45, 0.94),transform .35s cubic-bezier(0.25, 0.46, 0.45, 0.94)}.collapsible.popout>li:hover{will-change:margin, transform}.collapsible.popout>li.active{box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0;transform:scaleX(1) translate3d(0, 0, 0)}.materialboxed{cursor:zoom-in;position:relative;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s;transition:opacity .4s}.materialboxed:hover{will-change:left, top, width, height}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#292929;z-index:999;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;width:100%;text-align:center;padding:0% 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:0.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}:-moz-placeholder{color:#d1d1d1}::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}input[type=text],input[type=password],input[type=email],input[type=url],input[type=time],input[type=date],input[type=datetime-local],input[type=tel],input[type=number],input[type=search],textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:1rem;margin:0 0 15px 0;padding:0;box-shadow:none;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;transition:all .3s}input[type=text]:disabled,input[type=text][readonly="readonly"],input[type=password]:disabled,input[type=password][readonly="readonly"],input[type=email]:disabled,input[type=email][readonly="readonly"],input[type=url]:disabled,input[type=url][readonly="readonly"],input[type=time]:disabled,input[type=time][readonly="readonly"],input[type=date]:disabled,input[type=date][readonly="readonly"],input[type=datetime-local]:disabled,input[type=datetime-local][readonly="readonly"],input[type=tel]:disabled,input[type=tel][readonly="readonly"],input[type=number]:disabled,input[type=number][readonly="readonly"],input[type=search]:disabled,input[type=search][readonly="readonly"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly="readonly"]{color:rgba(0,0,0,0.26);border-bottom:1px dotted rgba(0,0,0,0.26)}input[type=text]:disabled+label,input[type=text][readonly="readonly"]+label,input[type=password]:disabled+label,input[type=password][readonly="readonly"]+label,input[type=email]:disabled+label,input[type=email][readonly="readonly"]+label,input[type=url]:disabled+label,input[type=url][readonly="readonly"]+label,input[type=time]:disabled+label,input[type=time][readonly="readonly"]+label,input[type=date]:disabled+label,input[type=date][readonly="readonly"]+label,input[type=datetime-local]:disabled+label,input[type=datetime-local][readonly="readonly"]+label,input[type=tel]:disabled+label,input[type=tel][readonly="readonly"]+label,input[type=number]:disabled+label,input[type=number][readonly="readonly"]+label,input[type=search]:disabled+label,input[type=search][readonly="readonly"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly="readonly"]+label{color:rgba(0,0,0,0.26)}input[type=text]:focus:not([readonly]),input[type=password]:focus:not([readonly]),input[type=email]:focus:not([readonly]),input[type=url]:focus:not([readonly]),input[type=time]:focus:not([readonly]),input[type=date]:focus:not([readonly]),input[type=datetime-local]:focus:not([readonly]),input[type=tel]:focus:not([readonly]),input[type=number]:focus:not([readonly]),input[type=search]:focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}input[type=text]:focus:not([readonly])+label,input[type=password]:focus:not([readonly])+label,input[type=email]:focus:not([readonly])+label,input[type=url]:focus:not([readonly])+label,input[type=time]:focus:not([readonly])+label,input[type=date]:focus:not([readonly])+label,input[type=datetime-local]:focus:not([readonly])+label,input[type=tel]:focus:not([readonly])+label,input[type=number]:focus:not([readonly])+label,input[type=search]:focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input[type=text].valid,input[type=text]:focus.valid,input[type=password].valid,input[type=password]:focus.valid,input[type=email].valid,input[type=email]:focus.valid,input[type=url].valid,input[type=url]:focus.valid,input[type=time].valid,input[type=time]:focus.valid,input[type=date].valid,input[type=date]:focus.valid,input[type=datetime-local].valid,input[type=datetime-local]:focus.valid,input[type=tel].valid,input[type=tel]:focus.valid,input[type=number].valid,input[type=number]:focus.valid,input[type=search].valid,input[type=search]:focus.valid,textarea.materialize-textarea.valid,textarea.materialize-textarea:focus.valid{border-bottom:1px solid #4CAF50;box-shadow:0 1px 0 0 #4CAF50}input[type=text].invalid,input[type=text]:focus.invalid,input[type=password].invalid,input[type=password]:focus.invalid,input[type=email].invalid,input[type=email]:focus.invalid,input[type=url].invalid,input[type=url]:focus.invalid,input[type=time].invalid,input[type=time]:focus.invalid,input[type=date].invalid,input[type=date]:focus.invalid,input[type=datetime-local].invalid,input[type=datetime-local]:focus.invalid,input[type=tel].invalid,input[type=tel]:focus.invalid,input[type=number].invalid,input[type=number]:focus.invalid,input[type=search].invalid,input[type=search]:focus.invalid,textarea.materialize-textarea.invalid,textarea.materialize-textarea:focus.invalid{border-bottom:1px solid #F44336;box-shadow:0 1px 0 0 #F44336}.input-field{position:relative;margin-top:1rem}.input-field label{color:#9e9e9e;position:absolute;top:0.8rem;left:0.75rem;font-size:1rem;cursor:text;-webkit-transition:.2s ease-out;-moz-transition:.2s ease-out;-o-transition:.2s ease-out;-ms-transition:.2s ease-out;transition:.2s ease-out}.input-field label.active{font-size:0.8rem;-webkit-transform:translateY(-140%);-moz-transform:translateY(-140%);-ms-transform:translateY(-140%);-o-transform:translateY(-140%);transform:translateY(-140%)}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;-webkit-transition:color .2s;-moz-transition:color .2s;-o-transition:color .2s;-ms-transition:color .2s;transition:color .2s}.input-field .prefix.active{color:#26a69a}.input-field .prefix ~ input,.input-field .prefix ~ textarea{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix ~ textarea{padding-top:.8rem}.input-field .prefix ~ label{margin-left:3rem}@media only screen and (max-width : 992px){.input-field .prefix ~ input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width : 600px){.input-field .prefix ~ input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;padding-left:4rem;width:calc(100% - 4rem)}.input-field input[type=search]:focus{background-color:#FFF;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus+label i,.input-field input[type=search]:focus ~ .mdi-navigation-close{color:#444}.input-field input[type=search]+label{left:1rem}.input-field input[type=search] ~ .mdi-navigation-close{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{overflow-y:hidden;padding:1.6rem 0;resize:none;min-height:3rem}.hiddendiv{display:none;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;left:-9999px;visibility:hidden}[type="radio"]:not(:checked)+label,[type="radio"]:checked+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-transition:.28s ease;-moz-transition:.28s ease;-o-transition:.28s ease;-ms-transition:.28s ease;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}[type="radio"]+label:before,[type="radio"]+label:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;-webkit-transition:.28s ease;-moz-transition:.28s ease;-o-transition:.28s ease;-ms-transition:.28s ease;transition:.28s ease}[type="radio"]:not(:checked)+label:before{border-radius:50%;border:2px solid #5a5a5a}[type="radio"]:not(:checked)+label:after{border-radius:50%;border:2px solid #5a5a5a;z-index:-1;-webkit-transform:scale(0);-moz-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0)}[type="radio"]:checked+label:before{border-radius:50%;border:2px solid transparent}[type="radio"]:checked+label:after{border-radius:50%;border:2px solid #26a69a;background-color:#26a69a;z-index:0;-webkit-transform:scale(1.02);-moz-transform:scale(1.02);-ms-transform:scale(1.02);-o-transform:scale(1.02);transform:scale(1.02)}[type="radio"].with-gap:checked+label:before{border-radius:50%;border:2px solid #26a69a}[type="radio"].with-gap:checked+label:after{border-radius:50%;border:2px solid #26a69a;background-color:#26a69a;z-index:0;-webkit-transform:scale(.5);-moz-transform:scale(.5);-ms-transform:scale(.5);-o-transform:scale(.5);transform:scale(.5)}[type="radio"]:disabled:not(:checked)+label:before,[type="radio"]:disabled:checked+label:before{background-color:transparent;border-color:rgba(0,0,0,0.26)}[type="radio"]:disabled+label{color:rgba(0,0,0,0.26)}[type="radio"]:disabled:not(:checked)+label:hover:before{border-color:rgba(0,0,0,0.26)}form p{margin-bottom:10px;text-align:left}form p:last-child{margin-bottom:0}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;left:-9999px}[type="checkbox"]{}[type="checkbox"]+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}[type="checkbox"]+label:before{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:2px;-webkit-transition:0.2s;-moz-transition:0.2s;-o-transition:0.2s;-ms-transition:0.2s;transition:0.2s}[type="checkbox"]:not(:checked):disabled+label:before{border:none;background-color:rgba(0,0,0,0.26)}[type="checkbox"]:checked+label:before{top:-4px;left:-3px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);-moz-transform:rotate(40deg);-ms-transform:rotate(40deg);-o-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;-webkit-transform-origin:100% 100%;-moz-transform-origin:100% 100%;-ms-transform-origin:100% 100%;-o-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:checked:disabled+label:before{border-right:2px solid rgba(0,0,0,0.26);border-bottom:2px solid rgba(0,0,0,0.26)}[type="checkbox"]:indeterminate+label:before{left:-10px;top:-11px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;-webkit-transform-origin:100% 100%;-moz-transform-origin:100% 100%;-ms-transform-origin:100% 100%;-o-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:indeterminate:disabled+label:before{border-right:2px solid rgba(0,0,0,0.26);background-color:transparent}[type="checkbox"].filled-in+label:after{border-radius:2px}[type="checkbox"].filled-in+label:before,[type="checkbox"].filled-in+label:after{content:'';left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1}[type="checkbox"].filled-in:not(:checked)+label:before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}[type="checkbox"].filled-in:not(:checked)+label:after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0px;z-index:0}[type="checkbox"].filled-in:checked+label:before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:checked+label:after{top:0px;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type="checkbox"].filled-in:disabled:not(:checked)+label:before{background-color:transparent;border:2px solid transparent}[type="checkbox"].filled-in:disabled:not(:checked)+label:after{border-color:transparent;background-color:#BDBDBD}[type="checkbox"].filled-in:disabled:checked+label:before{background-color:transparent}[type="checkbox"].filled-in:disabled:checked+label:after{background-color:#BDBDBD;border-color:#BDBDBD}.switch,.switch *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a}.switch label .lever{content:"";display:inline-block;position:relative;width:40px;height:15px;background-color:#818181;border-radius:15px;margin-right:10px;transition:background 0.3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:after{content:"";position:absolute;display:inline-block;width:21px;height:21px;background-color:#F1F1F1;border-radius:21px;box-shadow:0 1px 3px 1px rgba(0,0,0,0.4);left:-5px;top:-3px;transition:left 0.3s ease,background 0.3s ease,box-shadow 0.1s ease}input[type=checkbox]:checked:not(:disabled) ~ .lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,0.4),0 0 0 15px rgba(38,166,154,0.1)}input[type=checkbox]:not(:disabled) ~ .lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,0.4),0 0 0 15px rgba(0,0,0,0.08)}.switch label input[type=checkbox]:checked+.lever:after{left:24px}.switch input[type=checkbox][disabled]+.lever{cursor:default}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#BDBDBD}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:1rem;margin:0 0 15px 0;padding:0;display:block}.select-wrapper .mdi-navigation-arrow-drop-down{color:initial;position:absolute;right:0;top:0;font-size:23px}.select-wrapper .mdi-navigation-arrow-drop-down.disabled{color:rgba(0,0,0,0.26)}.select-wrapper+label{position:absolute;top:-14px;font-size:0.8rem}select{display:none}select.browser-default{display:block}select:disabled{color:rgba(0,0,0,0.3)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,0.3)}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled{color:rgba(0,0,0,0.3);background-color:transparent}.file-field{position:relative}.file-field input.file-path{margin-left:100px;width:calc(100% - 100px)}.file-field .btn,.file-field .btn-large{position:absolute;top:0;left:0;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0px;padding:0}input[type=range]+.thumb{position:absolute;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;top:10px;margin-left:-6px;-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]:focus{outline:none}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:14px;width:14px;border-radius:50%;background-color:#26a69a;transform-origin:50% 50%;margin:-5px 0 0 0;-webkit-transition:0.3s;-moz-transition:0.3s;-o-transition:0.3s;-ms-transition:0.3s;transition:0.3s}input[type=range]:focus::-webkit-slider-runnable-track{background:#ccc}input[type=range]{border:1px solid white}input[type=range]::-moz-range-track{height:3px;background:#ddd;border:none}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid white;outline-offset:-1px}input[type=range]:focus::-moz-range-track{background:#ccc}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a}input[type=range]:focus::-ms-fill-lower{background:#888}input[type=range]:focus::-ms-fill-upper{background:#ccc}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:20px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:19px;border-left:1px solid #ea4a4f}.table-of-contents a.active{font-weight:500;padding-left:18px;border-left:2px solid #ea4a4f}.side-nav{position:fixed;width:240px;left:-105%;top:0;margin:0;height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#FFF;z-index:999;overflow-y:auto;will-change:left}.side-nav.right-aligned{will-change:right;right:-105%;left:auto}.side-nav .collapsible{margin:0}.side-nav li{float:none;padding:0 15px}.side-nav li:hover,.side-nav li.active{background-color:#ddd}.side-nav a{color:#444;display:block;font-size:1rem;height:64px;line-height:64px;padding:0 15px}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.side-nav.fixed a{display:block;padding:0 15px;color:#444}.side-nav.fixed{left:0;position:fixed}.side-nav.fixed.right-aligned{right:0;left:auto}@media only screen and (max-width : 992px){.side-nav.fixed{left:-105%}.side-nav.fixed.right-aligned{right:-105%;left:auto}}.side-nav .collapsible-body li.active,.side-nav.fixed .collapsible-body li.active{background-color:#ee6e73}.side-nav .collapsible-body li.active a,.side-nav.fixed .collapsible-body li.active a{color:#fff}#sidenav-overlay{position:fixed;top:0;left:0;right:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;will-change:opacity}.preloader-wrapper{display:inline-block;position:relative;width:48px;height:48px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:440px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;-webkit-transition:background-color .3s;-moz-transition:background-color .3s;-o-transition:background-color .3s;-ms-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4CAF50}.picker{font-size:16px;text-align:left;line-height:1.2;color:#000000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}/*! - * Default mobile-first, responsive styling for pickadate.js - * Demo: http://amsul.github.io/pickadate.js - */.picker__holder,.picker__frame{bottom:0;left:0;right:0;top:100%}.picker__holder{position:fixed;-webkit-transition:background 0.15s ease-out,top 0s 0.15s;-moz-transition:background 0.15s ease-out,top 0s 0.15s;transition:background 0.15s ease-out,top 0s 0.15s;-webkit-backface-visibility:hidden}.picker__frame{position:absolute;margin:0 auto;min-width:256px;max-width:300px;max-height:350px;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;opacity:0;-webkit-transition:all 0.15s ease-out;-moz-transition:all 0.15s ease-out;transition:all 0.15s ease-out}@media (min-height: 28.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}}@media (min-height: 40.125em){.picker__frame{margin-bottom:7.5%}}.picker__wrap{display:table;width:100%;height:100%}@media (min-height: 28.875em){.picker__wrap{display:block}}.picker__box{background:#ffffff;display:table-cell;vertical-align:middle}@media (min-height: 28.875em){.picker__box{display:block;border:1px solid #777777;border-top-color:#898989;border-bottom-width:0;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;-webkit-box-shadow:0 12px 36px 16px rgba(0,0,0,0.24);-moz-box-shadow:0 12px 36px 16px rgba(0,0,0,0.24);box-shadow:0 12px 36px 16px rgba(0,0,0,0.24)}}.picker--opened .picker__holder{top:0;background:transparent;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)";zoom:1;background:rgba(0,0,0,0.32);-webkit-transition:background 0.15s ease-out;-moz-transition:background 0.15s ease-out;transition:background 0.15s ease-out}.picker--opened .picker__frame{top:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-moz-opacity:1;opacity:1}@media (min-height: 35.875em){.picker--opened .picker__frame{top:10%;bottom:20% auto}}.picker__input.picker__input--active{border-color:#E3F2FD}.picker__frame{margin:0 auto;max-width:325px}@media (min-height: 38.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__box{padding:0 1em}.picker__header{text-align:center;position:relative;margin-top:.75em}.picker__month,.picker__year{display:inline-block;margin-left:.25em;margin-right:.25em}.picker__select--month,.picker__select--year{height:2em;padding:0;margin-left:.25em;margin-right:.25em}.picker__select--month.browser-default{display:inline;background-color:#FFFFFF;width:40%}.picker__select--year.browser-default{display:inline;background-color:#FFFFFF;width:25%}.picker__select--month:focus,.picker__select--year:focus{border-color:rgba(0,0,0,0.05)}.picker__nav--prev,.picker__nav--next{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-0.25em}.picker__nav--prev{left:-1em;padding-right:1.25em}.picker__nav--next{right:-1em;padding-left:1.25em}.picker__nav--disabled,.picker__nav--disabled:hover,.picker__nav--disabled:before,.picker__nav--disabled:before:hover{cursor:default;background:none;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker__table{text-align:center;border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:1rem;width:100%;margin-top:.75em;margin-bottom:.5em}.picker__table th,.picker__table td{text-align:center}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999999;font-weight:500}@media (min-height: 33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day--today{position:relative;color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day--disabled:before{border-top-color:#aaaaaa}.picker__day--infocus:hover{cursor:pointer;color:#000;font-weight:500}.picker__day--outfocus{display:none;padding:.75rem 0;color:#fff}.picker__day--outfocus:hover{cursor:pointer;color:#dddddd;font-weight:500}.picker__day--highlighted:hover,.picker--focused .picker__day--highlighted{cursor:pointer}.picker__day--selected,.picker__day--selected:hover,.picker--focused .picker__day--selected{border-radius:50%;-webkit-transform:scale(.75);-moz-transform:scale(.75);-ms-transform:scale(.75);-o-transform:scale(.75);transform:scale(.75);background:#0089ec;color:#ffffff}.picker__day--disabled,.picker__day--disabled:hover,.picker--focused .picker__day--disabled{background:#f5f5f5;border-color:#f5f5f5;color:#dddddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbbbbb}.picker__footer{text-align:center;display:flex;align-items:center;justify-content:space-between}.picker__button--today,.picker__button--clear,.picker__button--close{border:1px solid #ffffff;background:#ffffff;font-size:.8em;padding:.66em 0;font-weight:bold;width:33%;display:inline-block;vertical-align:bottom}.picker__button--today:hover,.picker__button--clear:hover,.picker__button--close:hover{cursor:pointer;color:#000000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--today:focus,.picker__button--clear:focus,.picker__button--close:focus{background:#b1dcfb;border-color:rgba(0,0,0,0.05);outline:none}.picker__button--today:before,.picker__button--clear:before,.picker__button--close:before{position:relative;display:inline-block;height:0}.picker__button--today:before,.picker__button--clear:before{content:" ";margin-right:.45em}.picker__button--today:before{top:-0.05em;width:0;border-top:0.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-0.25em;width:.66em;border-top:3px solid #ee2200}.picker__button--close:before{content:"\D7";top:-0.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#dddddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaaaaa}.picker__box{border-radius:2px;overflow:hidden}.picker__date-display{text-align:center;background-color:#26a69a;color:#fff;padding-bottom:15px;font-weight:300}.picker__nav--prev:hover,.picker__nav--next:hover{cursor:pointer;color:#000000;background:#a1ded8}.picker__weekday-display{background-color:#1f897f;padding:10px;font-weight:200;letter-spacing:.5;font-size:1rem;margin-bottom:15px}.picker__month-display{text-transform:uppercase;font-size:2rem}.picker__day-display{font-size:4.5rem;font-weight:400}.picker__year-display{font-size:1.8rem;color:rgba(255,255,255,0.4)}.picker__box{padding:0}.picker__calendar-container{padding:0 1rem}.picker__calendar-container thead{border:none}.picker__table{margin-top:0;margin-bottom:.5em}.picker__day--infocus{color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day.picker__day--today{color:#26a69a}.picker__day.picker__day--today.picker__day--selected{color:#fff}.picker__weekday{font-size:.9rem}.picker__day--selected,.picker__day--selected:hover,.picker--focused .picker__day--selected{border-radius:50%;-webkit-transform:scale(.9);-moz-transform:scale(.9);-ms-transform:scale(.9);-o-transform:scale(.9);transform:scale(.9);background-color:#26a69a;color:#ffffff}.picker__day--selected.picker__day--outfocus,.picker__day--selected:hover.picker__day--outfocus,.picker--focused .picker__day--selected.picker__day--outfocus{background-color:#a1ded8}.picker__footer{text-align:right;padding:5px 10px}.picker__close,.picker__today{font-size:1.1rem;padding:0 1rem;color:#26a69a}.picker__nav--prev:before,.picker__nav--next:before{content:" ";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:0.75em solid #676767;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:0.75em solid #676767}button.picker__today:focus,button.picker__clear:focus,button.picker__close:focus{background-color:#a1ded8}.picker__list{list-style:none;padding:0.75em 0 4.2em;margin:0}.picker__list-item{border-bottom:1px solid #dddddd;border-top:1px solid #dddddd;margin-bottom:-1px;position:relative;background:#ffffff;padding:.75em 1.25em}@media (min-height: 46.75em){.picker__list-item{padding:.5em 1em}}.picker__list-item:hover{cursor:pointer;color:#000000;background:#b1dcfb;border-color:#0089ec;z-index:10}.picker__list-item--highlighted{border-color:#0089ec;z-index:10}.picker__list-item--highlighted:hover,.picker--focused .picker__list-item--highlighted{cursor:pointer;color:#000000;background:#b1dcfb}.picker__list-item--selected,.picker__list-item--selected:hover,.picker--focused .picker__list-item--selected{background:#0089ec;color:#ffffff;z-index:10}.picker__list-item--disabled,.picker__list-item--disabled:hover,.picker--focused .picker__list-item--disabled{background:#f5f5f5;border-color:#f5f5f5;color:#dddddd;cursor:default;border-color:#dddddd;z-index:auto}.picker--time .picker__button--clear{display:block;width:80%;margin:1em auto 0;padding:1em 1.25em;background:none;border:0;font-weight:500;font-size:.67em;text-align:center;text-transform:uppercase;color:#666}.picker--time .picker__button--clear:hover,.picker--time .picker__button--clear:focus{color:#000000;background:#b1dcfb;background:#ee2200;border-color:#ee2200;cursor:pointer;color:#ffffff;outline:none}.picker--time .picker__button--clear:before{top:-0.25em;color:#666;font-size:1.25em;font-weight:bold}.picker--time .picker__button--clear:hover:before,.picker--time .picker__button--clear:focus:before{color:#ffffff}.picker--time .picker__frame{min-width:256px;max-width:320px}.picker--time .picker__box{font-size:1em;background:#f2f2f2;padding:0}@media (min-height: 40.125em){.picker--time .picker__box{margin-bottom:5em}}
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/LICENSE.txt b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/LICENSE.txt deleted file mode 100755 index 542f6537..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/LICENSE.txt +++ /dev/null @@ -1,428 +0,0 @@ -https://github.com/google/material-design-icons/blob/master/LICENSE -https://github.com/FezVrasta/bootstrap-material-design/blob/master/fonts/LICENSE.txt - -Attribution-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-ShareAlike 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-ShareAlike 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - l. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - m. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - - including for purposes of Section 3(b); and - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public licenses. -Notwithstanding, Creative Commons may elect to apply one of its public -licenses to material it publishes and in those instances will be -considered the "Licensor." Except for the limited purpose of indicating -that material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the public -licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.eot b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.eot Binary files differdeleted file mode 100755 index a097ba68..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.eot +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.svg b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.svg deleted file mode 100755 index 0b2c2c24..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.svg +++ /dev/null @@ -1,751 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata>Generated by IcoMoon</metadata> -<defs> -<font id="Material-Design-Icons" horiz-adv-x="1024"> -<font-face units-per-em="1024" ascent="960" descent="-64" /> -<missing-glyph horiz-adv-x="1024" /> -<glyph unicode=" " d="" horiz-adv-x="512" /> -<glyph unicode="" d="M320.64 43.307c-139.307 66.133-239.36 201.6-254.507 362.027h-64c21.76-262.827 241.493-469.333 509.867-469.333 9.6 0 18.773 0.853 28.16 1.493l-162.56 162.773-56.96-56.96zM358.613 321.707c-8.107 0-15.573 1.067-22.4 3.627-6.613 2.347-12.373 5.76-17.067 10.027s-8.32 9.6-10.88 15.573c-2.56 6.187-3.84 12.8-3.84 20.053h-55.467c0-15.36 2.987-28.8 8.96-40.533s13.867-21.547 23.893-29.227c10.027-7.893 21.547-13.653 34.773-17.707 13.227-4.267 26.88-6.187 41.387-6.187 15.787 0 30.507 2.133 44.16 6.4s25.387 10.667 35.413 18.987 17.707 18.56 23.467 30.72c5.547 12.16 8.533 26.027 8.533 41.6 0 8.32-1.067 16.213-2.987 23.893-2.133 7.68-5.333 14.933-9.6 21.76-4.48 6.827-10.24 12.8-17.28 18.347-7.040 5.333-15.787 9.813-25.813 13.44 8.533 3.84 16 8.533 22.4 14.080s11.733 11.52 16 17.707c4.267 6.4 7.467 12.8 9.6 19.627s3.2 13.653 3.2 20.267c0 15.573-2.56 29.227-7.68 40.96s-12.373 21.547-21.76 29.44c-9.387 7.893-20.48 13.867-33.707 17.92-13.653 4.267-28.16 6.187-43.947 6.187-15.36 0-29.653-2.347-42.667-6.827s-24.107-10.88-33.493-18.987c-9.387-8.107-16.64-17.707-21.973-28.8s-7.893-23.253-7.893-36.267h55.467c0 7.253 1.28 13.653 3.84 19.2 2.56 5.76 6.187 10.667 10.667 14.507 4.48 4.053 10.027 7.253 16.213 9.387s13.013 3.413 20.267 3.413c17.067 0 29.653-4.48 37.973-13.227s12.373-21.12 12.373-36.907c0-7.68-1.067-14.507-3.413-20.693s-5.76-11.52-10.453-16c-4.693-4.48-10.667-7.893-17.493-10.453-7.040-2.56-15.36-3.84-24.747-3.84h-32.853v-43.733h32.853c9.387 0 17.92-1.067 25.387-3.2s13.867-5.333 19.2-10.027c5.333-4.48 9.387-10.24 12.373-17.067 2.773-6.827 4.267-14.933 4.267-24.32 0-17.28-4.907-30.507-14.933-39.68-9.6-8.96-23.040-13.44-40.32-13.44zM723.84 574.507c-13.44 14.080-29.653 24.96-48.427 32.64-18.987 7.68-39.68 11.52-62.507 11.52h-100.907v-341.333h97.92c23.68 0 45.013 3.84 64.427 11.52s35.84 18.56 49.493 32.64c13.653 14.080 24.32 31.147 31.573 50.987 7.467 19.84 11.093 42.24 11.093 66.987v16.853c0 24.747-3.84 46.933-11.307 66.987s-17.92 37.12-31.36 51.2zM706.987 439.253c0-17.707-1.92-33.92-6.187-48-4.053-14.293-10.027-26.24-18.133-36.053s-18.133-17.28-30.293-22.613c-12.16-5.12-26.24-7.893-42.453-7.893h-38.613v246.187h41.6c30.72 0 53.973-9.813 70.187-29.227 16-19.627 24.107-47.787 24.107-84.907v-17.493zM512 960c-9.6 0-18.773-0.853-28.16-1.493l162.56-162.773 56.747 56.747c139.52-65.92 239.573-201.387 254.72-361.813h64c-21.76 262.827-241.493 469.333-509.867 469.333z" /> -<glyph unicode="" d="M512 874.667c47.147 0 85.333-38.187 85.333-85.333s-38.187-85.333-85.333-85.333-85.333 38.187-85.333 85.333 38.187 85.333 85.333 85.333zM896 576h-256v-554.667h-85.333v256h-85.333v-256h-85.333v554.667h-256v85.333h768v-85.333z" /> -<glyph unicode="" d="M170.667 533.333v-298.667h128v298.667h-128zM426.667 533.333v-298.667h128v298.667h-128zM85.333 21.333h810.667v128h-810.667v-128zM682.667 533.333v-298.667h128v298.667h-128zM490.667 917.333l-405.333-213.333v-85.333h810.667v85.333l-405.333 213.333z" /> -<glyph unicode="" d="M896 192v-42.667c0-47.147-38.187-85.333-85.333-85.333h-597.333c-47.147 0-85.333 38.187-85.333 85.333v597.333c0 47.147 38.187 85.333 85.333 85.333h597.333c47.147 0 85.333-38.187 85.333-85.333v-42.667h-384c-47.147 0-85.333-38.187-85.333-85.333v-341.333c0-47.147 38.187-85.333 85.333-85.333h384zM512 277.333h426.667v341.333h-426.667v-341.333zM682.667 384c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64z" /> -<glyph unicode="" d="M128 746.667v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333zM640 576c0-70.827-57.387-128-128-128s-128 57.173-128 128c0 70.613 57.387 128 128 128s128-57.387 128-128zM256 234.667c0 85.333 170.667 132.267 256 132.267s256-46.933 256-132.267v-42.667h-512v42.667z" /> -<glyph unicode="" d="M704 448c58.88 0 106.24 47.787 106.24 106.667s-47.36 106.667-106.24 106.667c-58.88 0-106.667-47.787-106.667-106.667s47.787-106.667 106.667-106.667zM384 490.667c70.613 0 127.573 57.387 127.573 128s-56.96 128-127.573 128c-70.613 0-128-57.387-128-128s57.387-128 128-128zM704 362.667c-78.293 0-234.667-39.253-234.667-117.333v-96h469.333v96c0 78.080-156.373 117.333-234.667 117.333zM384 405.333c-99.627 0-298.667-49.92-298.667-149.333v-106.667h298.667v96c0 36.267 14.293 99.627 101.12 148.053-37.12 7.893-73.173 11.947-101.12 11.947z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 746.667c70.613 0 128-57.387 128-128 0-70.827-57.387-128-128-128s-128 57.173-128 128c0 70.613 57.387 128 128 128zM512 140.8c-106.88 0-200.747 54.613-256 137.387 1.067 84.693 170.88 131.413 256 131.413s254.72-46.72 256-131.413c-55.253-82.773-149.12-137.387-256-137.387z" /> -<glyph unicode="" d="M469.333 576h85.333v128h128v85.333h-128v128h-85.333v-128h-128v-85.333h128v-128zM298.667 192c-47.147 0-84.907-38.187-84.907-85.333s37.76-85.333 84.907-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM725.333 192c-47.147 0-84.907-38.187-84.907-85.333s37.76-85.333 84.907-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM306.133 330.667c0 1.92 0.427 3.627 1.28 5.12l38.4 69.547h317.867c32 0 59.947 17.707 74.667 43.947l164.693 299.093-74.667 40.96h-0.213l-47.147-85.333-117.547-213.333h-299.307l-5.547 11.52-136.32 287.147-40.32 85.333h-139.307v-85.333h85.333l153.6-323.627-57.813-104.533c-6.613-12.373-10.453-26.24-10.453-41.173 0-47.147 38.187-85.333 85.333-85.333h512v85.333h-493.867c-5.973 0-10.667 4.693-10.667 10.667z" /> -<glyph unicode="" d="M938.667 715.947l-196.053 164.48-54.827-65.28 196.053-164.48 54.827 65.28zM336.213 815.36l-54.827 65.28-196.053-164.48 54.827-65.28 196.053 164.48zM533.333 618.667h-64v-256l202.453-121.813 32.213 52.693-170.667 101.12v224zM511.787 789.333c-212.267 0-383.787-171.947-383.787-384s171.52-384 383.787-384 384.213 171.947 384.213 384-171.947 384-384.213 384zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.547-298.667-298.667-298.667z" /> -<glyph unicode="" d="M336.213 815.36l-54.827 65.28-196.053-164.48 54.827-65.28 196.053 164.48zM938.667 715.947l-196.053 164.48-54.827-65.28 196.053-164.48 54.827 65.28zM511.787 789.333c-212.267 0-383.787-171.947-383.787-384s171.52-384 383.787-384 384.213 171.947 384.213 384-171.947 384-384.213 384zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.547-298.667-298.667-298.667zM554.667 576h-85.333v-128h-128v-85.333h128v-128h85.333v128h128v85.333h-128v128z" /> -<glyph unicode="" d="M512 704c164.907 0 298.667-133.76 298.667-298.667 0-36.053-6.613-70.4-18.347-102.4l64.853-64.853c24.747 50.56 38.827 107.307 38.827 167.253 0 212.053-171.947 384-384.213 384-59.947 0-116.48-14.080-167.253-38.613l65.067-65.067c32 11.733 66.347 18.347 102.4 18.347zM938.667 715.947l-196.053 164.48-54.827-65.28 196.053-164.48 54.827 65.28zM124.587 862.080l-54.4-54.187 56.747-56.747-47.36-39.68 60.587-60.587 47.36 39.68 34.133-34.133c-58.24-67.413-93.653-155.093-93.653-251.093 0-212.053 171.52-384 383.787-384 96.213 0 183.893 35.627 251.093 93.867l93.867-93.867 54.187 54.4-786.347 786.347zM702.72 175.36c-51.84-42.88-118.187-68.693-190.72-68.693-164.907 0-298.667 133.76-298.667 298.667 0 72.533 25.813 138.88 68.693 190.72l420.693-420.693zM341.973 820.267l-60.587 60.587-36.267-30.507 60.587-60.587 36.267 30.507z" /> -<glyph unicode="" d="M938.667 715.947l-196.053 164.48-54.827-65.28 196.053-164.48 54.827 65.28zM336.213 815.36l-54.827 65.28-196.053-164.48 54.827-65.28 196.053 164.48zM511.787 789.333c-212.267 0-383.787-171.947-383.787-384s171.52-384 383.787-384 384.213 171.947 384.213 384-171.947 384-384.213 384zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.547-298.667-298.667-298.667zM449.493 340.267l-90.453 90.453-45.227-45.227 135.68-135.68 256.213 256.213-45.227 45.227-210.987-210.987z" /> -<glyph unicode="" d="M256 192c0-23.467 19.2-42.667 42.667-42.667h42.667v-149.333c0-35.413 28.587-64 64-64s64 28.587 64 64v149.333h85.333v-149.333c0-35.413 28.587-64 64-64s64 28.587 64 64v149.333h42.667c23.467 0 42.667 19.2 42.667 42.667v426.667h-512v-426.667zM149.333 618.667c-35.413 0-64-28.587-64-64v-298.667c0-35.413 28.587-64 64-64s64 28.587 64 64v298.667c0 35.413-28.587 64-64 64zM874.667 618.667c-35.413 0-64-28.587-64-64v-298.667c0-35.413 28.587-64 64-64s64 28.587 64 64v298.667c0 35.413-28.587 64-64 64zM662.613 867.84l55.68 55.68c8.32 8.32 8.32 21.76 0 30.080s-21.76 8.32-30.080 0l-63.147-62.933c-34.133 16.853-72.32 26.667-113.067 26.667-40.96 0-79.36-9.813-113.707-26.88l-63.36 63.36c-8.32 8.32-21.76 8.32-30.080 0s-8.32-21.76 0-30.080l55.893-55.893c-63.36-46.72-104.747-121.813-104.747-206.507h512c0 84.907-41.6 160-105.387 206.507zM426.667 746.667h-42.667v42.667h42.667v-42.667zM640 746.667h-42.667v42.667h42.667v-42.667z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM554.667 490.667h-85.333v256h85.333v-256zM554.667 320h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M810.667 448h-85.333v-128h-128v-85.333h213.333v213.333zM298.667 576h128v85.333h-213.333v-213.333h85.333v128zM896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 148.693h-768v598.613h768v-598.613z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM384 234.667h-85.333v298.667h85.333v-298.667zM554.667 234.667h-85.333v426.667h85.333v-426.667zM725.333 234.667h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M810.667 832h-178.56c-17.493 49.493-64.427 85.333-120.107 85.333s-102.613-35.84-120.107-85.333h-178.56c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 832c23.467 0 42.667-18.987 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 18.987-42.667 42.667 19.2 42.667 42.667 42.667zM597.333 234.667h-298.667v85.333h298.667v-85.333zM725.333 405.333h-426.667v85.333h426.667v-85.333zM725.333 576h-426.667v85.333h426.667v-85.333z" /> -<glyph unicode="" d="M810.667 832h-178.56c-17.493 49.493-64.427 85.333-120.107 85.333s-102.613-35.84-120.107-85.333h-178.56c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 832c23.467 0 42.667-18.987 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 18.987-42.667 42.667 19.2 42.667 42.667 42.667zM512 661.333c70.613 0 128-57.387 128-128 0-70.827-57.387-128-128-128s-128 57.173-128 128c0 70.613 57.387 128 128 128zM768 149.333h-512v59.733c0 85.333 170.667 132.267 256 132.267s256-46.933 256-132.267v-59.733z" /> -<glyph unicode="" d="M810.667 832h-178.56c-17.493 49.493-64.427 85.333-120.107 85.333s-102.613-35.84-120.107-85.333h-178.56c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM554.667 192h-85.333v85.333h85.333v-85.333zM554.667 362.667h-85.333v256h85.333v-256zM512 746.667c-23.467 0-42.667 18.987-42.667 42.667s19.2 42.667 42.667 42.667 42.667-18.987 42.667-42.667-19.2-42.667-42.667-42.667z" /> -<glyph unicode="" d="M810.667 832h-178.56c-17.493 49.493-64.427 85.333-120.107 85.333s-102.613-35.84-120.107-85.333h-178.56c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 832c23.467 0 42.667-18.987 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 18.987-42.667 42.667 19.2 42.667 42.667 42.667zM682.667 320h-170.667v-128l-213.333 213.333 213.333 213.333v-128h170.667v-170.667z" /> -<glyph unicode="" d="M810.667 832h-178.56c-17.493 49.493-64.427 85.333-120.107 85.333s-102.613-35.84-120.107-85.333h-178.56c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 832c23.467 0 42.667-18.987 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 18.987-42.667 42.667 19.2 42.667 42.667 42.667zM512 192l-213.333 213.333h128v170.667h170.667v-170.667h128l-213.333-213.333z" /> -<glyph unicode="" d="M810.667 832h-178.56c-17.493 49.493-64.427 85.333-120.107 85.333s-102.613-35.84-120.107-85.333h-178.56c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 832c23.467 0 42.667-18.987 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 18.987-42.667 42.667 19.2 42.667 42.667 42.667zM426.667 234.667l-170.667 170.667 60.373 60.373 110.293-110.293 280.96 280.96 60.373-60.373-341.333-341.333z" /> -<glyph unicode="" d="M512 704v-128l170.667 170.667-170.667 170.667v-128c-188.587 0-341.333-152.747-341.333-341.333 0-66.987 19.627-129.067 52.907-181.76l62.293 62.293c-18.987 35.627-29.867 76.16-29.867 119.467 0 141.44 114.56 256 256 256zM800.427 629.76l-62.293-62.293c18.987-35.627 29.867-76.16 29.867-119.467 0-141.44-114.56-256-256-256v128l-170.667-170.667 170.667-170.667v128c188.587 0 341.333 152.747 341.333 341.333 0 66.987-19.627 129.067-52.907 181.76z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-230.187-69.973-283.733-172.16-128.213-13.867-228.267-122.453-228.267-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.68 203.947-198.187 211.84zM597.333 405.333v-170.667h-170.667v170.667h-128l213.333 213.333 213.333-213.333h-128z" /> -<glyph unicode="" d="M768 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM256 789.333h213.333v-341.333l-106.667 64-106.667-64v341.333z" /> -<glyph unicode="" d="M725.333 832h-426.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667 298.667 128 298.667-128v682.667c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M725.333 832h-426.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667 298.667 128 298.667-128v682.667c0 47.147-38.187 85.333-85.333 85.333zM725.333 192l-213.333 92.8-213.333-92.8v554.667h426.667v-554.667z" /> -<glyph unicode="" d="M853.333 618.667h-119.893c-19.2 33.28-45.653 62.080-77.44 83.627l69.333 69.333-60.373 60.373-92.8-92.8c-19.2 4.693-39.467 7.467-60.16 7.467s-40.96-2.773-60.16-7.467l-92.8 92.8-60.373-60.373 69.333-69.333c-31.787-21.547-58.24-50.347-77.44-83.627h-119.893v-85.333h89.173c-2.347-13.867-3.84-28.16-3.84-42.667v-42.667h-85.333v-85.333h85.333v-42.667c0-14.507 1.493-28.8 3.84-42.667h-89.173v-85.333h119.893c44.16-76.373 126.72-128 221.44-128s177.28 51.627 221.44 128h119.893v85.333h-89.173c2.347 13.867 3.84 28.16 3.84 42.667v42.667h85.333v85.333h-85.333v42.667c0 14.507-1.493 28.8-3.84 42.667h89.173v85.333zM597.333 277.333h-170.667v85.333h170.667v-85.333zM597.333 448h-170.667v85.333h170.667v-85.333z" /> -<glyph unicode="" d="M810.667 618.667l-170.667-170.667h128c0-141.44-114.56-256-256-256-43.307 0-83.84 10.88-119.68 29.653l-62.293-62.293c52.907-33.067 114.987-52.693 181.973-52.693 188.587 0 341.333 152.747 341.333 341.333h128l-170.667 170.667zM256 448c0 141.44 114.56 256 256 256 43.307 0 83.84-10.88 119.68-29.653l62.293 62.293c-52.907 33.067-114.987 52.693-181.973 52.693-188.587 0-341.333-152.747-341.333-341.333h-128l170.667-170.667 170.667 170.667h-128z" /> -<glyph unicode="" d="M768 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM256 789.333h213.333v-341.333l-106.667 64-106.667-64v341.333z" /> -<glyph unicode="" d="M170.667 448h682.667v-256h-682.667zM853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 192h-682.667v256h682.667v-256zM853.333 618.667h-682.667v85.333h682.667v-85.333z" /> -<glyph unicode="" d="M128 405.333h341.333v426.667h-341.333v-426.667zM128 64h341.333v256h-341.333v-256zM554.667 64h341.333v426.667h-341.333v-426.667zM554.667 832v-256h341.333v256h-341.333z" /> -<glyph unicode="" d="M256 149.333c0-47.147 38.187-85.333 85.333-85.333h341.333c47.147 0 85.333 38.187 85.333 85.333v512h-512v-512zM810.667 789.333h-149.333l-42.667 42.667h-213.333l-42.667-42.667h-149.333v-85.333h597.333v85.333z" /> -<glyph unicode="" d="M597.333 874.667h-341.333c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667c0-47.147 37.76-85.333 84.907-85.333h512.427c47.147 0 85.333 38.187 85.333 85.333v512l-256 256zM682.667 192h-341.333v85.333h341.333v-85.333zM682.667 362.667h-341.333v85.333h341.333v-85.333zM554.667 576v234.667l234.667-234.667h-234.667z" /> -<glyph unicode="" d="M853.333 405.333h-682.667c-23.467 0-42.667-19.2-42.667-42.667v-256c0-23.467 19.2-42.667 42.667-42.667h682.667c23.467 0 42.667 19.2 42.667 42.667v256c0 23.467-19.2 42.667-42.667 42.667zM298.667 149.333c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM853.333 832h-682.667c-23.467 0-42.667-19.2-42.667-42.667v-256c0-23.467 19.2-42.667 42.667-42.667h682.667c23.467 0 42.667 19.2 42.667 42.667v256c0 23.467-19.2 42.667-42.667 42.667zM298.667 576c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M384 270.080l-177.92 177.92-60.373-60.373 238.293-238.293 512 512-60.373 60.373z" /> -<glyph unicode="" d="M768 661.333l-60.373 60.373-270.507-270.72 60.373-60.373 270.507 270.72zM949.12 721.707l-451.84-451.627-177.92 177.92-60.373-60.373 238.293-238.293 512 512-60.16 60.373zM17.707 387.627l238.293-238.293 60.373 60.373-238.293 238.293-60.373-60.373z" /> -<glyph unicode="" d="M725.333 448h-213.333v-213.333h213.333v213.333zM682.667 917.333v-85.333h-341.333v85.333h-85.333v-85.333h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333h-42.667v85.333h-85.333zM810.667 149.333h-597.333v469.333h597.333v-469.333z" /> -<glyph unicode="" d="M430.293 295.040l60.373-60.373 213.333 213.333-213.333 213.333-60.373-60.373 110.293-110.293h-412.587v-85.333h412.587l-110.293-110.293zM810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-170.667h85.333v170.667h597.333v-597.333h-597.333v170.667h-85.333v-170.667c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M512 494.933c-25.813 0-46.933-21.12-46.933-46.933s21.12-46.933 46.933-46.933c26.027 0 46.933 21.12 46.933 46.933s-20.907 46.933-46.933 46.933zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667 0-235.52 190.933-426.667 426.667-426.667s426.667 191.147 426.667 426.667c0 235.733-190.933 426.667-426.667 426.667zM605.44 354.56l-349.44-162.56 162.56 349.44 349.44 162.56-162.56-349.44z" /> -<glyph unicode="" d="M874.667 490.667h-64v170.667c0 47.147-38.187 85.333-85.333 85.333h-170.667v64c0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667v-64h-170.667c-47.147 0-84.907-38.187-84.907-85.333l-0.213-162.133h63.787c63.573 0 115.2-51.627 115.2-115.2s-51.627-115.2-115.2-115.2h-63.787l-0.213-162.133c0-47.147 38.187-85.333 85.333-85.333h162.133v64c0 63.573 51.627 115.2 115.2 115.2s115.2-51.627 115.2-115.2v-64h162.133c47.147 0 85.333 38.187 85.333 85.333v170.667h64c58.88 0 106.667 47.787 106.667 106.667s-47.787 106.667-106.667 106.667z" /> -<glyph unicode="" d="M626.987 230.187c-31.787-24.533-72.533-38.187-114.987-38.187s-83.2 13.653-114.987 38.187c-9.173 7.253-22.613 5.547-29.867-3.84s-5.547-22.613 3.84-29.867c39.040-30.293 89.173-47.147 141.013-47.147s101.973 16.853 141.013 47.147c9.387 7.253 11.093 20.693 3.84 29.867-7.253 9.387-20.693 11.093-29.867 3.84zM405.333 426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667zM512 960c-282.667 0-512-229.333-512-512s229.333-512 512-512 512 229.333 512 512-229.333 512-512 512zM851.627 327.68c-46.507-159.573-182.187-275.413-343.040-275.413-161.067 0-296.96 116.267-343.253 276.267-50.773 4.267-90.667 50.347-90.667 107.093 0 54.187 36.48 98.773 83.84 106.453v0.213c89.173 62.507 162.347 148.907 174.72 215.467l0.213-0.213v0.64c57.813-112 268.8-221.44 504.533-215.893 4.267 0.64 8.32 1.493 12.587 1.493 54.4 0 98.56-48.427 98.56-108.16 0.213-59.307-43.52-107.52-97.493-107.947zM704 426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667z" /> -<glyph unicode="" d="M512 49.067l-61.867 56.107c-219.733 199.467-364.8 331.093-364.8 492.16 0 131.627 103.040 234.667 234.667 234.667 74.24 0 145.493-34.56 192-88.96 46.507 54.4 117.76 88.96 192 88.96 131.627 0 234.667-103.040 234.667-234.667 0-161.067-145.067-292.693-364.8-492.16l-61.867-56.107z" /> -<glyph unicode="" d="M704 832c-74.24 0-145.493-34.56-192-88.96-46.507 54.4-117.76 88.96-192 88.96-131.627 0-234.667-103.040-234.667-234.667 0-161.067 145.067-292.693 364.8-492.16l61.867-56.107 61.867 56.107c219.733 199.467 364.8 331.093 364.8 492.16 0 131.627-103.040 234.667-234.667 234.667zM516.48 168.32l-4.48-4.053-4.48 4.053c-202.88 184.107-336.853 305.707-336.853 429.013 0 85.12 64.213 149.333 149.333 149.333 65.707 0 129.707-42.453 152.107-100.693h79.573c22.613 58.24 86.613 100.693 152.32 100.693 85.12 0 149.333-64.213 149.333-149.333 0-123.307-133.973-244.907-336.853-429.013z" /> -<glyph unicode="" d="M853.333 124.373v494.293l-256 256h-341.333c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667c0-47.147 37.76-85.333 84.907-85.333h512.427c18.987 0 36.48 6.4 50.56 17.067l-189.227 189.227c-33.493-22.4-73.813-35.627-117.333-35.627-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333c0-43.52-13.227-83.84-35.413-117.547l163.413-163.413zM384 405.333c0-70.613 57.387-128 128-128s128 57.387 128 128-57.387 128-128 128-128-57.387-128-128z" /> -<glyph unicode="" d="M469.333 704c58.88 0 112.213-23.893 150.827-62.507l-108.16-108.16h256v256l-87.467-87.467c-53.973 53.973-128.64 87.467-211.2 87.467-150.4 0-274.56-111.36-295.253-256h86.187c19.84 97.28 105.813 170.667 209.067 170.667zM709.973 314.24c28.373 38.613 47.573 84.267 54.613 133.76h-86.187c-19.84-97.28-105.813-170.667-209.067-170.667-58.88 0-112.213 23.893-150.827 62.507l108.16 108.16h-256v-256l87.467 87.467c53.973-53.973 128.64-87.467 211.2-87.467 66.133 0 127.147 21.76 176.64 58.24l207.36-207.147 63.573 63.573-206.933 207.573z" /> -<glyph unicode="" d="M384 661.333h-85.333v-85.333h85.333v85.333zM384 490.667h-85.333v-85.333h85.333v85.333zM384 832c-47.147 0-85.333-38.187-85.333-85.333h85.333v85.333zM554.667 320h-85.333v-85.333h85.333v85.333zM810.667 832v-85.333h85.333c0 47.147-38.187 85.333-85.333 85.333zM554.667 832h-85.333v-85.333h85.333v85.333zM384 234.667v85.333h-85.333c0-47.147 38.187-85.333 85.333-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM810.667 234.667c47.147 0 85.333 38.187 85.333 85.333h-85.333v-85.333zM213.333 661.333h-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512v85.333h-512v512zM640 746.667h85.333v85.333h-85.333v-85.333zM640 234.667h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M128 405.333h85.333v85.333h-85.333v-85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM213.333 64v85.333h-85.333c0-47.147 38.187-85.333 85.333-85.333zM128 576h85.333v85.333h-85.333v-85.333zM640 64h85.333v85.333h-85.333v-85.333zM810.667 832h-426.667c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 320h-426.667v426.667h426.667v-426.667zM469.333 64h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M810.667 576h-170.667v256h-256v-256h-170.667l298.667-298.667 298.667 298.667zM213.333 192v-85.333h597.333v85.333h-597.333z" /> -<glyph unicode="" d="M512 223.147l263.68-159.147-69.76 299.947 232.747 201.6-306.773 26.453-119.893 282.667-119.893-282.667-306.773-26.453 232.747-201.6-69.76-299.947z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667 0-235.52 190.933-426.667 426.667-426.667s426.667 191.147 426.667 426.667c0 235.733-190.933 426.667-426.667 426.667zM341.333 213.333c-58.88 0-106.667 47.787-106.667 106.667s47.787 106.667 106.667 106.667 106.667-47.787 106.667-106.667-47.787-106.667-106.667-106.667zM405.333 618.667c0 58.88 47.787 106.667 106.667 106.667s106.667-47.787 106.667-106.667-47.787-106.667-106.667-106.667-106.667 47.787-106.667 106.667zM682.667 213.333c-58.88 0-106.667 47.787-106.667 106.667s47.787 106.667 106.667 106.667 106.667-47.787 106.667-106.667-47.787-106.667-106.667-106.667z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM554.667 149.333h-85.333v85.333h85.333v-85.333zM642.773 479.787l-38.187-39.253c-30.72-30.72-49.92-56.533-49.92-120.533h-85.333v21.333c0 47.147 19.2 89.813 49.92 120.747l53.12 53.76c15.36 15.36 24.96 36.693 24.96 60.16 0 47.147-38.187 85.333-85.333 85.333s-85.333-38.187-85.333-85.333h-85.333c0 94.293 76.373 170.667 170.667 170.667s170.667-76.373 170.667-170.667c0-37.547-15.147-71.467-39.893-96.213z" /> -<glyph unicode="" d="M622.293 618.667l-110.293-110.293-110.293 110.293-60.373-60.373 110.293-110.293-110.293-110.293 60.373-60.373 110.293 110.293 110.293-110.293 60.373 60.373-110.293 110.293 110.293 110.293-60.373 60.373zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333z" /> -<glyph unicode="" d="M554.453 832c-212.267 0-383.787-171.947-383.787-384h-128l166.187-166.187 2.987-6.187 172.16 172.373h-128c0 164.907 133.76 298.667 298.667 298.667s298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667c-82.56 0-157.013 33.707-210.987 87.68l-60.373-60.373c69.333-69.547 165.12-112.64 271.147-112.64 212.267 0 384.213 171.947 384.213 384s-171.947 384-384.213 384zM512 618.667v-213.333l182.613-108.373 30.72 51.84-149.333 88.533v181.333h-64z" /> -<glyph unicode="" d="M426.667 106.667v256h170.667v-256h213.333v341.333h128l-426.667 384-426.667-384h128v-341.333z" /> -<glyph unicode="" d="M768 618.667h-42.667v85.333c0 117.76-95.573 213.333-213.333 213.333s-213.333-95.573-213.333-213.333v-85.333h-42.667c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM512 234.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM644.267 618.667h-264.533v85.333c0 72.96 59.307 132.267 132.267 132.267s132.267-59.307 132.267-132.267v-85.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM554.667 234.667h-85.333v256h85.333v-256zM554.667 576h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M469.333 234.667h85.333v256h-85.333v-256zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333zM469.333 576h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M896 831.573h-768c-47.147 0-85.333-38.187-85.333-85.333v-170.24h85.333v171.093h768v-598.613h-768v171.52h-85.333v-171.093c0-47.147 38.187-84.48 85.333-84.48h768c47.147 0 85.333 37.547 85.333 84.48v597.333c0 47.147-38.187 85.333-85.333 85.333zM469.333 277.333l170.667 170.667-170.667 170.667v-128h-426.667v-85.333h426.667v-128z" /> -<glyph unicode="" d="M753.28 621.653l-241.28 241.493-241.28-241.493c-133.333-133.333-133.333-349.44 0-482.773 66.56-66.56 154.027-100.053 241.28-100.053s174.72 33.28 241.28 100.053c133.333 133.333 133.333 349.44 0 482.773zM512 124.373c-68.48 0-132.693 26.667-180.907 75.093-48.427 48.213-75.093 112.427-75.093 180.907s26.667 132.693 75.093 181.12l180.907 180.907v-618.027z" /> -<glyph unicode="" d="M752.427 710.613c-15.573 21.76-40.96 36.053-69.76 36.053l-469.333-0.427c-47.147 0-85.333-37.76-85.333-84.907v-426.667c0-47.147 38.187-84.907 85.333-84.907l469.333-0.427c28.8 0 54.187 14.293 69.76 36.053l186.24 262.613-186.24 262.613z" /> -<glyph unicode="" d="M752.427 710.613c-15.573 21.76-40.96 36.053-69.76 36.053l-469.333-0.427c-47.147 0-85.333-37.76-85.333-84.907v-426.667c0-47.147 38.187-84.907 85.333-84.907l469.333-0.427c28.8 0 54.187 14.293 69.76 36.053l186.24 262.613-186.24 262.613zM682.667 234.667h-469.333v426.667h469.333l151.253-213.333-151.253-213.333z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM807.253 618.667h-125.867c-13.867 53.333-33.28 104.533-58.88 151.893 78.507-26.88 143.787-81.28 184.747-151.893zM512 787.84c35.627-51.2 63.36-108.16 81.493-169.173h-162.987c18.133 61.013 45.867 117.973 81.493 169.173zM181.76 362.667c-7.040 27.307-11.093 55.893-11.093 85.333s4.053 58.027 11.093 85.333h144c-3.413-27.947-5.76-56.32-5.76-85.333s2.347-57.387 5.973-85.333h-144.213zM216.533 277.333h125.867c13.867-53.333 33.28-104.533 58.88-152.107-78.507 26.88-143.787 81.493-184.747 152.107zM342.4 618.667h-125.867c40.96 70.613 106.24 125.227 184.747 152.107-25.6-47.573-45.013-98.773-58.88-152.107zM512 108.16c-35.413 51.2-63.147 108.16-81.493 169.173h162.987c-18.347-61.013-46.080-117.973-81.493-169.173zM611.84 362.667h-199.68c-4.053 27.947-6.827 56.32-6.827 85.333s2.773 57.387 6.827 85.333h199.68c4.053-27.947 6.827-56.32 6.827-85.333s-2.773-57.387-6.827-85.333zM622.72 125.44c25.6 47.573 45.013 98.56 58.88 151.893h125.867c-41.173-70.613-106.453-125.013-184.747-151.893zM698.027 362.667c3.413 27.947 5.973 56.32 5.973 85.333s-2.347 57.387-5.973 85.333h144c7.040-27.307 11.307-55.893 11.307-85.333s-4.053-58.027-11.307-85.333h-144z" /> -<glyph unicode="" d="M810.667 149.333h-597.333v597.333h298.667v85.333h-298.667c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v298.667h-85.333v-298.667zM597.333 832v-85.333h152.96l-419.413-419.413 60.373-60.373 419.413 419.413v-152.96h85.333v298.667h-298.667z" /> -<glyph unicode="" d="M128 405.333h85.333v85.333h-85.333v-85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM128 576h85.333v85.333h-85.333v-85.333zM298.667 405.333h597.333v85.333h-597.333v-85.333zM298.667 234.667h597.333v85.333h-597.333v-85.333zM298.667 661.333v-85.333h597.333v85.333h-597.333z" /> -<glyph unicode="" d="M768 618.667h-42.667v85.333c0 117.76-95.573 213.333-213.333 213.333s-213.333-95.573-213.333-213.333v-85.333h-42.667c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM512 234.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM644.267 618.667h-264.533v85.333c0 72.96 59.307 132.267 132.267 132.267s132.267-59.307 132.267-132.267v-85.333z" /> -<glyph unicode="" d="M512 234.667c47.147 0 85.333 38.187 85.333 85.333s-38.187 85.333-85.333 85.333-85.333-38.187-85.333-85.333 38.187-85.333 85.333-85.333zM768 618.667h-42.667v85.333c0 117.76-95.573 213.333-213.333 213.333s-213.333-95.573-213.333-213.333h81.067c0 72.96 59.307 132.267 132.267 132.267s132.267-59.307 132.267-132.267v-85.333h-388.267c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM768 106.667h-512v426.667h512v-426.667z" /> -<glyph unicode="" d="M768 618.667h-42.667v85.333c0 117.76-95.573 213.333-213.333 213.333s-213.333-95.573-213.333-213.333v-85.333h-42.667c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM512 836.267c72.96 0 132.267-59.307 132.267-132.267v-85.333h-260.267v85.333h-4.267c0 72.96 59.307 132.267 132.267 132.267zM768 106.667h-512v426.667h512v-426.667zM512 234.667c47.147 0 85.333 38.187 85.333 85.333s-38.187 85.333-85.333 85.333-85.333-38.187-85.333-85.333 38.187-85.333 85.333-85.333z" /> -<glyph unicode="" d="M913.493 465.92l-383.787 383.787c-15.36 15.36-36.693 24.96-60.373 24.96h-298.667c-47.147 0-85.333-38.187-85.333-85.333v-298.667c0-23.68 9.6-45.013 25.173-60.373l384-384c15.36-15.36 36.693-24.96 60.16-24.96 23.68 0 45.013 9.6 60.373 24.96l298.667 298.667c15.36 15.573 24.96 36.907 24.96 60.373 0 23.68-9.6 45.013-25.173 60.587zM234.667 661.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM736.853 308.48l-182.187-182.187-182.187 182.187c-19.2 19.413-31.147 46.080-31.147 75.52 0 58.88 47.787 106.667 106.667 106.667 29.44 0 56.32-11.947 75.52-31.36l31.147-31.147 31.147 31.147c19.413 19.413 46.080 31.36 75.52 31.36 58.88 0 106.667-47.787 106.667-106.667 0-29.44-11.947-56.107-31.147-75.52z" /> -<glyph unicode="" d="M853.333 704h-426.667v-256h-85.333v341.333h256v170.667h-341.333v-256h-85.333c-46.933 0-85.333-38.4-85.333-85.333v-512c0-46.933 38.4-85.333 85.333-85.333h682.667c46.933 0 85.333 38.4 85.333 85.333v512c0 46.933-38.4 85.333-85.333 85.333z" /> -<glyph unicode="" d="M597.333 874.667h-341.333c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667c0-47.147 37.76-85.333 84.907-85.333h512.427c47.147 0 85.333 38.187 85.333 85.333v512l-256 256zM682.667 277.333h-128v-128h-85.333v128h-128v85.333h128v128h85.333v-128h128v-85.333zM554.667 576v234.667l234.667-234.667h-234.667z" /> -<glyph unicode="" d="M810.667 789.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h170.667v85.333h-170.667v426.667h597.333v-426.667h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM512 533.333l-170.667-170.667h128v-256h85.333v256h128l-170.667 170.667z" /> -<glyph unicode="" d="M810.667 149.333h-597.333v597.333h298.667v85.333h-298.667c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v298.667h-85.333v-298.667zM597.333 832v-85.333h152.96l-419.413-419.413 60.373-60.373 419.413 419.413v-152.96h85.333v298.667h-298.667z" /> -<glyph unicode="" d="M426.667 576h170.667v128h128l-213.333 213.333-213.333-213.333h128v-128zM384 533.333h-128v128l-213.333-213.333 213.333-213.333v128h128v170.667zM981.333 448l-213.333 213.333v-128h-128v-170.667h128v-128l213.333 213.333zM597.333 320h-170.667v-128h-128l213.333-213.333 213.333 213.333h-128v128z" /> -<glyph unicode="" d="M469.333 618.667c-70.613 0-128-57.387-128-128s57.387-128 128-128 128 57.387 128 128-57.387 128-128 128zM810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM750.293 149.333l-163.413 163.413c-33.707-22.187-74.027-35.413-117.547-35.413-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333c0-43.52-13.227-83.84-35.413-117.547l163.413-163.413-60.373-60.373z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 192h-682.667v256h682.667v-256zM853.333 618.667h-682.667v85.333h682.667v-85.333z" /> -<glyph unicode="" d="M853.333 746.667h-135.253l-78.080 85.333h-256l-78.080-85.333h-135.253c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h298.667v89.173c-120.96 20.48-213.333 125.653-213.333 252.16h85.333c0-94.080 76.587-170.667 170.667-170.667s170.667 76.587 170.667 170.667h85.333c0-126.507-92.373-231.68-213.333-252.16v-89.173h298.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM597.333 405.333c0-47.147-38.187-85.333-85.333-85.333s-85.333 38.187-85.333 85.333v170.667c0 47.147 38.187 85.333 85.333 85.333s85.333-38.187 85.333-85.333v-170.667z" /> -<glyph unicode="" d="M810.667 832h-42.667v85.333h-85.333v-85.333h-341.333v85.333h-85.333v-85.333h-42.667c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 704c70.613 0 128-57.387 128-128 0-70.827-57.387-128-128-128s-128 57.173-128 128c0 70.613 57.387 128 128 128zM768 192h-512v42.667c0 85.333 170.667 132.267 256 132.267s256-46.933 256-132.267v-42.667z" /> -<glyph unicode="" d="M810.24 469.333c14.507 0 29.013-1.28 43.093-3.2v493.867l-853.333-853.333h493.44c-1.92 14.080-3.2 28.16-3.2 42.667 0 176.64 143.36 320 320 320zM968.747 128.427c0.853 6.827 1.493 13.653 1.493 20.907 0 7.040-0.64 14.080-1.493 20.907l45.013 35.2c4.053 3.2 5.12 8.96 2.56 13.653l-42.667 73.813c-2.56 4.693-8.32 6.4-13.013 4.693l-53.12-21.333c-11.093 8.533-23.040 15.573-36.053 20.907l-7.893 56.533c-0.853 5.12-5.333 8.96-10.667 8.96h-85.333c-5.333 0-9.813-3.84-10.453-8.96l-7.893-56.533c-13.013-5.333-24.96-12.587-36.053-20.907l-53.12 21.333c-4.907 1.92-10.453 0-13.013-4.693l-42.667-73.813c-2.773-4.693-1.493-10.453 2.56-13.653l45.013-35.2c-0.853-6.827-1.493-13.867-1.493-20.907s0.64-14.080 1.493-20.907l-45.013-35.2c-4.053-3.2-5.12-8.96-2.56-13.653l42.667-73.813c2.773-4.693 8.32-6.4 13.013-4.693l53.12 21.333c11.093-8.533 23.040-15.573 36.053-20.907l7.893-56.533c0.853-5.12 5.333-8.96 10.453-8.96h85.333c5.333 0 9.6 3.84 10.453 8.96l7.893 56.533c13.013 5.333 24.96 12.587 36.053 20.907l53.12-21.333c4.907-1.92 10.453 0 13.013 4.693l42.667 73.813c2.773 4.693 1.493 10.453-2.56 13.653l-44.8 35.2zM810.24 85.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64z" /> -<glyph unicode="" d="M554.667 661.333h-85.333v-85.333h85.333v85.333zM554.667 490.667h-85.333v-256h85.333v256zM725.333 916.907l-426.667 0.427c-47.147 0-85.333-38.187-85.333-85.333v-768c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v768c0 47.147-38.187 84.907-85.333 84.907zM725.333 149.333h-426.667v597.333h426.667v-597.333z" /> -<glyph unicode="" d="M512 708.267c49.493 0 89.6-40.107 89.6-89.6s-40.107-89.6-89.6-89.6-89.6 40.107-89.6 89.6 40.107 89.6 89.6 89.6zM512 324.267c126.933 0 260.267-62.080 260.267-89.6v-46.933h-520.533v46.933c0 27.52 133.333 89.6 260.267 89.6zM512 789.333c-94.293 0-170.667-76.373-170.667-170.667 0-94.080 76.373-170.667 170.667-170.667s170.667 76.587 170.667 170.667c0 94.293-76.373 170.667-170.667 170.667zM512 405.333c-113.707 0-341.333-56.96-341.333-170.667v-128h682.667v128c0 113.707-227.627 170.667-341.333 170.667z" /> -<glyph unicode="" d="M85.333 704h-85.333v-213.333h0.427l-0.427-384c0-47.147 38.187-85.333 85.333-85.333h768v85.333h-768v597.333zM938.667 789.333h-341.333l-85.333 85.333h-256c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM298.667 320l192 256 149.333-192.213 106.667 128.213 149.333-192h-597.333z" /> -<glyph unicode="" d="M853.333 298.667c-53.12 0-104.533 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.96 61.44-219.52 160.213-281.173 280.96l93.867 94.293c11.733 11.733 15.147 28.587 10.453 43.307-15.787 47.787-24.32 99.2-24.32 152.32 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.467 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667zM512 832v-426.667l128 128h256v298.667h-384z" /> -<glyph unicode="" d="M512 832c-215.253 0-377.813-78.933-512-180.693l512-629.973 512 629.333c-134.187 101.547-296.747 181.333-512 181.333zM554.667 277.333h-85.333v256h85.333v-256zM469.333 618.667v85.333h85.333v-85.333h-85.333z" /> -<glyph unicode="" d="M810.667 661.333h-341.333v-256h341.333v256zM896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-84.48 85.333-84.48h768c47.147 0 85.333 37.547 85.333 84.48v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 148.693h-768v598.613h768v-598.613z" /> -<glyph unicode="" d="M810.667 789.333h-170.667l-336.853-538.88-111.147 197.547 192 341.333h-170.667l-192-341.333 192-341.333h170.667l336.853 538.88 111.147-197.547-192-341.333h170.667l192 341.333z" /> -<glyph unicode="" d="M810.667 618.667h-597.333c-70.613 0-128-57.387-128-128v-256h170.667v-170.667h512v170.667h170.667v256c0 70.613-57.387 128-128 128zM682.667 149.333h-341.333v213.333h341.333v-213.333zM810.667 448c-23.68 0-42.667 18.987-42.667 42.667s18.987 42.667 42.667 42.667c23.68 0 42.667-18.987 42.667-42.667s-18.987-42.667-42.667-42.667zM768 832h-512v-170.667h512v170.667z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333zM533.333 661.333h-64v-256l223.787-134.4 32.213 52.48-192 113.92z" /> -<glyph unicode="" d="M896 704h-85.333v-384h-554.667v-85.333c0-23.467 19.2-42.667 42.667-42.667h469.333l170.667-170.667v640c0 23.467-19.2 42.667-42.667 42.667zM725.333 448v384c0 23.467-19.2 42.667-42.667 42.667h-554.667c-23.467 0-42.667-19.2-42.667-42.667v-597.333l170.667 170.667h426.667c23.467 0 42.667 19.2 42.667 42.667z" /> -<glyph unicode="" d="M768 234.667h-512v85.333h512v-85.333zM768 405.333h-512v85.333h512v-85.333zM768 576h-512v85.333h512v-85.333zM128 21.333l64 64 64-64 64 64 64-64 64 64 64-64 64 64 64-64 64 64 64-64 64 64 64-64v853.333l-64-64-64 64-64-64-64 64-64-64-64 64-64-64-64 64-64-64-64 64-64-64-64 64v-853.333z" /> -<glyph unicode="" d="M853.333 704h-93.227c4.693 13.44 7.893 27.52 7.893 42.667 0 70.613-57.387 128-128 128-44.587 0-83.84-22.827-106.667-57.387l-21.333-29.013-21.333 29.013c-22.827 34.56-62.080 57.387-106.667 57.387-70.613 0-128-57.387-128-128 0-15.147 2.987-29.227 7.893-42.667h-93.227c-47.147 0-84.907-38.187-84.907-85.333l-0.427-469.333c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v469.333c0 47.147-38.187 85.333-85.333 85.333zM640 789.333c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM384 789.333c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM853.333 149.333h-682.667v85.333h682.667v-85.333zM853.333 362.667h-682.667v256h216.747l-88.747-120.96 69.333-49.707 144 196.053 42.667-58.027 101.333-138.027 69.333 49.707-88.747 120.96h216.747v-256z" /> -<glyph unicode="" d="M42.667 64h938.667l-469.333 810.667-469.333-810.667zM554.667 192h-85.333v85.333h85.333v-85.333zM554.667 362.667h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M554.453 832c-212.267 0-383.787-171.947-383.787-384h-128l166.187-166.187 2.987-6.187 172.16 172.373h-128c0 164.907 133.76 298.667 298.667 298.667s298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667c-82.56 0-157.013 33.707-210.987 87.68l-60.373-60.373c69.333-69.547 165.12-112.64 271.147-112.64 212.267 0 384.213 171.947 384.213 384s-171.947 384-384.213 384zM512 618.667v-213.333l182.613-108.373 30.72 51.84-149.333 88.533v181.333h-64z" /> -<glyph unicode="" d="M512 874.667c-164.907 0-298.667-133.76-298.667-298.667 0-224 298.667-554.667 298.667-554.667s298.667 330.667 298.667 554.667c0 164.907-133.76 298.667-298.667 298.667zM512 469.333c-58.88 0-106.667 47.787-106.667 106.667s47.787 106.667 106.667 106.667 106.667-47.787 106.667-106.667-47.787-106.667-106.667-106.667z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333zM533.333 661.333h-64v-256l223.787-134.4 32.213 52.48-192 113.92z" /> -<glyph unicode="" d="M661.333 362.667h-33.92l-11.733 11.733c41.813 48.427 66.987 111.36 66.987 180.267 0 153.173-124.16 277.333-277.333 277.333s-277.333-124.16-277.333-277.333 124.16-277.333 277.333-277.333c68.907 0 131.84 25.173 180.267 66.773l11.733-11.733v-33.707l213.333-212.907 63.573 63.573-212.907 213.333zM405.333 362.667c-106.027 0-192 85.973-192 192s85.973 192 192 192 192-85.973 192-192-85.973-192-192-192z" /> -<glyph unicode="" d="M829.013 406.4c1.707 13.653 2.987 27.52 2.987 41.6s-1.28 27.947-2.987 41.6l90.24 70.613c8.107 6.4 10.453 17.92 5.12 27.307l-85.333 147.84c-5.333 9.173-16.427 13.013-26.027 9.173l-106.24-42.88c-21.973 16.853-46.080 31.147-72.107 42.027l-16 113.067c-1.92 10.027-10.667 17.92-21.333 17.92h-170.667c-10.667 0-19.413-7.893-21.12-17.92l-16-113.067c-26.027-10.88-50.133-24.96-72.107-42.027l-106.24 42.88c-9.6 3.627-20.693 0-26.027-9.173l-85.333-147.84c-5.333-9.173-2.987-20.693 5.12-27.307l90.027-70.613c-1.707-13.653-2.987-27.52-2.987-41.6s1.28-27.947 2.987-41.6l-90.027-70.613c-8.107-6.4-10.453-17.92-5.12-27.307l85.333-147.84c5.333-9.173 16.427-13.013 26.027-9.173l106.24 42.88c21.973-16.853 46.080-31.147 72.107-42.027l16-113.067c1.707-10.027 10.453-17.92 21.12-17.92h170.667c10.667 0 19.413 7.893 21.12 17.92l16 113.067c26.027 10.88 50.133 24.96 72.107 42.027l106.24-42.88c9.6-3.627 20.693 0 26.027 9.173l85.333 147.84c5.333 9.173 2.987 20.693-5.12 27.307l-90.027 70.613zM512 298.667c-82.56 0-149.333 66.773-149.333 149.333s66.773 149.333 149.333 149.333 149.333-66.773 149.333-149.333-66.773-149.333-149.333-149.333z" /> -<glyph unicode="" d="M512 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM736 448c0-9.813-0.853-19.627-2.133-29.227l63.147-49.493c5.547-4.48 7.253-12.587 3.413-18.987l-59.733-103.467c-3.627-6.4-11.52-8.96-18.347-6.4l-74.453 30.080c-15.36-11.947-32.213-21.76-50.56-29.44l-11.093-79.147c-0.853-7.040-7.040-12.587-14.507-12.587h-119.467c-7.467 0-13.653 5.547-14.72 12.587l-11.093 79.147c-18.133 7.467-34.987 17.493-50.56 29.44l-74.24-29.867c-6.827-2.56-14.507 0-18.347 6.4l-59.733 103.467c-3.84 6.4-2.133 14.507 3.413 18.987l63.147 49.28c-1.28 9.6-2.133 19.2-2.133 29.227 0 9.813 0.853 19.627 2.133 29.227l-63.147 49.28c-5.547 4.48-7.253 12.587-3.413 18.987l59.733 103.467c3.84 6.4 11.52 8.96 18.347 6.4l74.24-29.867c15.36 11.733 32.213 21.76 50.56 29.44l11.093 79.147c1.067 7.040 7.253 12.587 14.72 12.587h119.467c7.467 0 13.653-5.547 14.72-12.587l11.093-79.147c18.133-7.467 34.987-17.493 50.56-29.44l74.24 29.867c6.827 2.56 14.507 0 18.347-6.4l59.733-103.467c3.84-6.4 2.133-14.507-3.413-18.987l-63.147-49.493c1.28-9.387 2.133-19.2 2.133-29.013z" /> -<glyph unicode="" d="M597.333 448c0 47.147-38.187 85.333-85.333 85.333s-85.333-38.187-85.333-85.333 38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333zM512 832c-212.053 0-384-171.947-384-384h-128l170.667-170.667 170.667 170.667h-128c0 164.907 133.76 298.667 298.667 298.667s298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667c-64.64 0-124.16 20.693-173.227 55.68l-60.373-61.227c64.853-49.92 145.707-79.787 233.6-79.787 212.053 0 384 171.947 384 384s-171.947 384-384 384z" /> -<glyph unicode="" d="M469.333-64h85.333v85.333h-85.333v-85.333zM298.667-64h85.333v85.333h-85.333v-85.333zM640-64h85.333v85.333h-85.333v-85.333zM755.413 716.587l-243.413 243.413h-42.667v-323.627l-195.627 195.627-60.373-60.373 238.293-238.293-238.293-238.293 60.373-60.373 195.627 195.627v-323.627h42.667l243.413 243.413-183.040 183.253 183.040 183.253zM554.667 796.587l80.213-80.213-80.213-80v160.213zM634.88 350.080l-80.213-80v160.213l80.213-80.213z" /> -<glyph unicode="" d="M298.667-64h85.333v85.333h-85.333v-85.333zM469.333-64h85.333v85.333h-85.333v-85.333zM640-64h85.333v85.333h-85.333v-85.333zM682.667 959.573l-341.333 0.427c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h341.333c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 84.907-85.333 84.907zM682.667 277.333h-341.333v512h341.333v-512z" /> -<glyph unicode="" d="M896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 148.693h-768v598.613h768v-598.613zM341.333 277.333h106.667l64-64 64 64h106.667v106.667l64 64-64 64v106.667h-106.667l-64 64-64-64h-106.667v-106.667l-64-64 64-64v-106.667zM512 576c70.613 0 128-57.387 128-128s-57.387-128-128-128v256z" /> -<glyph unicode="" d="M331.52 671.573l-65.707 54.4-230.827-277.973 230.827-278.187 65.707 54.4-185.6 223.787 185.6 223.573zM298.667 405.333h85.333v85.333h-85.333v-85.333zM725.333 490.667h-85.333v-85.333h85.333v85.333zM469.333 405.333h85.333v85.333h-85.333v-85.333zM758.187 726.187l-65.707-54.4 185.6-223.787-185.6-223.573 65.707-54.4 230.827 277.973-230.827 278.187z" /> -<glyph unicode="" d="M512 746.667c-164.907 0-298.667-133.76-298.667-298.667h85.333c0 117.76 95.573 213.333 213.333 213.333s213.333-95.573 213.333-213.333h85.333c0 164.907-133.76 298.667-298.667 298.667zM554.667 350.293c37.547 16.427 64 53.973 64 97.707 0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667c0-43.733 26.453-81.28 64-97.707v-140.587l-145.707-145.707 60.373-60.373 128 128 128-128 60.373 60.373-145.707 145.707v140.587zM512 917.333c-259.2 0-469.333-210.133-469.333-469.333h85.333c0 212.053 171.947 384 384 384s384-171.947 384-384h85.333c0 259.2-210.133 469.333-469.333 469.333z" /> -<glyph unicode="" d="M213.333 874.667c0 23.467-18.987 42.667-42.667 42.667s-42.667-19.2-42.667-42.667v-170.667h-85.333v-256h256v256h-85.333v170.667zM384 277.333c0-55.68 35.84-102.613 85.333-120.107v-178.56h85.333v178.56c49.493 17.707 85.333 64.427 85.333 120.107v85.333h-256v-85.333zM42.667 277.333c0-55.68 35.84-102.613 85.333-120.107v-178.56h85.333v178.56c49.493 17.707 85.333 64.427 85.333 120.107v85.333h-256v-85.333zM896 704v170.667c0 23.467-18.987 42.667-42.667 42.667s-42.667-19.2-42.667-42.667v-170.667h-85.333v-256h256v256h-85.333zM554.667 874.667c0 23.467-18.987 42.667-42.667 42.667s-42.667-19.2-42.667-42.667v-170.667h-85.333v-256h256v256h-85.333v170.667zM725.333 277.333c0-55.68 35.84-102.613 85.333-120.107v-178.56h85.333v178.56c49.493 17.707 85.333 64.427 85.333 120.107v85.333h-256v-85.333z" /> -<glyph unicode="" d="M213.333 874.667c0 23.467-18.987 42.667-42.667 42.667s-42.667-19.2-42.667-42.667v-170.667h-85.333v-256h256v256h-85.333v170.667zM384 277.333c0-55.68 35.84-102.613 85.333-120.107v-178.56h85.333v178.56c49.493 17.707 85.333 64.427 85.333 120.107v85.333h-256v-85.333zM42.667 277.333c0-55.68 35.84-102.613 85.333-120.107v-178.56h85.333v178.56c49.493 17.707 85.333 64.427 85.333 120.107v85.333h-256v-85.333zM896 704v170.667c0 23.467-18.987 42.667-42.667 42.667s-42.667-19.2-42.667-42.667v-170.667h-85.333v-256h256v256h-85.333zM554.667 874.667c0 23.467-18.987 42.667-42.667 42.667s-42.667-19.2-42.667-42.667v-170.667h-85.333v-256h256v256h-85.333v170.667zM725.333 277.333c0-55.68 35.84-102.613 85.333-120.107v-178.56h85.333v178.56c49.493 17.707 85.333 64.427 85.333 120.107v85.333h-256v-85.333z" /> -<glyph unicode="" d="M768 661.333v128c0 47.147-38.187 85.333-85.333 85.333h-341.333c-47.147 0-85.333-38.187-85.333-85.333v-128h-42.667v-256l128-256v-128h341.333v128l128 256v256h-42.667zM341.333 789.333h341.333v-128h-85.333v85.333h-42.667v-85.333h-85.333v85.333h-42.667v-85.333h-85.333v128z" /> -<glyph unicode="" d="M341.333 469.333c0 35.413-28.587 64-64 64s-64-28.587-64-64 28.587-64 64-64 64 28.587 64 64zM640 682.667c0 35.413-28.587 64-64 64h-128c-35.413 0-64-28.587-64-64s28.587-64 64-64h128c35.413 0 64 28.587 64 64zM362.667 320c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64zM512 917.333c-258.773 0-469.333-210.56-469.333-469.333s210.56-469.333 469.333-469.333 469.333 210.56 469.333 469.333-210.56 469.333-469.333 469.333zM512 64c-211.84 0-384 172.373-384 384s172.16 384 384 384 384-172.373 384-384-172.16-384-384-384zM746.667 533.333c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64zM661.333 320c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64z" /> -<glyph unicode="" d="M512.213 725.333l-85.547-106.667h170.667l-85.12 106.667zM768 533.333v-170.667l106.667 85.12-106.667 85.547zM256 533.333l-106.667-85.547 106.667-85.12v170.667zM597.333 277.333h-170.667l85.547-106.667 85.12 106.667zM896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 148.693h-768v598.613h768v-598.613z" /> -<glyph unicode="" d="M554.667 576h-85.333v-85.333h85.333v85.333zM725.333 576h-85.333v-85.333h85.333v85.333zM853.333 298.667c-53.12 0-104.32 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.96 61.44-219.52 160.213-281.173 280.96l93.867 94.080c11.733 11.733 15.147 28.587 10.453 43.307-15.787 48-24.32 99.413-24.32 152.533 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.68 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667zM810.667 576v-85.333h85.333v85.333h-85.333z" /> -<glyph unicode="" d="M298.667-64h85.333v85.333h-85.333v-85.333zM469.333-64h85.333v85.333h-85.333v-85.333zM554.667 874.667h-85.333v-426.667h85.333v426.667zM706.773 770.773l-61.653-61.653c73.6-45.013 122.88-125.867 122.88-218.453 0-141.44-114.56-256-256-256s-256 114.56-256 256c0 92.587 49.28 173.44 122.88 218.453l-61.653 61.653c-88.533-61.653-146.56-164.053-146.56-280.107 0-188.587 152.747-341.333 341.333-341.333s341.333 152.747 341.333 341.333c0 116.053-58.027 218.453-146.56 280.107zM640-64h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M640 576h-256c-23.68 0-42.667-19.2-42.667-42.667v-512c0-23.467 18.987-42.667 42.667-42.667h256c23.68 0 42.667 19.2 42.667 42.667v512c0 23.467-18.987 42.667-42.667 42.667zM512 320c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM300.8 701.867l60.373-60.373c38.613 38.613 91.947 62.507 150.827 62.507s112.213-23.893 150.827-62.507l60.373 60.373c-53.973 53.973-128.64 87.467-211.2 87.467s-157.227-33.493-211.2-87.467zM512 960c-129.493 0-246.827-52.48-331.947-137.387l60.373-60.373c69.547 69.547 165.547 112.427 271.573 112.427s202.027-42.88 271.573-112.427l60.373 60.373c-85.12 84.907-202.453 137.387-331.947 137.387z" /> -<glyph unicode="" d="M298.667-64h85.333v85.333h-85.333v-85.333zM512 405.333c70.613 0 127.573 57.387 127.573 128l0.427 256c0 70.827-57.173 128-128 128-70.613 0-128-57.173-128-128v-256c0-70.613 57.387-128 128-128zM469.333-64h85.333v85.333h-85.333v-85.333zM640-64h85.333v85.333h-85.333v-85.333zM810.667 533.333h-72.533c0-128-108.16-217.6-226.133-217.6-117.76 0-226.133 89.6-226.133 217.6h-72.533c0-145.707 116.053-266.027 256-286.72v-139.947h85.333v139.947c139.947 20.693 256 141.013 256 286.72z" /> -<glyph unicode="" d="M682.667 704v85.333c0 47.147-38.187 85.333-85.333 85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-85.333h-256v-554.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v554.667h-256zM426.667 789.333h170.667v-85.333h-170.667v85.333zM384 192v384l320-170.667-320-213.333z" /> -<glyph unicode="" d="M734.293 576l-186.88 279.68c-8.107 12.373-21.76 18.133-35.413 18.133s-27.307-5.973-35.413-18.133l-186.88-279.68h-204.373c-23.467 0-42.667-19.2-42.667-42.667 0-4.053 0.64-7.893 1.493-11.52l108.16-395.52c10.027-35.84 43.093-62.293 82.347-62.293h554.667c39.253 0 72.32 26.453 82.133 62.507l108.16 395.52c1.067 3.413 1.707 7.253 1.707 11.307 0 23.467-19.2 42.667-42.667 42.667h-204.373zM384 576l128 187.733 128-187.733h-256zM512 234.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M298.667 192c-47.147 0-84.907-38.187-84.907-85.333s37.76-85.333 84.907-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM42.667 874.667v-85.333h85.333l153.387-323.627-57.6-104.533c-6.613-12.373-10.453-26.24-10.453-41.173 0-47.147 38.187-85.333 85.333-85.333h512v85.333h-493.867c-5.973 0-10.667 4.693-10.667 10.667 0 1.92 0.427 3.627 1.28 5.12l38.187 69.547h317.867c32 0 59.947 17.707 74.667 43.947l152.533 276.907c3.413 5.973 5.333 13.013 5.333 20.48 0 23.68-19.2 42.667-42.667 42.667h-630.827l-40.533 85.333h-139.307zM725.333 192c-47.147 0-84.907-38.187-84.907-85.333s37.76-85.333 84.907-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M768 746.667v85.333c0 47.147-38.187 85.333-85.333 85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-85.333h-213.333v-469.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v469.333h-213.333zM512 832h170.667v-85.333h-170.667v85.333zM512 320v298.667l234.667-128-234.667-170.667zM128 576h-85.333v-469.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333h-682.667v469.333z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM341.333 362.667h-85.333v85.333h85.333v-85.333zM341.333 490.667h-85.333v85.333h85.333v-85.333zM341.333 618.667h-85.333v85.333h85.333v-85.333zM640 362.667h-213.333v85.333h213.333v-85.333zM768 490.667h-341.333v85.333h341.333v-85.333zM768 618.667h-341.333v85.333h341.333v-85.333z" /> -<glyph unicode="" d="M530.987 277.333h89.173l-217.813 554.667h-79.147l-218.027-554.667h89.173l48 128h240.853l47.787-128zM274.347 490.667l88.32 235.733 88.32-235.733h-176.64zM920.96 465.707l-344.96-344.96-156.587 156.587-60.373-60.373 216.96-216.96 405.333 405.333-60.373 60.373z" /> -<glyph unicode="" d="M512 349.867l158.293-115.2-60.587 186.027 158.293 112.64h-194.133l-61.867 192-61.867-192h-194.133l158.293-112.64-60.373-186.027z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM692.48 192l-180.48 108.8-180.48-108.8 47.787 205.227-159.147 138.027 209.92 17.92 81.92 193.493 81.92-193.493 209.92-17.92-159.147-138.027 47.787-205.227z" /> -<glyph unicode="" d="M853.333 789.333h-682.667v-85.333h682.667v85.333zM896 362.667v85.333l-42.667 213.333h-682.667l-42.667-213.333v-85.333h42.667v-256h426.667v256h170.667v-256h85.333v256h42.667zM512 192h-256v170.667h256v-170.667z" /> -<glyph unicode="" d="M597.333 234.667h-426.667v-85.333h426.667v85.333zM853.333 576h-682.667v-85.333h682.667v85.333zM170.667 320h682.667v85.333h-682.667v-85.333zM170.667 746.667v-85.333h682.667v85.333h-682.667z" /> -<glyph unicode="" d="M298.24 490.667l-170.24-170.667 170.24-170.667v128h299.093v85.333h-299.093v128zM896 576l-170.24 170.667v-128h-299.093v-85.333h299.093v-128l170.24 170.667z" /> -<glyph unicode="" d="M682.667 234.24v299.093h-85.333v-299.093h-128l170.667-170.24 170.667 170.24h-128zM384 832l-170.667-170.24h128v-299.093h85.333v299.093h128l-170.667 170.24z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM277.333 576l149.333 149.333 149.333-149.333h-106.667v-170.667h-85.333v170.667h-106.667zM746.667 320l-149.333-149.333-149.333 149.333h106.667v170.667h85.333v-170.667h106.667z" /> -<glyph unicode="" d="M512 266.667l170.667 170.667h-128v384h-85.333v-384h-128l170.667-170.667zM896 821.333h-256v-84.693h256v-598.613h-768v598.613h256v84.693h-256c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 149.333h-768v597.333h426.667v-170.667h341.333v-426.667z" /> -<glyph unicode="" d="M42.667 576h85.333v85.333h-85.333v-85.333zM42.667 405.333h85.333v85.333h-85.333v-85.333zM42.667 746.667h85.333v85.333c-47.147 0-85.333-38.187-85.333-85.333zM384 64h85.333v85.333h-85.333v-85.333zM42.667 234.667h85.333v85.333h-85.333v-85.333zM128 64v85.333h-85.333c0-47.147 38.187-85.333 85.333-85.333zM896 832h-341.333v-256h426.667v170.667c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h85.333v85.333h-85.333v-85.333zM384 746.667h85.333v85.333h-85.333v-85.333zM213.333 64h85.333v85.333h-85.333v-85.333zM213.333 746.667h85.333v85.333h-85.333v-85.333zM896 64c47.147 0 85.333 38.187 85.333 85.333h-85.333v-85.333zM896 405.333h85.333v85.333h-85.333v-85.333zM554.667 64h85.333v85.333h-85.333v-85.333zM725.333 64h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M768 832v-85.333h-85.333v85.333h-341.333v-85.333h-85.333v85.333h-85.333v-768h85.333v85.333h85.333v-85.333h341.333v85.333h85.333v-85.333h85.333v768h-85.333zM341.333 234.667h-85.333v85.333h85.333v-85.333zM341.333 405.333h-85.333v85.333h85.333v-85.333zM341.333 576h-85.333v85.333h85.333v-85.333zM768 234.667h-85.333v85.333h85.333v-85.333zM768 405.333h-85.333v85.333h85.333v-85.333zM768 576h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M640 832h-384c-35.413 0-65.707-21.547-78.507-52.053l-128.64-300.8c-3.84-9.813-6.187-20.267-6.187-31.147v-81.707l0.427-0.427-0.427-3.2c0-47.147 38.187-85.333 85.333-85.333h269.44l-40.747-194.987c-0.853-4.267-1.493-8.747-1.493-13.44 0-17.707 7.253-33.707 18.773-45.227l45.44-45.013 280.96 280.96c15.36 15.573 24.96 36.907 24.96 60.373v426.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 832v-512h170.667v512h-170.667z" /> -<glyph unicode="" d="M512 704c0 23.467-19.2 42.667-42.667 42.667h-221.227l28.373 135.467c0.64 3.2 1.067 6.613 1.067 10.027 0 13.227-5.333 25.173-14.080 33.92l-33.92 33.92-210.773-210.773c-11.52-11.52-18.773-27.52-18.773-45.227v-277.333c0-35.413 28.587-64 64-64h288c26.453 0 49.28 16 58.88 39.040l96.64 225.707c2.773 7.253 4.48 14.933 4.48 23.253v53.333zM960 533.333h-288c-26.453 0-49.28-16-58.88-39.040l-96.64-225.707c-2.773-7.253-4.48-14.933-4.48-23.253v-53.333c0-23.467 19.2-42.667 42.667-42.667h221.227l-28.373-135.467c-0.64-3.2-1.067-6.613-1.067-10.027 0-13.227 5.333-25.173 14.080-33.92l33.92-33.92 210.773 210.773c11.52 11.52 18.773 27.52 18.773 45.227v277.333c0 35.413-28.587 64-64 64z" /> -<glyph unicode="" d="M42.667 64h170.667v512h-170.667v-512zM981.333 533.333c0 47.147-38.187 85.333-85.333 85.333h-269.44l40.747 194.987c0.853 4.267 1.493 8.747 1.493 13.44 0 17.707-7.253 33.707-18.773 45.227l-45.44 45.013-280.96-280.96c-15.36-15.573-24.96-36.907-24.96-60.373v-426.667c0-47.147 38.187-85.333 85.333-85.333h384c35.413 0 65.707 21.547 78.507 52.053l128.64 300.8c3.84 9.813 6.187 20.267 6.187 31.147v81.707l-0.427 0.427 0.427 3.2z" /> -<glyph unicode="" d="M128 576h597.333v85.333h-597.333v-85.333zM128 405.333h597.333v85.333h-597.333v-85.333zM128 234.667h597.333v85.333h-597.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM810.667 661.333v-85.333h85.333v85.333h-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M810.667 832h-42.667v85.333h-85.333v-85.333h-341.333v85.333h-85.333v-85.333h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v469.333h597.333v-469.333zM298.667 533.333h213.333v-213.333h-213.333z" /> -<glyph unicode="" d="M813.653 749.653l-60.373-60.373c61.867-61.653 100.053-146.987 100.053-241.28 0-188.587-152.747-341.333-341.333-341.333s-341.333 152.747-341.333 341.333c0 174.080 130.347 317.44 298.667 338.347v-86.187c-120.96-20.267-213.333-125.44-213.333-252.16 0-141.44 114.56-256 256-256s256 114.56 256 256c0 70.613-28.587 134.613-74.88 181.12l-60.373-60.373c30.72-30.933 49.92-73.6 49.92-120.747 0-94.293-76.373-170.667-170.667-170.667s-170.667 76.373-170.667 170.667c0 79.36 54.613 145.707 128 164.693v-91.093c-25.387-14.72-42.667-42.027-42.667-73.6 0-47.147 38.187-85.333 85.333-85.333s85.333 38.187 85.333 85.333c0 31.573-17.28 58.667-42.667 73.6v353.067h-42.667c-235.733 0-426.667-190.933-426.667-426.667 0-235.52 190.933-426.667 426.667-426.667 235.52 0 426.667 191.147 426.667 426.667 0 117.76-47.787 224.427-125.013 301.653z" /> -<glyph unicode="" d="M549.12 316.8l-108.373 107.093 1.28 1.28c74.24 82.773 127.147 177.92 158.293 278.613h125.013v85.547h-298.667v85.333h-85.333v-85.333h-298.667v-84.907h476.587c-28.8-82.347-73.813-160.427-135.253-228.693-39.68 44.16-72.533 92.16-98.56 142.933h-85.333c31.147-69.547 73.813-135.253 127.147-194.56l-216.96-214.4 60.373-60.373 213.333 213.333 132.693-132.693 32.427 86.827zM789.333 533.333h-85.333l-192-512h85.333l48 128h202.667l48-128h85.333l-192 512zM677.333 234.667l69.333 184.96 69.333-184.96h-138.667z" /> -<glyph unicode="" d="M682.667 192l97.92 97.92-208.213 208-170.667-170.667-316.373 316.373 60.373 60.373 256-256 170.667 170.667 268.373-268.587 97.92 97.92v-256z" /> -<glyph unicode="" d="M938.667 448l-170.667 170.667v-128h-640v-85.333h640v-128z" /> -<glyph unicode="" d="M682.667 704l97.92-97.92-208.213-208-170.667 170.667-316.373-316.373 60.373-60.373 256 256 170.667-170.667 268.373 268.587 97.92-97.92v256z" /> -<glyph unicode="" d="M725.333 832h-426.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667 298.667 128 298.667-128v682.667c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M725.333 832h-426.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667 298.667 128 298.667-128v682.667c0 47.147-38.187 85.333-85.333 85.333zM725.333 192l-213.333 92.8-213.333-92.8v554.667h426.667v-554.667z" /> -<glyph unicode="" d="M512 917.333l-384-170.667v-256c0-237.013 163.627-458.027 384-512 220.373 53.973 384 274.987 384 512v256l-384 170.667zM426.667 234.667l-170.667 170.667 60.373 60.373 110.293-110.293 280.96 280.96 60.373-60.373-341.333-341.333z" /> -<glyph unicode="" d="M853.333 405.333h-725.333c-23.467 0-42.667-19.2-42.667-42.667v-256c0-23.467 19.2-42.667 42.667-42.667h725.333c23.467 0 42.667 19.2 42.667 42.667v256c0 23.467-19.2 42.667-42.667 42.667zM853.333 832h-725.333c-23.467 0-42.667-19.2-42.667-42.667v-256c0-23.467 19.2-42.667 42.667-42.667h725.333c23.467 0 42.667 19.2 42.667 42.667v256c0 23.467-19.2 42.667-42.667 42.667z" /> -<glyph unicode="" d="M170.667 192h128v554.667h-128v-554.667zM768 746.667v-554.667h128v554.667h-128zM341.333 192h384v554.667h-384v-554.667z" /> -<glyph unicode="" d="M298.667 149.333h426.667v640h-426.667v-640zM85.333 234.667h170.667v469.333h-170.667v-469.333zM768 704v-469.333h170.667v469.333h-170.667z" /> -<glyph unicode="" d="M426.667 192h213.333v554.667h-213.333v-554.667zM170.667 192h213.333v554.667h-213.333v-554.667zM682.667 746.667v-554.667h213.333v554.667h-213.333z" /> -<glyph unicode="" d="M85.333 64h810.667v128h-810.667v-128zM853.333 618.667h-725.333c-23.467 0-42.667-19.2-42.667-42.667v-256c0-23.467 19.2-42.667 42.667-42.667h725.333c23.467 0 42.667 19.2 42.667 42.667v256c0 23.467-19.2 42.667-42.667 42.667zM85.333 832v-128h810.667v128h-810.667z" /> -<glyph unicode="" d="M170.667 320h725.333v85.333h-725.333v-85.333zM170.667 149.333h725.333v85.333h-725.333v-85.333zM170.667 490.667h725.333v85.333h-725.333v-85.333zM170.667 746.667v-85.333h725.333v85.333h-725.333z" /> -<glyph unicode="" d="M170.667 362.667h170.667v170.667h-170.667v-170.667zM170.667 149.333h170.667v170.667h-170.667v-170.667zM170.667 576h170.667v170.667h-170.667v-170.667zM384 362.667h512v170.667h-512v-170.667zM384 149.333h512v170.667h-512v-170.667zM384 746.667v-170.667h512v170.667h-512z" /> -<glyph unicode="" d="M170.667 490.667h213.333v256h-213.333v-256zM170.667 192h213.333v256h-213.333v-256zM426.667 192h213.333v256h-213.333v-256zM682.667 192h213.333v256h-213.333v-256zM426.667 490.667h213.333v256h-213.333v-256zM682.667 746.667v-256h213.333v256h-213.333z" /> -<glyph unicode="" d="M426.667 192h213.333v256h-213.333v-256zM170.667 192h213.333v554.667h-213.333v-554.667zM682.667 192h213.333v256h-213.333v-256zM426.667 746.667v-256h469.333v256h-469.333z" /> -<glyph unicode="" d="M170.667 192h725.333v256h-725.333v-256zM170.667 746.667v-256h725.333v256h-725.333z" /> -<glyph unicode="" d="M256 746.667h-128c-23.467 0-42.667-19.2-42.667-42.667v-512c0-23.467 19.2-42.667 42.667-42.667h128c23.467 0 42.667 19.2 42.667 42.667v512c0 23.467-19.2 42.667-42.667 42.667zM853.333 746.667h-128c-23.467 0-42.667-19.2-42.667-42.667v-512c0-23.467 19.2-42.667 42.667-42.667h128c23.467 0 42.667 19.2 42.667 42.667v512c0 23.467-19.2 42.667-42.667 42.667zM554.667 746.667h-128c-23.467 0-42.667-19.2-42.667-42.667v-512c0-23.467 19.2-42.667 42.667-42.667h128c23.467 0 42.667 19.2 42.667 42.667v512c0 23.467-19.2 42.667-42.667 42.667z" /> -<glyph unicode="" d="M512 768c-213.333 0-395.52-132.693-469.333-320 73.813-187.307 256-320 469.333-320 213.547 0 395.52 132.693 469.333 320-73.813 187.307-255.787 320-469.333 320zM512 234.667c-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333-95.573-213.333-213.333-213.333zM512 576c-70.613 0-128-57.387-128-128s57.387-128 128-128 128 57.387 128 128-57.387 128-128 128z" /> -<glyph unicode="" d="M512 661.333c117.76 0 213.333-95.573 213.333-213.333 0-27.52-5.547-53.76-15.147-77.867l124.8-124.8c64.427 53.76 115.2 123.307 146.56 202.667-74.027 187.307-256 320-469.547 320-59.733 0-116.907-10.667-170.027-29.867l92.16-91.947c24.107 9.387 50.347 15.147 77.867 15.147zM85.333 777.6l116.693-116.693c-70.4-55.040-126.080-128.213-159.36-212.907 73.813-187.307 256-320 469.333-320 66.133 0 129.28 12.8 187.093 36.053l18.133-18.133 124.373-124.587 54.4 54.187-756.267 756.48-54.4-54.4zM321.28 541.867l65.92-65.92c-1.92-9.173-3.2-18.347-3.2-27.947 0-70.613 57.387-128 128-128 9.6 0 18.773 1.28 27.733 3.2l65.92-65.92c-28.373-14.080-59.947-22.613-93.653-22.613-117.76 0-213.333 95.573-213.333 213.333 0 33.707 8.533 65.28 22.613 93.867zM504.96 575.36l134.4-134.4 0.64 7.040c0 70.613-57.387 128-128 128l-7.040-0.64z" /> -<glyph unicode="" d="M853.333 704h-93.227c4.693 13.44 7.893 27.733 7.893 42.667 0 70.613-57.387 128-128 128-44.587 0-83.84-22.827-106.667-57.387l-21.333-29.013-21.333 29.013c-22.827 34.56-62.080 57.387-106.667 57.387-70.613 0-128-57.387-128-128 0-14.933 2.987-29.227 7.893-42.667h-93.227c-47.147 0-84.907-38.187-84.907-85.333l-0.427-469.333c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v469.333c0 47.147-38.187 85.333-85.333 85.333zM640 789.333c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM384 789.333c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM853.333 149.333h-682.667v85.333h682.667v-85.333zM853.333 362.667h-682.667v256h216.747l-88.747-120.96 69.333-49.707 144 196.053 42.667-58.027 101.333-138.027 69.333 49.707-88.747 120.96h216.747v-256z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-469.333c0-47.147 38.187-85.333 85.333-85.333h170.667v-213.333l170.667 85.333 170.667-85.333v213.333h170.667c47.147 0 85.333 38.187 85.333 85.333v469.333c0 47.147-38.187 85.333-85.333 85.333zM853.333 320h-682.667v85.333h682.667v-85.333zM853.333 533.333h-682.667v256h682.667v-256z" /> -<glyph unicode="" d="M853.333 704h-128v85.333c0 47.147-38.187 85.333-85.333 85.333h-256c-47.147 0-85.333-38.187-85.333-85.333v-85.333h-128c-47.147 0-85.333-38.187-85.333-85.333v-469.333c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v469.333c0 47.147-38.187 85.333-85.333 85.333zM384 789.333h256v-85.333h-256v85.333zM853.333 149.333h-682.667v85.333h682.667v-85.333zM853.333 362.667h-682.667v256h128v-85.333h85.333v85.333h256v-85.333h85.333v85.333h128v-256z" /> -<glyph unicode="" d="M1024 960v-1024h-1024v1024h1024zM1045.333 981.333h-1066.667v-1066.667h1066.667v1066.667zM853.333 704h-170.667v85.333c0 47.147-38.187 85.333-85.333 85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-85.333h-170.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-469.333c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v469.333c0 47.147-38.187 85.333-85.333 85.333zM597.333 704h-170.667v85.333h170.667v-85.333z" /> -<glyph unicode="" d="M512 874.667c-235.52 0-426.667-190.933-426.667-426.667s191.147-426.667 426.667-426.667 426.667 190.933 426.667 426.667-191.147 426.667-426.667 426.667zM554.667 234.667h-85.333v85.333h85.333v-85.333zM554.667 405.333h-85.333v256h85.333v-256z" /> -<glyph unicode="" d="M42.667 64h938.667l-469.333 810.667-469.333-810.667zM554.667 192h-85.333v85.333h85.333v-85.333zM554.667 362.667h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 256c-106.027 0-192 85.973-192 192s85.973 192 192 192 192-85.973 192-192-85.973-192-192-192zM512 490.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667z" /> -<glyph unicode="" d="M469.333 234.667c0-23.467 19.2-42.667 42.667-42.667s42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667zM469.333 832v-170.667h85.333v81.92c144.64-20.693 256-144.853 256-295.253 0-164.907-133.76-298.667-298.667-298.667s-298.667 133.76-298.667 298.667c0 71.68 25.173 137.173 67.2 188.8l231.467-231.467 60.373 60.373-290.133 290.133-0.427-0.853c-93.227-69.973-153.813-181.333-153.813-306.987 0-212.053 171.52-384 383.787-384s384.213 171.947 384.213 384-171.947 384-384.213 384h-42.453zM768 448c0 23.467-19.2 42.667-42.667 42.667s-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667zM256 448c0-23.467 19.2-42.667 42.667-42.667s42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667z" /> -<glyph unicode="" d="M810.667 789.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM469.333 490.667h-64v21.333h-85.333v-128h85.333v21.333h64v-42.667c0-23.467-18.987-42.667-42.667-42.667h-128c-23.68 0-42.667 19.2-42.667 42.667v170.667c0 23.467 18.987 42.667 42.667 42.667h128c23.68 0 42.667-19.2 42.667-42.667v-42.667zM768 490.667h-64v21.333h-85.333v-128h85.333v21.333h64v-42.667c0-23.467-18.987-42.667-42.667-42.667h-128c-23.68 0-42.667 19.2-42.667 42.667v170.667c0 23.467 18.987 42.667 42.667 42.667h128c23.68 0 42.667-19.2 42.667-42.667v-42.667z" /> -<glyph unicode="" d="M426.667 106.667h170.667v682.667h-170.667v-682.667zM170.667 106.667h170.667v341.333h-170.667v-341.333zM682.667 576v-469.333h170.667v469.333h-170.667z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM640 576h-170.667v-85.333h170.667v-85.333h-170.667v-85.333h170.667v-85.333h-256v426.667h256v-85.333z" /> -<glyph unicode="" d="M170.667 192l362.667 256-362.667 256v-512zM554.667 704v-512l362.667 256-362.667 256z" /> -<glyph unicode="" d="M469.333 192v512l-362.667-256 362.667-256zM490.667 448l362.667-256v512l-362.667-256z" /> -<glyph unicode="" d="M640 640v234.667h-256v-234.667l128-128 128 128zM320 576h-234.667v-256h234.667l128 128-128 128zM384 256v-234.667h256v234.667l-128 128-128-128zM704 576l-128-128 128-128h234.667v256h-234.667z" /> -<glyph unicode="" d="M725.333 106.667c-12.16 0-24.107 2.56-32.64 6.4-30.080 16-51.84 37.76-72.96 101.76-21.973 66.347-62.72 97.707-102.187 128.213-33.707 26.027-68.693 52.907-98.773 107.733-22.4 40.96-34.773 85.547-34.773 125.227 0 119.68 93.653 213.333 213.333 213.333s213.333-93.653 213.333-213.333h85.333c0 167.467-131.2 298.667-298.667 298.667s-298.667-131.2-298.667-298.667c0-53.973 16.213-113.067 45.44-166.4 38.827-70.613 84.693-105.813 121.6-134.4 34.56-26.667 59.52-45.867 73.173-87.253 25.6-77.44 58.667-121.173 116.267-151.467 22.187-10.027 45.653-15.147 70.187-15.147 94.080 0 170.667 76.587 170.667 170.667h-85.333c0-47.147-38.187-85.333-85.333-85.333zM325.76 847.573l-60.373 60.373c-84.907-84.907-137.387-202.24-137.387-331.947s52.48-247.040 137.387-331.947l60.373 60.373c-69.547 69.547-112.427 165.547-112.427 271.573s42.88 202.027 112.427 271.573zM490.667 576c0-58.88 47.787-106.667 106.667-106.667s106.667 47.787 106.667 106.667-47.787 106.667-106.667 106.667-106.667-47.787-106.667-106.667z" /> -<glyph unicode="" d="M810.667 789.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM469.333 320h-64v85.333h-85.333v-85.333h-64v256h64v-106.667h85.333v106.667h64v-256zM768 362.667c0-23.467-18.987-42.667-42.667-42.667h-32v-64h-64v64h-32c-23.68 0-42.667 19.2-42.667 42.667v170.667c0 23.467 18.987 42.667 42.667 42.667h128c23.68 0 42.667-19.2 42.667-42.667v-170.667zM618.667 384h85.333v128h-85.333v-128z" /> -<glyph unicode="" d="M512 789.333v128l-170.667-170.667 170.667-170.667v128c141.44 0 256-114.56 256-256 0-43.307-10.88-83.84-29.653-119.68l62.293-62.293c33.067 52.907 52.693 114.987 52.693 181.973 0 188.587-152.747 341.333-341.333 341.333zM512 192c-141.44 0-256 114.56-256 256 0 43.307 10.88 83.84 29.653 119.68l-62.293 62.293c-33.067-52.907-52.693-114.987-52.693-181.973 0-188.587 152.747-341.333 341.333-341.333v-128l170.667 170.667-170.667 170.667v-128z" /> -<glyph unicode="" d="M512 362.667c70.613 0 127.573 57.387 127.573 128l0.427 256c0 70.827-57.173 128-128 128-70.613 0-128-57.173-128-128v-256c0-70.613 57.387-128 128-128zM738.133 490.667c0-128-108.16-217.6-226.133-217.6-117.76 0-226.133 89.6-226.133 217.6h-72.533c0-145.707 116.053-266.027 256-286.72v-139.947h85.333v139.947c139.947 20.693 256 141.013 256 286.72h-72.533z" /> -<glyph unicode="" d="M512 362.667c70.613 0 127.573 57.387 127.573 128l0.427 256c0 70.827-57.173 128-128 128-70.613 0-128-57.173-128-128v-256c0-70.613 57.387-128 128-128zM460.8 750.933c0 28.16 23.040 51.2 51.2 51.2s51.2-23.040 51.2-51.2l-0.427-264.533c0-28.16-22.827-51.2-50.773-51.2-28.16 0-51.2 23.040-51.2 51.2v264.533zM738.133 490.667c0-128-108.16-217.6-226.133-217.6-117.76 0-226.133 89.6-226.133 217.6h-72.533c0-145.707 116.053-266.027 256-286.72v-139.947h85.333v139.947c139.947 20.693 256 141.013 256 286.72h-72.533z" /> -<glyph unicode="" d="M810.667 490.667h-72.533c0-31.787-6.613-61.227-18.56-87.467l52.48-52.48c24.32 41.6 38.613 89.173 38.613 139.947zM639.36 483.627c0 2.347 0.64 4.693 0.64 7.040v256c0 70.827-57.387 128-128 128s-128-57.173-128-128v-7.893l255.36-255.147zM182.4 832l-54.4-54.4 256.427-256.427v-30.72c0-70.613 56.96-128 127.573-128 9.6 0 18.773 1.28 27.733 3.2l70.827-70.827c-30.507-14.080-64-21.973-98.56-21.973-117.76 0-226.133 89.6-226.133 217.6h-72.533c0-145.707 116.053-266.027 256-286.72v-139.733h85.333v139.947c38.613 5.76 75.307 19.2 108.373 38.613l178.56-178.56 54.4 54.187-713.6 713.813z" /> -<glyph unicode="" d="M768 789.333l85.333-170.667h-128l-85.333 170.667h-85.333l85.333-170.667h-128l-85.333 170.667h-85.333l85.333-170.667h-128l-85.333 170.667h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v597.333h-170.667z" /> -<glyph unicode="" d="M170.667 704h-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333zM853.333 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM810.667 490.667h-170.667v-170.667h-85.333v170.667h-170.667v85.333h170.667v170.667h85.333v-170.667h170.667v-85.333z" /> -<glyph unicode="" d="M170.667 704h-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333zM853.333 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM810.667 490.667h-426.667v85.333h426.667v-85.333zM640 320h-256v85.333h256v-85.333zM810.667 661.333h-426.667v85.333h426.667v-85.333z" /> -<glyph unicode="" d="M853.333 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM768 661.333h-128v-234.667c0-58.88-47.787-106.667-106.667-106.667s-106.667 47.787-106.667 106.667 47.787 106.667 106.667 106.667c24.107 0 46.080-8.32 64-21.76v235.093h170.667v-85.333zM170.667 704h-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333z" /> -<glyph unicode="" d="M981.333 448l-104.107 118.613 14.507 157.227-154.027 34.773-80.64 135.68-145.067-62.293-145.067 62.293-80.64-135.68-154.027-34.773 14.507-157.227-104.107-118.613 104.107-118.613-14.507-157.227 154.027-34.773 80.64-135.68 145.067 62.293 145.067-62.293 80.64 135.68 154.027 34.773-14.507 157.227 104.107 118.613zM554.667 234.667h-85.333v85.333h85.333v-85.333zM554.667 405.333h-85.333v256h85.333v-256z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333 0 78.933 27.093 151.253 71.893 209.067l478.507-478.507c-57.813-44.8-130.133-71.893-209.067-71.893zM781.44 238.933l-478.507 478.507c57.813 44.8 130.133 71.893 209.067 71.893 188.587 0 341.333-152.747 341.333-341.333 0-78.933-27.093-151.253-71.893-209.067z" /> -<glyph unicode="" d="M256 149.333h170.667v597.333h-170.667v-597.333zM597.333 746.667v-597.333h170.667v597.333h-170.667z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM469.333 277.333h-85.333v341.333h85.333v-341.333zM640 277.333h-85.333v341.333h85.333v-341.333z" /> -<glyph unicode="" d="M384 277.333h85.333v341.333h-85.333v-341.333zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333zM554.667 277.333h85.333v341.333h-85.333v-341.333z" /> -<glyph unicode="" d="M341.333 746.667v-597.333l469.333 298.667z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM426.667 256v384l256-192-256-192z" /> -<glyph unicode="" d="M426.667 256l256 192-256 192v-384zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333z" /> -<glyph unicode="" d="M597.333 533.333h-512v-85.333h512v85.333zM597.333 704h-512v-85.333h512v85.333zM768 362.667v170.667h-85.333v-170.667h-170.667v-85.333h170.667v-170.667h85.333v170.667h170.667v85.333h-170.667zM85.333 277.333h341.333v85.333h-341.333v-85.333z" /> -<glyph unicode="" d="M682.667 704v85.333c0 47.147-38.187 85.333-85.333 85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-85.333h-256v-554.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v554.667h-256zM426.667 789.333h170.667v-85.333h-170.667v85.333zM384 192v384l320-170.667-320-213.333z" /> -<glyph unicode="" d="M170.667 704h-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333zM853.333 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM810.667 490.667h-170.667v-170.667h-85.333v170.667h-170.667v85.333h170.667v170.667h85.333v-170.667h170.667v-85.333z" /> -<glyph unicode="" d="M640 704h-512v-85.333h512v85.333zM640 533.333h-512v-85.333h512v85.333zM128 277.333h341.333v85.333h-341.333v-85.333zM725.333 704v-349.227c-13.44 4.907-27.52 7.893-42.667 7.893-70.613 0-128-57.387-128-128s57.387-128 128-128 128 57.387 128 128v384h128v85.333h-213.333z" /> -<glyph unicode="" d="M138.027 697.6c-30.933-12.16-52.693-43.307-52.693-78.933v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333h-498.987l352.64 142.293-29.44 71.040-539.52-219.733zM298.667 106.667c-70.613 0-128 57.387-128 128s57.387 128 128 128 128-57.387 128-128-57.387-128-128-128zM853.333 448h-85.333v85.333h-85.333v-85.333h-512v170.667h682.667v-170.667z" /> -<glyph unicode="" d="M896 746.667v-597.333h85.333v597.333h-85.333zM725.333 149.333h85.333v597.333h-85.333v-597.333zM597.333 746.667h-512c-23.467 0-42.667-19.2-42.667-42.667v-512c0-23.467 19.2-42.667 42.667-42.667h512c23.467 0 42.667 19.2 42.667 42.667v512c0 23.467-19.2 42.667-42.667 42.667zM341.333 629.333c52.907 0 96-43.093 96-96 0-53.12-43.093-96-96-96s-96 42.88-96 96c0 52.907 43.093 96 96 96zM533.333 234.667h-384v32c0 64 128 96 192 96s192-32 192-96v-32z" /> -<glyph unicode="" d="M298.667 661.333h426.667v-128l170.667 170.667-170.667 170.667v-128h-512v-256h85.333v170.667zM725.333 234.667h-426.667v128l-170.667-170.667 170.667-170.667v128h512v256h-85.333v-170.667z" /> -<glyph unicode="" d="M298.667 661.333h426.667v-128l170.667 170.667-170.667 170.667v-128h-512v-256h85.333v170.667zM725.333 234.667h-426.667v128l-170.667-170.667 170.667-170.667v128h512v256h-85.333v-170.667zM554.667 320v256h-42.667l-85.333-42.667v-42.667h64v-170.667h64z" /> -<glyph unicode="" d="M512 746.667v170.667l-213.333-213.333 213.333-213.333v170.667c141.44 0 256-114.56 256-256s-114.56-256-256-256-256 114.56-256 256h-85.333c0-188.587 152.747-341.333 341.333-341.333s341.333 152.747 341.333 341.333-152.747 341.333-341.333 341.333z" /> -<glyph unicode="" d="M451.627 568.747l-220.587 220.587-60.373-60.373 220.587-220.587 60.373 60.373zM618.667 789.333l87.253-87.253-535.253-535.040 60.373-60.373 535.253 535.253 87.040-87.253v234.667h-234.667zM632.747 387.627l-60.373-60.373 133.547-133.547-87.253-87.040h234.667v234.667l-87.253-87.253-133.333 133.547z" /> -<glyph unicode="" d="M256 192l362.667 256-362.667 256v-512zM682.667 704v-512h85.333v512h-85.333z" /> -<glyph unicode="" d="M256 704h85.333v-512h-85.333zM405.333 448l362.667-256v512z" /> -<glyph unicode="" d="M336.213 815.36l-54.827 65.28-196.053-164.48 54.827-65.28 196.053 164.48zM938.667 715.947l-196.053 164.48-54.827-65.28 196.053-164.48 54.827 65.28zM511.787 789.333c-212.267 0-383.787-171.947-383.787-384s171.52-384 383.787-384 384.213 171.947 384.213 384-171.947 384-384.213 384zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.547-298.667-298.667-298.667zM384 490.667h154.667l-154.667-179.2v-76.8h256v85.333h-154.667l154.667 179.2v76.8h-256v-85.333z" /> -<glyph unicode="" d="M256 704h512v-512h-512z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM170.667 448h170.667v-85.333h-170.667v85.333zM597.333 192h-426.667v85.333h426.667v-85.333zM853.333 192h-170.667v85.333h170.667v-85.333zM853.333 362.667h-426.667v85.333h426.667v-85.333z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM330.88 266.88l-60.373-60.373c-66.347 66.773-99.84 154.027-99.84 241.493s33.493 174.72 100.053 241.28l60.373-60.373c-49.92-49.707-75.093-115.413-75.093-180.907s24.96-131.2 74.88-181.12zM512 277.333c-94.293 0-170.667 76.373-170.667 170.667s76.373 170.667 170.667 170.667 170.667-76.373 170.667-170.667-76.373-170.667-170.667-170.667zM753.28 206.72l-60.373 60.373c50.133 49.707 75.093 115.413 75.093 180.907s-25.173 131.2-74.88 181.12l60.373 60.373c66.347-66.773 99.84-154.027 99.84-241.493s-33.493-174.72-100.053-241.28zM512 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M725.333 512v149.333c0 23.467-19.2 42.667-42.667 42.667h-512c-23.467 0-42.667-19.2-42.667-42.667v-426.667c0-23.467 19.2-42.667 42.667-42.667h512c23.467 0 42.667 19.2 42.667 42.667v149.333l170.667-170.667v469.333l-170.667-170.667z" /> -<glyph unicode="" d="M896 682.667l-170.667-170.667v149.333c0 23.467-19.2 42.667-42.667 42.667h-263.68l477.013-477.013v455.68zM139.733 874.667l-54.4-54.4 116.267-116.267h-30.933c-23.467 0-42.667-19.2-42.667-42.667v-426.667c0-23.467 19.2-42.667 42.667-42.667h512c8.747 0 16.427 3.2 23.253 7.893l135.893-135.893 54.187 54.4-756.267 756.267z" /> -<glyph unicode="" d="M170.667 704h-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333zM853.333 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM512 341.333v384l256-192-256-192z" /> -<glyph unicode="" d="M789.333 448c0 75.307-43.52 140.373-106.667 171.733v-343.68c63.147 31.573 106.667 96.64 106.667 171.947zM213.333 576v-256h170.667l213.333-213.333v682.667l-213.333-213.333h-170.667z" /> -<glyph unicode="" d="M298.667 576v-256h170.667l213.333-213.333v682.667l-213.333-213.333h-170.667z" /> -<glyph unicode="" d="M704 448c0 75.307-43.52 140.373-106.667 171.733v-94.293l104.747-104.747c1.28 8.96 1.92 18.133 1.92 27.307zM810.667 448c0-40.107-8.747-77.867-23.040-112.64l64.64-64.64c27.733 53.12 43.733 113.28 43.733 177.28 0 182.613-127.787 335.36-298.667 374.187v-88.107c123.307-36.693 213.333-150.827 213.333-286.080zM182.4 832l-54.4-54.4 201.6-201.6h-201.6v-256h170.667l213.333-213.333v286.933l181.547-181.547c-28.587-21.973-60.8-39.68-96.213-50.347v-88.107c58.667 13.44 112.213 40.32 157.227 77.227l87.040-86.827 54.4 54.4-713.6 713.6zM512 789.333l-89.173-89.173 89.173-89.173v178.347z" /> -<glyph unicode="" d="M128 576v-256h170.667l213.333-213.333v682.667l-213.333-213.333h-170.667zM704 448c0 75.307-43.52 140.373-106.667 171.733v-343.68c63.147 31.573 106.667 96.64 106.667 171.947zM597.333 822.187v-88.107c123.307-36.693 213.333-150.827 213.333-286.080s-90.027-249.387-213.333-286.080v-88.107c170.88 38.827 298.667 191.36 298.667 374.187s-127.787 335.36-298.667 374.187z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM640 192h-469.333v170.667h469.333v-170.667zM640 405.333h-469.333v170.667h469.333v-170.667zM853.333 192h-170.667v384h170.667v-384z" /> -<glyph unicode="" d="M512 661.333v170.667h-426.667v-768h853.333v597.333h-426.667zM256 149.333h-85.333v85.333h85.333v-85.333zM256 320h-85.333v85.333h85.333v-85.333zM256 490.667h-85.333v85.333h85.333v-85.333zM256 661.333h-85.333v85.333h85.333v-85.333zM426.667 149.333h-85.333v85.333h85.333v-85.333zM426.667 320h-85.333v85.333h85.333v-85.333zM426.667 490.667h-85.333v85.333h85.333v-85.333zM426.667 661.333h-85.333v85.333h85.333v-85.333zM853.333 149.333h-341.333v85.333h85.333v85.333h-85.333v85.333h85.333v85.333h-85.333v85.333h341.333v-426.667zM768 490.667h-85.333v-85.333h85.333v85.333zM768 320h-85.333v-85.333h85.333v85.333z" /> -<glyph unicode="" d="M282.667 499.413c61.44-120.747 160.213-219.52 281.173-280.96l93.867 94.080c11.733 11.733 28.587 15.147 43.307 10.453 47.787-15.787 99.2-24.32 152.32-24.32 23.68 0 42.667-18.987 42.667-42.667v-149.333c0-23.68-18.987-42.667-42.667-42.667-400.64 0-725.333 324.693-725.333 725.333 0 23.68 19.2 42.667 42.667 42.667h149.333c23.68 0 42.667-18.987 42.667-42.667 0-53.12 8.533-104.533 24.32-152.32 4.693-14.72 1.28-31.573-10.453-43.307l-93.867-94.293z" /> -<glyph unicode="" d="M512 576c-68.48 0-134.4-10.667-196.267-30.72v-132.48c0-16.853-9.813-31.36-23.893-38.4-41.6-20.907-79.787-47.573-113.707-78.933-7.68-7.467-18.133-12.16-29.867-12.16s-22.4 4.693-30.080 12.587l-105.6 105.6c-7.893 7.893-12.587 18.56-12.587 30.293s4.693 22.4 12.587 30.293c129.92 123.52 305.92 199.253 499.413 199.253s369.493-75.733 499.413-199.253c7.893-7.68 12.587-18.56 12.587-30.293s-4.693-22.4-12.587-30.080l-105.6-105.6c-7.68-7.68-18.347-12.587-30.080-12.587-11.52 0-22.187 4.693-29.867 12.16-33.92 31.36-72.107 58.027-113.707 78.933-14.080 7.040-23.893 21.547-23.893 38.4v132.48c-61.867 19.84-127.787 30.507-196.267 30.507z" /> -<glyph unicode="" d="M384 746.667v-85.333h280.96l-494.293-494.293 60.373-60.373 494.293 494.293v-280.96h85.333v426.667z" /> -<glyph unicode="" d="M725.333 88.96l60.373 60.373-145.707 145.707-60.373-60.373 145.707-145.707zM320 618.667h149.333v-238.293l-231.040-231.040 60.373-60.373 256 256v273.707h149.333l-192 192-192-192z" /> -<glyph unicode="" d="M835.627 661.333l-323.627-323.627-238.293 238.293h195.627v85.333h-341.333v-341.333h85.333v195.627l298.667-298.667 384 384z" /> -<glyph unicode="" d="M853.333 728.96l-60.373 60.373-494.293-494.293v280.96h-85.333v-426.667h426.667v85.333h-280.96z" /> -<glyph unicode="" d="M597.333 789.333l97.92-97.92-122.88-122.667 60.373-60.373 122.667 122.88 97.92-97.92v256zM426.667 789.333h-256v-256l97.92 97.92 200.747-200.96v-323.627h85.333v359.040l-225.92 225.707z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM256 576h512v-85.333h-512v85.333zM597.333 362.667h-341.333v85.333h341.333v-85.333zM768 618.667h-512v85.333h512v-85.333z" /> -<glyph unicode="" d="M213.333 405.333h597.333v85.333h-597.333v-85.333zM128 234.667h597.333v85.333h-597.333v-85.333zM298.667 661.333v-85.333h597.333v85.333h-597.333z" /> -<glyph unicode="" d="M938.24 789.333c0 47.147-37.76 85.333-84.907 85.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h597.333l170.667-170.667-0.427 768zM768 362.667h-512v85.333h512v-85.333zM768 490.667h-512v85.333h512v-85.333zM768 618.667h-512v85.333h512v-85.333z" /> -<glyph unicode="" d="M853.333 960h-682.667v-85.333h682.667v85.333zM170.667-64h682.667v85.333h-682.667v-85.333zM853.333 789.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM512 672c52.907 0 96-43.093 96-96 0-53.12-43.093-96-96-96s-96 42.88-96 96c0 52.907 43.093 96 96 96zM725.333 234.667h-426.667v64c0 71.040 142.293 106.667 213.333 106.667s213.333-35.627 213.333-106.667v-64z" /> -<glyph unicode="" d="M725.333 832h-42.667v-213.333h42.667v213.333zM640 746.667h-85.333v42.667h85.333v42.667h-128v-128h85.333v-42.667h-85.333v-42.667h128v128zM768 832v-213.333h42.667v85.333h85.333v128h-128zM853.333 746.667h-42.667v42.667h42.667v-42.667zM853.333 298.667c-53.12 0-104.32 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.747 61.44-219.52 160.213-281.173 280.96l93.867 94.080c11.733 11.733 15.147 28.587 10.453 43.307-15.787 48-24.32 99.413-24.32 152.533 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.68 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667z" /> -<glyph unicode="" d="M512 149.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM256 917.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM256 661.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM256 405.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 746.667c47.147 0 85.333 38.187 85.333 85.333s-38.187 85.333-85.333 85.333-85.333-38.187-85.333-85.333 38.187-85.333 85.333-85.333zM512 405.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 405.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 661.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM512 661.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM512 917.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333 0 78.933 27.093 151.253 71.893 209.067l478.507-478.507c-57.813-44.8-130.133-71.893-209.067-71.893zM781.44 238.933l-478.507 478.507c57.813 44.8 130.133 71.893 209.067 71.893 188.587 0 341.333-152.747 341.333-341.333 0-78.933-27.093-151.253-71.893-209.067z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 618.667l-341.333-213.333-341.333 213.333v85.333l341.333-213.333 341.333 213.333v-85.333z" /> -<glyph unicode="" d="M896 704h-85.333v-384h-554.667v-85.333c0-23.467 19.2-42.667 42.667-42.667h469.333l170.667-170.667v640c0 23.467-19.2 42.667-42.667 42.667zM725.333 448v384c0 23.467-19.2 42.667-42.667 42.667h-554.667c-23.467 0-42.667-19.2-42.667-42.667v-597.333l170.667 170.667h426.667c23.467 0 42.667 19.2 42.667 42.667z" /> -<glyph unicode="" d="M384 832l-170.667-170.24h128v-299.093h85.333v299.093h128l-170.667 170.24zM682.667 234.24v299.093h-85.333v-299.093h-128l170.667-170.24 170.667 170.24h-128z" /> -<glyph unicode="" d="M880.853 69.333l-698.667 698.667-54.187-54.4 118.613-118.613c-108.8-133.973-100.693-331.307 23.893-456.107 66.56-66.56 154.027-100.053 241.28-100.053 76.16 0 152.32 25.387 214.613 75.947l115.2-114.773 54.4 54.4-15.147 14.933zM512 124.373c-68.48 0-132.693 26.667-180.907 74.88-48.427 48.427-75.093 112.64-75.093 181.12 0 56.32 18.347 109.653 51.627 153.813l204.373-204.587v-205.227zM512 742.4v-195.413l309.547-309.547c58.24 126.080 35.84 280.32-68.267 384.427l-241.28 241.28-158.080-158.080 60.373-60.373 97.707 97.707z" /> -<glyph unicode="" d="M753.28 621.653l-241.28 241.493-241.28-241.493c-133.333-133.333-133.333-349.44 0-482.773 66.56-66.56 154.027-100.053 241.28-100.053s174.72 33.28 241.28 100.053c133.333 133.333 133.333 349.44 0 482.773zM512 124.373c-68.48 0-132.693 26.667-180.907 75.093-48.427 48.213-75.093 112.427-75.093 180.907s26.667 132.693 75.093 181.12l180.907 180.907v-618.027z" /> -<glyph unicode="" d="M810.667 874.667h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h170.667l128-128 128 128h170.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM554.667 192h-85.333v85.333h85.333v-85.333zM642.773 522.453l-38.187-39.253c-30.72-30.72-49.92-56.533-49.92-120.533h-85.333v21.333c0 47.147 19.2 89.813 49.92 120.747l53.12 53.76c15.36 15.36 24.96 36.693 24.96 60.16 0 47.147-38.187 85.333-85.333 85.333s-85.333-38.187-85.333-85.333h-85.333c0 94.293 76.373 170.667 170.667 170.667s170.667-76.373 170.667-170.667c0-37.547-15.147-71.467-39.893-96.213z" /> -<glyph unicode="" d="M512 682.667c58.88 0 106.667-47.787 106.667-106.667 0-31.36-13.867-59.307-35.413-78.933l154.88-154.88c41.6 79.36 72.533 161.92 72.533 233.813 0 164.907-133.76 298.667-298.667 298.667-84.48 0-160.64-35.2-214.827-91.52l135.893-135.893c19.413 21.547 47.573 35.413 78.933 35.413zM698.667 273.067l-559.147 558.933-54.187-54.4 135.68-135.68c-4.907-21.12-7.68-43.093-7.68-65.92 0-224 298.667-554.667 298.667-554.667s71.253 78.933 144 185.6l142.933-142.933 54.4 54.4-154.667 154.667z" /> -<glyph unicode="" d="M512 874.667c-164.907 0-298.667-133.76-298.667-298.667 0-224 298.667-554.667 298.667-554.667s298.667 330.667 298.667 554.667c0 164.907-133.76 298.667-298.667 298.667zM512 469.333c-58.88 0-106.667 47.787-106.667 106.667s47.787 106.667 106.667 106.667 106.667-47.787 106.667-106.667-47.787-106.667-106.667-106.667z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM768 362.667h-512v85.333h512v-85.333zM768 490.667h-512v85.333h512v-85.333zM768 618.667h-512v85.333h512v-85.333z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-768l170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M810.24 746.667c0 47.147-37.76 85.333-84.907 85.333h-298.667l-99.84-99.84 483.84-483.84-0.427 498.347zM155.733 794.453l-54.187-54.187 111.787-112v-478.933c0-47.147 38.187-85.333 85.333-85.333h427.093c14.933 0 28.8 4.267 40.96 10.88l80.213-80.213 54.187 54.4-745.387 745.387z" /> -<glyph unicode="" d="M282.667 499.413c61.44-120.747 160.213-219.52 281.173-280.96l93.867 94.080c11.733 11.733 28.587 15.147 43.307 10.453 47.787-15.787 99.2-24.32 152.32-24.32 23.68 0 42.667-18.987 42.667-42.667v-149.333c0-23.68-18.987-42.667-42.667-42.667-400.64 0-725.333 324.693-725.333 725.333 0 23.68 19.2 42.667 42.667 42.667h149.333c23.68 0 42.667-18.987 42.667-42.667 0-53.12 8.533-104.533 24.32-152.32 4.693-14.72 1.28-31.573-10.453-43.307l-93.867-94.293z" /> -<glyph unicode="" d="M749.227 352.427c11.947 29.44 18.773 61.653 18.773 95.573 0 141.44-114.56 256-256 256-33.92 0-66.133-6.827-95.787-18.773l69.333-69.333c8.747 1.493 17.493 2.773 26.453 2.773 94.293 0 170.667-76.373 170.667-170.667 0-9.173-0.853-18.133-2.347-26.667l68.907-68.907zM512 789.333c188.587 0 341.333-152.747 341.333-341.333 0-57.813-14.933-111.787-40.32-159.36l62.72-62.72c39.68 64.64 62.933 140.587 62.933 222.080 0 235.733-191.147 426.667-426.667 426.667-81.493 0-157.44-23.253-222.080-62.933l62.293-62.293c47.573 25.387 101.973 39.893 159.787 39.893zM139.52 853.333l-54.187-54.4 89.813-89.813c-56.107-72.107-89.813-162.56-89.813-261.12 0-157.653 85.76-295.040 213.12-368.853l42.667 73.813c-101.76 58.88-170.453 168.96-170.453 295.040 0 74.88 24.32 144 65.28 200.32l61.227-61.227c-26.027-40.107-41.173-87.68-41.173-139.093 0-94.72 51.413-177.067 127.787-221.44l43.093 74.24c-50.987 29.653-85.547 84.053-85.547 147.2 0 27.52 7.253 53.12 18.773 76.16l67.413-67.413-0.853-8.747c0-47.147 38.187-85.333 85.333-85.333l8.747 0.853 320.853-320.853 54.4 54.4-756.48 756.267z" /> -<glyph unicode="" d="M938.667 832h-853.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h853.333c47.147 0 84.907 38.187 84.907 85.333l0.427 597.333c0 47.147-38.187 85.333-85.333 85.333zM341.333 704c70.613 0 128-57.387 128-128 0-70.827-57.387-128-128-128s-128 57.173-128 128c0 70.613 57.387 128 128 128zM597.333 192h-512v42.667c0 85.333 170.667 132.267 256 132.267s256-46.933 256-132.267v-42.667zM761.6 362.667h69.973l64.427-85.333-85.12-85.12c-55.68 41.813-97.28 101.333-116.48 170.453-7.467 27.307-11.733 55.68-11.733 85.333s4.267 58.027 11.947 85.333c18.987 69.12 60.587 128.64 116.48 170.453l84.907-85.12-64.427-85.333h-69.973c-9.387-26.667-14.933-55.467-14.933-85.333s5.333-58.667 14.933-85.333z" /> -<glyph unicode="" d="M896 618.667v42.667l-128-85.333-128 85.333v-42.667l128-85.333 128 85.333zM938.667 832h-853.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h853.333c47.147 0 84.907 38.187 84.907 85.333l0.427 597.333c0 47.147-38.187 85.333-85.333 85.333zM341.333 704c70.613 0 128-57.387 128-128 0-70.827-57.387-128-128-128s-128 57.173-128 128c0 70.613 57.387 128 128 128zM597.333 192h-512v42.667c0 85.333 170.667 132.267 256 132.267s256-46.933 256-132.267v-42.667zM938.667 448h-341.333v256h341.333v-256z" /> -<glyph unicode="" d="M1011.413 248.747c-129.92 123.52-305.92 199.253-499.413 199.253s-369.493-75.733-499.413-199.253c-7.893-7.68-12.587-18.56-12.587-30.293s4.693-22.4 12.587-30.080l105.6-105.6c7.68-7.68 18.347-12.587 30.080-12.587 11.52 0 22.187 4.693 29.867 12.16 33.92 31.36 72.107 58.027 113.707 78.933 14.080 7.040 23.893 21.547 23.893 38.4v132.48c61.867 19.84 127.787 30.507 196.267 30.507s134.4-10.667 196.267-30.72v-132.48c0-16.853 9.813-31.36 23.893-38.4 41.6-20.907 80-47.573 113.707-78.933 7.68-7.467 18.133-12.16 29.867-12.16s22.4 4.693 30.293 12.587l105.6 105.6c7.68 7.68 12.587 18.347 12.587 30.080-0.213 11.947-4.907 22.827-12.8 30.507zM902.827 693.12l-60.373 60.373-151.893-151.893 60.373-60.373s147.2 150.187 151.893 151.893zM554.667 874.667h-85.333v-213.333h85.333v213.333zM273.067 541.227l60.373 60.373-151.893 151.893-60.373-60.373c4.693-1.707 151.893-151.893 151.893-151.893z" /> -<glyph unicode="" d="M43.093 661.333l-0.427-426.667c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333h-768c-47.147 0-84.907-38.187-84.907-85.333zM810.667 661.333v-426.667h-597.333v426.667h597.333z" /> -<glyph unicode="" d="M725.333 916.907l-426.667 0.427c-47.147 0-84.907-38.187-84.907-85.333v-768c0-47.147 37.76-85.333 84.907-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v768c0 47.147-38.187 84.907-85.333 84.907zM725.333 149.333h-426.667v597.333h426.667v-597.333z" /> -<glyph unicode="" d="M43.093 661.333l-0.427-426.667c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333h-768c-47.147 0-84.907-38.187-84.907-85.333zM810.667 661.333v-426.667h-597.333v426.667h597.333z" /> -<glyph unicode="" d="M725.333 916.907l-426.667 0.427c-47.147 0-84.907-38.187-84.907-85.333v-768c0-47.147 37.76-85.333 84.907-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v768c0 47.147-38.187 84.907-85.333 84.907zM725.333 149.333h-426.667v597.333h426.667v-597.333z" /> -<glyph unicode="" d="M768 789.333l-170.667-170.667h128v-298.667c0-47.147-38.187-85.333-85.333-85.333s-85.333 38.187-85.333 85.333v298.667c0 94.080-76.587 170.667-170.667 170.667s-170.667-76.587-170.667-170.667v-298.667h-128l170.667-170.667 170.667 170.667h-128v298.667c0 47.147 38.187 85.333 85.333 85.333s85.333-38.187 85.333-85.333v-298.667c0-94.080 76.587-170.667 170.667-170.667s170.667 76.587 170.667 170.667v298.667h128l-170.667 170.667z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM384 490.667h-85.333v85.333h85.333v-85.333zM554.667 490.667h-85.333v85.333h85.333v-85.333zM725.333 490.667h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M789.333 704c-129.707 0-234.667-104.96-234.667-234.667 0-56.747 20.053-108.8 53.547-149.333h-192.64c33.493 40.533 53.547 92.587 53.547 149.333 0 129.707-104.96 234.667-234.667 234.667s-234.453-104.96-234.453-234.667 104.96-234.667 234.667-234.667h554.667c129.707 0 234.667 104.96 234.667 234.667s-104.96 234.667-234.667 234.667zM234.667 320c-82.56 0-149.333 66.773-149.333 149.333s66.773 149.333 149.333 149.333 149.333-66.773 149.333-149.333-66.773-149.333-149.333-149.333zM789.333 320c-82.56 0-149.333 66.773-149.333 149.333s66.773 149.333 149.333 149.333 149.333-66.773 149.333-149.333-66.773-149.333-149.333-149.333z" /> -<glyph unicode="" d="M539.733 533.333c-35.2 99.413-129.707 170.667-241.067 170.667-141.44 0-256-114.56-256-256s114.56-256 256-256c111.36 0 205.867 71.253 241.067 170.667h185.6v-170.667h170.667v170.667h85.333v170.667h-441.6zM298.667 362.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M810.667 405.333h-256v-256h-85.333v256h-256v85.333h256v256h85.333v-256h256v-85.333z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM725.333 405.333h-170.667v-170.667h-85.333v170.667h-170.667v85.333h170.667v170.667h85.333v-170.667h170.667v-85.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM725.333 405.333h-170.667v-170.667h-85.333v170.667h-170.667v85.333h170.667v170.667h85.333v-170.667h170.667v-85.333z" /> -<glyph unicode="" d="M554.667 661.333h-85.333v-170.667h-170.667v-85.333h170.667v-170.667h85.333v170.667h170.667v85.333h-170.667v170.667zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333z" /> -<glyph unicode="" d="M876.587 737.067l-59.093 71.68c-11.947 14.080-29.653 23.253-49.493 23.253h-512c-19.84 0-37.547-9.173-49.28-23.253l-59.093-71.68c-12.373-14.933-19.627-33.707-19.627-54.4v-533.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v533.333c0 20.693-7.253 39.467-19.413 54.4zM512 213.333l-234.667 234.667h149.333v85.333h170.667v-85.333h149.333l-234.667-234.667zM218.667 746.667l34.773 42.667h512l39.893-42.667h-586.667z" /> -<glyph unicode="" d="M938.667 832h-640c-29.44 0-52.693-14.933-68.053-37.547l-230.613-346.24 230.613-346.24c15.36-22.613 38.613-37.973 68.053-37.973h640c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 295.040l-60.373-60.373-152.96 152.96-152.96-152.96-60.373 60.373 152.96 152.96-152.96 152.96 60.373 60.373 152.96-152.96 152.96 152.96 60.373-60.373-152.96-152.96 152.96-152.96z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM170.667 448c0 188.587 152.747 341.333 341.333 341.333 78.933 0 151.253-27.093 209.067-71.893l-478.507-478.507c-44.8 57.813-71.893 130.133-71.893 209.067zM512 106.667c-78.933 0-151.253 27.093-209.067 71.893l478.507 478.507c44.8-57.813 71.893-130.133 71.893-209.067 0-188.587-152.747-341.333-341.333-341.333z" /> -<glyph unicode="" d="M810.667 686.293l-60.373 60.373-238.293-238.293-238.293 238.293-60.373-60.373 238.293-238.293-238.293-238.293 60.373-60.373 238.293 238.293 238.293-238.293 60.373 60.373-238.293 238.293z" /> -<glyph unicode="" d="M682.667 917.333h-512c-47.147 0-85.333-38.187-85.333-85.333v-597.333h85.333v597.333h512v85.333zM810.667 746.667h-469.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h469.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 64h-469.333v597.333h469.333v-597.333z" /> -<glyph unicode="" d="M411.307 634.027c9.6 21.333 15.36 45.013 15.36 69.973 0 94.293-76.373 170.667-170.667 170.667s-170.667-76.373-170.667-170.667 76.373-170.667 170.667-170.667c24.96 0 48.64 5.76 69.973 15.36l100.693-100.693-100.693-100.693c-21.333 9.6-45.013 15.36-69.973 15.36-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667c0 24.96-5.76 48.64-15.36 69.973l100.693 100.693 298.667-298.667h128v42.667l-527.36 527.36zM256 618.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM256 106.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM512 426.667c-11.733 0-21.333 9.6-21.333 21.333s9.6 21.333 21.333 21.333 21.333-9.6 21.333-21.333-9.6-21.333-21.333-21.333zM810.667 832l-256-256 85.333-85.333 298.667 298.667v42.667z" /> -<glyph unicode="" d="M810.667 874.667h-178.56c-17.493 49.493-64.427 85.333-120.107 85.333s-102.613-35.84-120.107-85.333h-178.56c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM512 874.667c23.467 0 42.667-18.987 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 18.987-42.667 42.667 19.2 42.667 42.667 42.667zM810.667 106.667h-597.333v682.667h85.333v-128h426.667v128h85.333v-682.667z" /> -<glyph unicode="" d="M128 224v-160h160l472.107 472.107-160 160-472.107-472.107zM883.413 659.413c16.64 16.64 16.64 43.733 0 60.373l-99.627 99.627c-16.64 16.64-43.733 16.64-60.373 0l-78.080-78.080 160-160 78.080 78.080z" /> -<glyph unicode="" d="M938.24 618.667c0 30.72-16 57.387-40.107 72.533l-386.133 226.133-386.133-226.133c-24.107-15.147-40.533-41.813-40.533-72.533v-426.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333l-0.427 426.667zM512 405.333l-352.427 220.373 352.427 206.293 352.427-206.293-352.427-220.373z" /> -<glyph unicode="" d="M426.667 192h170.667v85.333h-170.667v-85.333zM128 704v-85.333h768v85.333h-768zM256 405.333h512v85.333h-512v-85.333z" /> -<glyph unicode="" d="M614.4 704l-17.067 85.333h-384v-725.333h85.333v298.667h238.933l17.067-85.333h298.667v426.667z" /> -<glyph unicode="" d="M512 618.667v170.667l341.333-341.333-341.333-341.333v170.667h-341.333v341.333z" /> -<glyph unicode="" d="M196.053 666.24c29.867 30.507 59.733 57.813 73.173 52.267 21.12-8.747-0.427-44.373-12.8-65.067-10.667-17.92-122.027-165.76-122.027-269.227 0-54.613 20.267-99.84 57.387-127.147 32-23.68 74.027-30.933 112.64-19.627 45.653 13.44 83.2 59.52 130.56 117.973 51.627 63.573 120.747 146.773 174.080 146.773 69.547 0 70.4-43.093 75.093-76.587-161.707-27.733-229.76-156.8-229.76-229.547s61.44-132.053 136.747-132.053c69.333 0 183.253 56.747 200.107 260.267h104.747v106.667h-105.387c-6.4 70.4-46.507 178.987-171.947 178.987-96 0-178.56-81.493-210.56-121.387-24.747-30.933-87.68-105.6-97.493-116.267-10.88-12.587-28.8-35.84-47.573-35.84-18.987 0-30.507 35.627-15.573 82.133 14.933 46.72 59.733 122.027 78.933 149.973 33.493 48.64 55.253 82.133 55.253 139.947 0 93.867-69.973 123.307-107.093 123.307-56.32 0-105.387-42.667-116.267-53.547-15.147-15.36-27.947-27.947-37.333-39.467l75.093-72.533zM592.427 168.32c-13.227 0-31.36 11.093-31.36 30.933 0 25.6 30.933 93.867 122.667 117.973-13.227-114.987-61.44-148.907-91.307-148.907z" /> -<glyph unicode="" d="M810.667 832h-597.76c-47.147 0-84.48-38.187-84.48-85.333l-0.427-597.333c0-47.147 37.76-85.333 84.907-85.333h597.76c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 320h-170.667c0-70.613-57.387-128-128-128s-128 57.387-128 128h-171.093v426.667h597.76v-426.667zM682.667 533.333h-85.333v128h-170.667v-128h-85.333l170.667-170.667 170.667 170.667z" /> -<glyph unicode="" d="M166.4 448c0 72.96 59.307 132.267 132.267 132.267h170.667v81.067h-170.667c-117.76 0-213.333-95.573-213.333-213.333s95.573-213.333 213.333-213.333h170.667v81.067h-170.667c-72.96 0-132.267 59.307-132.267 132.267zM341.333 405.333h341.333v85.333h-341.333v-85.333zM725.333 661.333h-170.667v-81.067h170.667c72.96 0 132.267-59.307 132.267-132.267s-59.307-132.267-132.267-132.267h-170.667v-81.067h170.667c117.76 0 213.333 95.573 213.333 213.333s-95.573 213.333-213.333 213.333z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 618.667l-341.333-213.333-341.333 213.333v85.333l341.333-213.333 341.333 213.333v-85.333z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 618.667l-341.333-213.333-341.333 213.333v85.333l341.333-213.333 341.333 213.333v-85.333z" /> -<glyph unicode="" d="M784.853 507.733c-78.507 68.907-181.333 110.933-294.187 110.933-198.4 0-366.293-129.28-424.96-308.053l100.907-33.28c44.8 136.32 172.8 234.667 324.053 234.667 83.413 0 159.147-30.72 218.24-80.427l-154.24-154.24h384v384l-153.813-153.6z" /> -<glyph unicode="" d="M810.667 405.333h-597.333v85.333h597.333v-85.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM725.333 405.333h-426.667v85.333h426.667v-85.333z" /> -<glyph unicode="" d="M298.667 490.667v-85.333h426.667v85.333h-426.667zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333z" /> -<glyph unicode="" d="M426.667 576v170.667l-298.667-298.667 298.667-298.667v174.933c213.333 0 362.667-68.267 469.333-217.6-42.667 213.333-170.667 426.667-469.333 469.333z" /> -<glyph unicode="" d="M298.667 618.667v128l-298.667-298.667 298.667-298.667v128l-170.667 170.667 170.667 170.667zM554.667 576v170.667l-298.667-298.667 298.667-298.667v174.933c213.333 0 362.667-68.267 469.333-217.6-42.667 213.333-170.667 426.667-469.333 469.333z" /> -<glyph unicode="" d="M671.147 832h-318.293l-224.853-224.853v-318.080l224.853-225.067h318.080l225.067 224.853v318.293l-224.853 224.853zM512 221.867c-30.507 0-55.467 24.747-55.467 55.467 0 30.507 24.96 55.467 55.467 55.467s55.467-24.747 55.467-55.467c0-30.72-24.96-55.467-55.467-55.467zM554.667 405.333h-85.333v256h85.333v-256z" /> -<glyph unicode="" d="M725.333 832h-512c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v512l-170.667 170.667zM512 149.333c-70.613 0-128 57.387-128 128s57.387 128 128 128 128-57.387 128-128-57.387-128-128-128zM640 576h-426.667v170.667h426.667v-170.667z" /> -<glyph unicode="" d="M128 746.667h85.333v85.333c-47.147 0-85.333-38.187-85.333-85.333zM128 405.333h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333zM128 576h85.333v85.333h-85.333v-85.333zM554.667 832h-85.333v-85.333h85.333v85.333zM810.667 832v-85.333h85.333c0 47.147-38.187 85.333-85.333 85.333zM213.333 64v85.333h-85.333c0-47.147 38.187-85.333 85.333-85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM384 832h-85.333v-85.333h85.333v85.333zM469.333 64h85.333v85.333h-85.333v-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM810.667 64c47.147 0 85.333 38.187 85.333 85.333h-85.333v-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM640 64h85.333v85.333h-85.333v-85.333zM640 746.667h85.333v85.333h-85.333v-85.333zM298.667 234.667h426.667v426.667h-426.667v-426.667zM384 576h256v-256h-256v256z" /> -<glyph unicode="" d="M85.76 64l895.573 384-895.573 384-0.427-298.667 640-85.333-640-85.333z" /> -<glyph unicode="" d="M128 192h256v85.333h-256v-85.333zM128 704v-85.333h768v85.333h-768zM128 405.333h512v85.333h-512v-85.333z" /> -<glyph unicode="" d="M213.333 234.667v-85.333h597.333v85.333h-597.333zM405.333 413.867h213.333l38.4-93.867h89.6l-202.667 469.333h-64l-202.667-469.333h89.6l38.4 93.867zM512 704.853l79.787-214.187h-159.573l79.787 214.187z" /> -<glyph unicode="" d="M533.333 618.667c-112.853 0-215.68-42.027-294.4-110.933l-153.6 153.6v-384h384l-154.24 154.24c59.093 49.707 134.827 80.427 218.24 80.427 151.253 0 279.253-98.347 324.053-234.667l100.907 33.28c-58.667 178.773-226.56 308.053-424.96 308.053z" /> -<glyph unicode="" d="M938.667 715.947l-196.053 164.48-54.827-65.28 196.053-164.48 54.827 65.28zM336.213 815.36l-54.827 65.28-196.053-164.48 54.827-65.28 196.053 164.48zM533.333 618.667h-64v-256l202.453-121.813 32.213 52.693-170.667 101.12v224zM511.787 789.333c-212.267 0-383.787-171.947-383.787-384s171.52-384 383.787-384 384.213 171.947 384.213 384-171.947 384-384.213 384zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.547-298.667-298.667-298.667z" /> -<glyph unicode="" d="M938.667 714.667l-196.267 164.267-55.467-66.133 196.267-164.267 55.467 66.133zM334.933 814.933l-55.467 66.133-194.133-166.4 55.467-66.133 194.133 166.4zM533.333 618.667h-64v-256l202.667-121.6 32 53.333-170.667 100.267v224zM512 789.333c-213.333 0-384-172.8-384-384s170.667-384 384-384c211.2 0 384 172.8 384 384s-172.8 384-384 384zM512 106.667c-164.267 0-298.667 134.4-298.667 298.667s134.4 298.667 298.667 298.667 298.667-134.4 298.667-298.667c0-166.4-134.4-298.667-298.667-298.667z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333zM533.333 661.333h-64v-256l223.787-134.4 32.213 52.48-192 113.92z" /> -<glyph unicode="" d="M336.213 815.36l-54.827 65.28-196.053-164.48 54.827-65.28 196.053 164.48zM938.667 715.947l-196.053 164.48-54.827-65.28 196.053-164.48 54.827 65.28zM511.787 789.333c-212.267 0-383.787-171.947-383.787-384s171.52-384 383.787-384 384.213 171.947 384.213 384-171.947 384-384.213 384zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.547-298.667-298.667-298.667zM554.667 576h-85.333v-128h-128v-85.333h128v-128h85.333v128h128v85.333h-128v128z" /> -<glyph unicode="" d="M554.667 576v234.667c0 35.413-28.587 64-64 64s-64-28.587-64-64v-157.013l333.867-333.867 135.467-42.453v85.333l-341.333 213.333zM128 734.933l212.693-212.693-255.36-159.573v-85.333l341.333 106.667v-234.667l-85.333-64v-64l149.333 42.667 149.333-42.667v64l-85.333 64v158.933l244.267-244.267 54.4 54.4-670.933 670.933-54.4-54.4z" /> -<glyph unicode="" d="M896 277.333v85.333l-341.333 213.333v234.667c0 35.413-28.587 64-64 64s-64-28.587-64-64v-234.667l-341.333-213.333v-85.333l341.333 106.667v-234.667l-85.333-64v-64l149.333 42.667 149.333-42.667v64l-85.333 64v234.667l341.333-106.667z" /> -<glyph unicode="" d="M298.667 234.667v-156.373c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v156.373h-426.88zM725.333 732.373c0 31.573-25.387 56.96-56.96 56.96h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-497.707h426.667v497.707z" /> -<glyph unicode="" d="M725.333 732.373c0 31.573-25.387 56.96-56.96 56.96h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-412.373h426.667v412.373zM298.667 320v-241.707c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v241.707h-426.88z" /> -<glyph unicode="" d="M725.333 732.373c0 31.573-25.387 56.96-56.96 56.96h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-327.040h426.667v327.040zM298.667 405.333v-327.040c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v327.040h-426.88z" /> -<glyph unicode="" d="M725.333 732.373c0 31.573-25.387 56.96-56.96 56.96h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-241.707h426.667v241.707zM298.667 490.667v-412.373c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v412.373h-426.88z" /> -<glyph unicode="" d="M725.333 732.373c0 31.573-25.387 56.96-56.96 56.96h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-156.373h426.667v156.373zM298.667 576v-497.707c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v497.707h-426.88z" /> -<glyph unicode="" d="M725.333 732.373c0 31.573-25.387 56.96-56.96 56.96h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-113.707h426.667v113.707zM298.667 618.667v-540.373c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v540.373h-426.88z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-654.293c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v654.293c-0.213 31.573-25.6 56.96-57.173 56.96zM554.667 192h-85.333v85.333h85.333v-85.333zM554.667 362.667h-85.333v213.333h85.333v-213.333z" /> -<glyph unicode="" d="M469.333 106.667v128h-170.667v-156.373c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v156.373h-187.733l-68.48-128zM668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-497.707h170.667v106.667h-85.333l170.667 320v-234.667h85.333l-102.4-192h187.733v497.707c0 31.573-25.387 56.96-56.96 56.96z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-391.040h85.333l170.667 320v-234.667h85.333l-45.44-85.333h130.773v391.040c0 31.573-25.387 56.96-56.96 56.96zM469.333 106.667v234.667h-170.667v-263.040c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v263.040h-130.773l-125.44-234.667z" /> -<glyph unicode="" d="M617.173 384l-147.84-277.333v234.667h-85.333l22.827 42.667h-108.16v-305.707c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v305.707h-108.373zM668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-348.373h108.16l147.84 277.333v-234.667h85.333l-22.827-42.667h108.16v348.373c0 31.573-25.387 56.96-56.96 56.96z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-241.707h164.907l91.093 170.667v-170.667h170.667v241.707c0 31.573-25.387 56.96-56.96 56.96zM554.667 426.667h85.333l-170.667-320v234.667h-85.333l79.573 149.333h-164.907v-412.373c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v412.373h-170.667v-64z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-156.373h210.56l45.44 85.333v-85.333h170.667v156.373c0 31.573-25.387 56.96-56.96 56.96zM554.667 426.667h85.333l-170.667-320v234.667h-85.333l125.227 234.667h-210.56v-497.707c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v497.707h-170.667v-149.333z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-113.707h233.173l22.827 42.667v-42.667h170.667v113.707c0 31.573-25.387 56.96-56.96 56.96zM554.667 426.667h85.333l-170.667-320v234.667h-85.333l147.84 277.333h-233.173v-540.373c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v540.373h-170.667v-192z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-654.293c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v654.293c-0.213 31.573-25.6 56.96-57.173 56.96zM469.333 106.667v234.667h-85.333l170.667 320v-234.667h85.333l-170.667-320z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-654.293c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v654.293c-0.213 31.573-25.6 56.96-57.173 56.96z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-654.293c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v654.293c-0.213 31.573-25.6 56.96-57.173 56.96z" /> -<glyph unicode="" d="M668.373 789.333h-71.040v85.333h-170.667v-85.333h-71.040c-31.573 0-56.96-25.387-56.96-56.96v-654.293c0-31.36 25.387-56.96 56.96-56.96h312.96c31.36 0 56.96 25.387 56.96 56.96v654.293c-0.213 31.573-25.6 56.96-57.173 56.96zM552.533 194.133h-81.067v81.067h81.067v-81.067zM610.133 418.56s-16.213-17.92-28.587-30.293c-20.693-20.693-35.413-48.853-35.413-68.267h-68.267c0 35.413 19.627 65.067 39.68 85.12l39.68 40.32c11.52 11.52 18.773 27.52 18.773 45.227 0 35.413-28.587 64-64 64s-64-28.587-64-64h-64c0 70.613 57.387 128 128 128s128-57.387 128-128c0-28.16-11.307-53.76-29.867-72.107z" /> -<glyph unicode="" d="M755.413 631.253l-243.413 243.413h-42.667v-323.627l-195.627 195.627-60.373-60.373 238.293-238.293-238.293-238.293 60.373-60.373 195.627 195.627v-323.627h42.667l243.413 243.413-183.040 183.253 183.040 183.253zM554.667 711.253l80.213-80.213-80.213-80v160.213zM634.88 264.747l-80.213-80v160.427l80.213-80.427z" /> -<glyph unicode="" d="M298.667 448l-85.333 85.333-85.333-85.333 85.333-85.333 85.333 85.333zM755.413 631.253l-243.413 243.413h-42.667v-323.627l-195.627 195.627-60.373-60.373 238.293-238.293-238.293-238.293 60.373-60.373 195.627 195.627v-323.627h42.667l243.413 243.413-183.040 183.253 183.040 183.253zM554.667 711.253l80.213-80.213-80.213-80v160.213zM634.88 264.747l-80.213-80v160.427l80.213-80.427zM810.667 533.333l-85.333-85.333 85.333-85.333 85.333 85.333-85.333 85.333z" /> -<glyph unicode="" d="M554.667 707.627l80.213-80.213-68.267-68.267 60.373-60.373 128.64 128.64-243.627 243.627h-42.667v-214.613l85.333-85.333v136.533zM231.040 785.707l-60.373-60.373 280.96-280.96-238.293-238.293 60.373-60.373 195.627 195.627v-323.627h42.667l183.253 183.253 97.92-97.92 60.16 60.373-622.293 622.293zM554.667 181.12v160.213l80.213-80.213-80.213-80z" /> -<glyph unicode="" d="M607.573 447.573l98.987-98.987c11.947 30.933 18.773 64.427 18.773 99.413 0 34.773-6.613 68.053-18.347 98.773l-99.413-99.2zM833.28 673.493l-53.973-53.973c26.667-51.413 42.027-109.653 42.027-171.733s-15.36-120.107-42.027-171.733l51.2-51.2c41.173 66.133 65.493 143.573 65.493 226.773 0 81.493-23.253 157.227-62.72 221.867zM670.080 631.253l-243.413 243.413h-42.667v-323.627l-195.627 195.627-60.373-60.373 238.293-238.293-238.293-238.293 60.373-60.373 195.627 195.627v-323.627h42.667l243.413 243.413-183.040 183.253 183.040 183.253zM469.333 711.253l80.213-80.213-80.213-80v160.213zM549.547 264.747l-80.213-80v160.427l80.213-80.427z" /> -<glyph unicode="" d="M462.933 420.267h98.133l-49.067 155.733-49.067-155.733zM853.333 589.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893l141.44 141.44-141.44 141.44zM610.133 277.333l-29.867 85.333h-136.533l-29.867-85.333h-81.067l136.533 384h85.333l136.533-384h-81.067z" /> -<glyph unicode="" d="M853.333 589.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893l141.44 141.44-141.44 141.44zM512 192c-141.44 0-256 114.56-256 256s114.56 256 256 256 256-114.56 256-256-114.56-256-256-256zM512 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667z" /> -<glyph unicode="" d="M853.333 306.56l141.44 141.44-141.44 141.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893zM512 192c-141.44 0-256 114.56-256 256s114.56 256 256 256 256-114.56 256-256-114.56-256-256-256z" /> -<glyph unicode="" d="M853.333 306.56l141.44 141.44-141.44 141.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893zM512 192v512c141.44 0 256-114.56 256-256s-114.56-256-256-256z" /> -<glyph unicode="" d="M554.667 872.533v-129.28c144.64-20.693 256-144.853 256-295.253 0-38.187-7.467-74.667-20.48-108.16l110.933-65.493c23.68 53.12 37.547 111.573 37.547 173.653 0 221.227-168.32 402.987-384 424.533zM512 149.333c-164.907 0-298.667 133.76-298.667 298.667 0 150.4 111.36 274.56 256 295.253v129.28c-215.893-21.333-384-203.307-384-424.533 0-235.733 190.72-426.667 426.453-426.667 141.227 0 266.027 68.907 343.68 174.507l-110.72 65.28c-54.613-68.053-138.453-111.787-232.747-111.787z" /> -<glyph unicode="" d="M298.667 743.040h426.667v-85.333h85.333v170.667c0 47.147-38.187 84.907-85.333 84.907l-426.667 0.427c-47.147 0-85.333-38.187-85.333-85.333v-170.667h85.333v85.333zM657.707 248.747l195.627 195.627-195.627 195.627-60.373-60.373 135.253-135.253-135.253-135.467 60.373-60.16zM426.667 308.907l-135.253 135.253 135.253 135.467-60.373 60.373-195.627-195.627 195.627-195.627 60.373 60.16zM725.333 145.707h-426.667v85.333h-85.333v-170.667c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v170.667h-85.333v-85.333z" /> -<glyph unicode="" d="M170.667 704h768v85.333h-768c-47.147 0-85.333-38.187-85.333-85.333v-469.333h-85.333v-128h597.333v128h-426.667v469.333zM981.333 618.667h-256c-23.467 0-42.667-19.2-42.667-42.667v-426.667c0-23.467 19.2-42.667 42.667-42.667h256c23.467 0 42.667 19.2 42.667 42.667v426.667c0 23.467-19.2 42.667-42.667 42.667zM938.667 234.667h-170.667v298.667h170.667v-298.667z" /> -<glyph unicode="" d="M896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h213.333v-85.333h341.333v85.333h213.333c47.147 0 84.907 38.187 84.907 85.333l0.427 512c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-768v512h768v-512zM810.667 618.667h-469.333v-85.333h469.333v85.333zM810.667 448h-469.333v-85.333h469.333v85.333zM298.667 618.667h-85.333v-85.333h85.333v85.333zM298.667 448h-85.333v-85.333h85.333v85.333z" /> -<glyph unicode="" d="M512 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667zM893.44 490.667c-19.627 177.92-160.853 319.147-338.773 338.773v87.893h-85.333v-87.893c-177.92-19.627-319.147-160.853-338.773-338.773h-87.893v-85.333h87.893c19.627-177.92 160.853-319.147 338.773-338.773v-87.893h85.333v87.893c177.92 19.627 319.147 160.853 338.773 338.773h87.893v85.333h-87.893zM512 149.333c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667z" /> -<glyph unicode="" d="M893.44 490.667c-19.627 177.92-160.853 319.147-338.773 338.773v87.893h-85.333v-87.893c-177.92-19.627-319.147-160.853-338.773-338.773h-87.893v-85.333h87.893c19.627-177.92 160.853-319.147 338.773-338.773v-87.893h85.333v87.893c177.92 19.627 319.147 160.853 338.773 338.773h87.893v85.333h-87.893zM512 149.333c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667z" /> -<glyph unicode="" d="M893.44 490.667c-19.627 177.92-160.853 319.147-338.773 338.773v87.893h-85.333v-87.893c-48.213-5.333-93.44-19.84-134.613-41.387l64-64c34.987 14.507 73.173 22.613 113.28 22.613 164.907 0 298.667-133.76 298.667-298.667 0-40.107-8.107-78.293-22.4-113.28l64-64c21.547 41.173 35.84 86.4 41.173 134.613h87.893v85.333h-87.893zM128 777.6l86.827-86.827c-45.653-55.893-75.947-124.587-84.267-200.107h-87.893v-85.333h87.893c19.627-177.92 160.853-319.147 338.773-338.773v-87.893h85.333v87.893c75.52 8.32 144.213 38.827 200.107 84.48l86.827-87.040 54.4 54.187-713.6 713.813-54.4-54.4zM693.973 211.627c-50.347-38.827-113.28-62.293-181.973-62.293-164.907 0-298.667 133.76-298.667 298.667 0 68.693 23.467 131.627 62.293 181.973l418.347-418.347z" /> -<glyph unicode="" d="M893.44 487.040c-19.627 177.92-160.853 319.147-338.773 338.773v87.893h-85.333v-87.893c-48.213-5.333-93.44-19.84-134.613-41.387l64-64c34.987 14.293 73.173 22.4 113.28 22.4 164.907 0 298.667-133.76 298.667-298.667 0-40.107-8.107-78.293-22.4-113.28l64-64c21.547 41.173 35.84 86.4 41.173 134.613h87.893v85.333h-87.893zM128 773.973l86.827-86.827c-45.653-55.893-76.16-124.587-84.48-200.107h-87.68v-85.333h87.893c19.627-177.92 160.853-319.147 338.773-338.773v-87.893h85.333v87.893c75.52 8.32 144.213 38.827 200.107 84.48l87.040-87.040 54.187 54.187-713.6 713.813-54.4-54.4zM693.973 208c-50.347-38.827-113.493-62.293-181.973-62.293-164.907 0-298.667 133.76-298.667 298.667 0 68.693 23.467 131.627 62.293 181.973l418.347-418.347z" /> -<glyph unicode="" d="M893.44 487.040c-19.627 177.92-160.853 319.147-338.773 338.773v87.893h-85.333v-87.893c-177.92-19.627-319.147-160.853-338.773-338.773h-87.893v-85.333h87.893c19.627-177.92 160.853-319.147 338.773-338.773v-87.893h85.333v87.893c177.92 19.627 319.147 160.853 338.773 338.773h87.893v85.333h-87.893zM512 145.707c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667z" /> -<glyph unicode="" d="M298.667 192h85.333v512h-85.333v-512zM469.333 21.333h85.333v853.333h-85.333v-853.333zM128 362.667h85.333v170.667h-85.333v-170.667zM640 192h85.333v512h-85.333v-512zM810.667 533.333v-170.667h85.333v170.667h-85.333z" /> -<glyph unicode="" d="M85.333 21.333h853.333v853.333zM725.333 661.333l-640-640h640z" /> -<glyph unicode="" d="M512.427 43.093l496.213 618.24c-19.2 14.507-210.133 170.667-496.64 170.667s-477.44-156.16-496.64-170.667l496.64-618.667 0.427 0.427zM150.827 492.587l361.173-449.92 0.427 0.427 360.96 449.493c-18.347 14.080-156.16 126.080-361.387 126.080-205.44 0-343.040-112-361.173-126.080z" /> -<glyph unicode="" d="M853.333 871.040h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM853.333 103.040h-682.667v682.667h682.667v-682.667zM768 700.373h-213.333c-47.147 0-85.333-38.187-85.333-85.333v-97.067c-25.387-14.72-42.667-42.027-42.667-73.6 0-47.147 38.187-85.333 85.333-85.333s85.333 38.187 85.333 85.333c0 31.573-17.28 58.667-42.667 73.6v97.067h128v-341.333h-341.333v341.333h85.333v85.333h-170.667v-512h512v512z" /> -<glyph unicode="" d="M170.667 789.333h298.667v85.333h-298.667c-47.147 0-85.333-38.187-85.333-85.333v-298.667h85.333v298.667zM426.667 405.333l-170.667-213.333h512l-128 170.667-86.613-115.627-126.72 158.293zM725.333 597.333c0 35.413-28.587 64-64 64s-64-28.587-64-64 28.587-64 64-64 64 28.587 64 64zM853.333 874.667h-298.667v-85.333h298.667v-298.667h85.333v298.667c0 47.147-38.187 85.333-85.333 85.333zM853.333 106.667h-298.667v-85.333h298.667c47.147 0 85.333 38.187 85.333 85.333v298.667h-85.333v-298.667zM170.667 405.333h-85.333v-298.667c0-47.147 38.187-85.333 85.333-85.333h298.667v85.333h-298.667v298.667z" /> -<glyph unicode="" d="M554.667 405.333v-341.333h341.333v341.333h-341.333zM128 64h341.333v341.333h-341.333v-341.333zM128 832v-341.333h341.333v341.333h-341.333zM710.613 888.107l-241.28-241.493 241.28-241.28 241.28 241.28-241.28 241.493z" /> -<glyph unicode="" d="M896 746.667h-768c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 234.667h-597.333v426.667h597.333v-426.667zM426.667 277.333h170.667c23.68 0 42.667 19.2 42.667 42.667v128c0 23.467-18.987 42.667-42.667 42.667v42.667c0 47.147-38.187 85.333-85.333 85.333s-85.333-38.187-85.333-85.333v-42.667c-23.68 0-42.667-19.2-42.667-42.667v-128c0-23.467 18.987-42.667 42.667-42.667zM460.8 533.333c0 28.373 22.827 51.2 51.2 51.2s51.2-23.040 51.2-51.2v-42.667h-102.4v42.667z" /> -<glyph unicode="" d="M426.667 277.333h170.667c23.68 0 42.667 19.2 42.667 42.667v128c0 23.467-18.987 42.667-42.667 42.667v42.667c0 47.147-38.187 85.333-85.333 85.333s-85.333-38.187-85.333-85.333v-42.667c-23.68 0-42.667-19.2-42.667-42.667v-128c0-23.467 18.987-42.667 42.667-42.667zM460.8 533.333c0 28.373 22.827 51.2 51.2 51.2s51.2-23.040 51.2-51.2v-42.667h-102.4v42.667zM725.333 917.333h-426.667c-47.147 0-85.333-38.187-85.333-85.333v-768c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v768c0 47.147-38.187 85.333-85.333 85.333zM725.333 149.333h-426.667v597.333h426.667v-597.333z" /> -<glyph unicode="" d="M992.213 415.147l-109.653 109.653-60.373-60.373 94.507-94.507-241.28-241.28-482.773 482.773 241.28 241.28 89.387-89.387 60.373 60.373-104.533 104.533c-24.96 24.96-65.493 24.96-90.453 0l-271.573-271.573c-24.96-24.96-24.96-65.493 0-90.453l512.853-512.853c24.96-24.96 65.493-24.96 90.453 0l271.573 271.573c25.173 24.747 25.173 65.28 0.213 90.24zM361.173 85.973c-139.307 66.133-239.36 201.6-254.507 362.027h-64c21.76-262.827 241.493-469.333 509.867-469.333 9.6 0 18.773 0.853 28.373 1.493l-162.773 162.773-56.96-56.96zM682.667 576h213.333c23.68 0 42.667 19.2 42.667 42.667v170.667c0 23.467-18.987 42.667-42.667 42.667v21.333c0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667v-21.333c-23.68 0-42.667-19.2-42.667-42.667v-170.667c0-23.467 18.987-42.667 42.667-42.667zM716.8 853.333c0 40.107 32.427 72.533 72.533 72.533s72.533-32.427 72.533-72.533v-21.333h-145.067v21.333z" /> -<glyph unicode="" d="M703.36 852.693c139.307-66.133 239.36-201.6 254.507-362.027h64c-21.76 262.827-241.493 469.333-509.867 469.333-9.6 0-18.773-0.853-28.373-1.493l162.773-162.773 56.96 56.96zM436.48 885.547c-24.96 24.96-65.493 24.96-90.453 0l-271.573-271.573c-24.96-24.96-24.96-65.493 0-90.453l512.853-512.853c24.96-24.96 65.493-24.96 90.453 0l271.573 271.573c24.96 24.96 24.96 65.493 0 90.453l-512.853 512.853zM632.747 55.893l-513.067 512.853 271.573 271.573 512.853-512.853-271.36-271.573zM320.64 43.307c-139.307 66.133-239.36 201.6-254.507 362.027h-64c21.76-262.827 241.493-469.333 509.867-469.333 9.6 0 18.773 0.853 28.373 1.493l-162.773 162.773-56.96-56.96z" /> -<glyph unicode="" d="M768 874.667h-341.333l-255.147-256-0.853-512c0-46.933 38.4-85.333 85.333-85.333h512c46.933 0 85.333 38.4 85.333 85.333v682.667c0 46.933-38.4 85.333-85.333 85.333zM512 618.667h-85.333v170.667h85.333v-170.667zM640 618.667h-85.333v170.667h85.333v-170.667zM768 618.667h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M384 277.333h277.333c58.88 0 106.667 47.787 106.667 106.667s-47.787 106.667-106.667 106.667h-2.133c-10.453 72.32-72.107 128-147.2 128-59.733 0-110.933-35.413-134.827-86.187h-7.040c-64.213-6.827-114.133-61.227-114.133-127.147 0-70.613 57.387-128 128-128zM896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 148.693h-768v598.613h768v-598.613z" /> -<glyph unicode="" d="M85.333 21.333h853.333v853.333z" /> -<glyph unicode="" d="M85.333 21.333h853.333v853.333zM512 448l-426.667-426.667h426.667z" /> -<glyph unicode="" d="M85.333 21.333h853.333v853.333zM597.333 533.333l-512-512h512z" /> -<glyph unicode="" d="M85.333 21.333h853.333v853.333zM725.333 661.333l-640-640h640z" /> -<glyph unicode="" d="M85.333 21.333h853.333v853.333z" /> -<glyph unicode="" d="M938.667 618.667v256l-853.333-853.333h682.667v597.333zM853.333 21.333h85.333v85.333h-85.333v-85.333zM853.333 533.333v-341.333h85.333v341.333h-85.333z" /> -<glyph unicode="" d="M938.667 618.667v256l-853.333-853.333h682.667v597.333zM853.333 533.333v-341.333h85.333v341.333h-85.333zM512 21.333v426.667l-426.667-426.667h426.667zM853.333 21.333h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M938.667 618.667v256l-853.333-853.333h682.667v597.333zM597.333 21.333v512l-512-512h512zM853.333 533.333v-341.333h85.333v341.333h-85.333zM853.333 21.333h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M938.667 618.667v256l-853.333-853.333h682.667v597.333zM725.333 21.333v640l-640-640h640zM853.333 533.333v-341.333h85.333v341.333h-85.333zM853.333 21.333h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M853.333 192h85.333v341.333h-85.333v-341.333zM853.333 21.333h85.333v85.333h-85.333v-85.333zM85.333 21.333h682.667v597.333h170.667v256l-853.333-853.333z" /> -<glyph unicode="" d="M810.24 746.667c0 47.147-37.76 85.333-84.907 85.333h-298.667l-99.84-99.84 483.84-483.84-0.427 498.347zM155.733 794.453l-54.187-54.187 111.787-112v-478.933c0-47.147 38.187-85.333 85.333-85.333h427.093c14.933 0 28.8 4.267 40.96 10.88l80.213-80.213 54.187 54.4-745.387 745.387z" /> -<glyph unicode="" d="M853.333 668.587v-561.92h-561.92l561.92 561.92zM938.667 874.667l-853.333-853.333h853.333v853.333z" /> -<glyph unicode="" d="M896 917.333l-366.507-366.507 366.507-366.507v733.013zM203.733 768l-54.4-54.187 271.573-271.573-378.24-378.24h756.267l85.333-85.333 54.4 54.4-734.933 734.933z" /> -<glyph unicode="" d="M512.427 43.093l496.213 618.24c-19.2 14.507-210.133 170.667-496.64 170.667s-477.44-156.16-496.64-170.667l496.64-618.667 0.427 0.427z" /> -<glyph unicode="" d="M512.427 43.093l496.213 618.24c-19.2 14.507-210.133 170.667-496.64 170.667s-477.44-156.16-496.64-170.667l496.64-618.667 0.427 0.427zM284.587 325.973l227.413-283.307 0.213 0.213 227.2 283.093c-11.307 8.747-98.133 79.36-227.413 79.36s-216.107-70.613-227.413-79.36z" /> -<glyph unicode="" d="M512.427 43.093l496.213 618.24c-19.2 14.507-210.133 170.667-496.64 170.667s-477.44-156.16-496.64-170.667l496.64-618.667 0.427 0.427zM204.373 426.027l307.627-383.36 0.213 0.427 307.413 382.933c-15.36 11.947-132.693 107.307-307.627 107.307s-292.267-95.36-307.627-107.307z" /> -<glyph unicode="" d="M512.427 43.093l496.213 618.24c-19.2 14.507-210.133 170.667-496.64 170.667s-477.44-156.16-496.64-170.667l496.64-618.667 0.427 0.427zM150.827 492.587l361.173-449.92 0.427 0.427 360.96 449.493c-18.347 14.080-156.16 126.080-361.387 126.080-205.44 0-343.040-112-361.173-126.080z" /> -<glyph unicode="" d="M512.427 43.093l496.213 618.24c-19.2 14.507-210.133 170.667-496.64 170.667s-477.44-156.16-496.64-170.667l496.64-618.667 0.427 0.427z" /> -<glyph unicode="" d="M1008.64 661.333c-19.2 14.507-210.133 170.667-496.64 170.667-64.213 0-123.307-8.107-177.067-20.48l440.747-440.32 232.96 290.133zM139.733 898.347l-54.4-54.4 87.68-87.68c-91.307-42.027-147.627-87.467-157.653-95.147l496.64-618.453 0.427 0.427 166.4 207.36 141.44-141.44 54.4 54.4-734.933 734.933z" /> -<glyph unicode="" d="M85.333 106.667h853.333v170.667h-853.333v-170.667zM170.667 234.667h85.333v-85.333h-85.333v85.333zM85.333 789.333v-170.667h853.333v170.667h-853.333zM256 661.333h-85.333v85.333h85.333v-85.333zM85.333 362.667h853.333v170.667h-853.333v-170.667zM170.667 490.667h85.333v-85.333h-85.333v85.333z" /> -<glyph unicode="" d="M640 661.333v-170.667h42.667v-85.333h-128v341.333h85.333l-128 170.667-128-170.667h85.333v-341.333h-128v88.32c30.080 15.573 51.2 46.080 51.2 82.347 0 51.84-42.027 93.867-93.867 93.867s-93.867-42.027-93.867-93.867c0-36.267 21.12-66.773 51.2-82.347v-88.32c0-47.147 38.187-85.333 85.333-85.333h128v-130.133c-30.293-15.573-51.2-46.72-51.2-83.2 0-51.84 42.027-93.867 93.867-93.867s93.867 42.027 93.867 93.867c0 36.48-20.907 67.627-51.2 83.2v130.133h128c47.147 0 85.333 38.187 85.333 85.333v85.333h42.667v170.667h-170.667z" /> -<glyph unicode="" d="M874.667 554.667c11.947 0 23.253-1.707 34.773-3.413l114.56 152.747c-142.72 107.093-320 170.667-512 170.667s-369.28-63.573-512-170.667l512-682.667 149.333 199.040v120.96c0 117.76 95.573 213.333 213.333 213.333zM981.333 277.333v64c0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667v-64c-23.467 0-42.667-19.2-42.667-42.667v-170.667c0-23.467 19.2-42.667 42.667-42.667h213.333c23.467 0 42.667 19.2 42.667 42.667v170.667c0 23.467-19.2 42.667-42.667 42.667zM938.667 277.333h-128v64c0 35.413 28.587 64 64 64s64-28.587 64-64v-64z" /> -<glyph unicode="" d="M512 490.667c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 405.333c0 141.44-114.56 256-256 256s-256-114.56-256-256c0-94.72 51.413-177.067 127.787-221.44l43.093 74.24c-50.987 29.653-85.547 84.053-85.547 147.2 0 94.293 76.373 170.667 170.667 170.667s170.667-76.373 170.667-170.667c0-63.147-34.56-117.547-85.547-146.987l43.093-74.24c76.373 44.16 127.787 126.507 127.787 221.227zM512 832c-235.733 0-426.667-190.933-426.667-426.667 0-157.653 85.76-295.040 213.12-368.853l42.667 73.813c-101.76 58.88-170.453 168.96-170.453 295.040 0 188.587 152.747 341.333 341.333 341.333s341.333-152.747 341.333-341.333c0-126.080-68.693-236.16-170.453-295.253l42.667-73.813c127.36 74.027 213.12 211.413 213.12 369.067 0 235.733-191.147 426.667-426.667 426.667z" /> -<glyph unicode="" d="M704 704v-490.667c0-94.293-76.373-170.667-170.667-170.667s-170.667 76.373-170.667 170.667v533.333c0 58.88 47.787 106.667 106.667 106.667s106.667-47.787 106.667-106.667v-448c0-23.467-18.987-42.667-42.667-42.667s-42.667 19.2-42.667 42.667v405.333h-64v-405.333c0-58.88 47.787-106.667 106.667-106.667s106.667 47.787 106.667 106.667v448c0 94.293-76.373 170.667-170.667 170.667s-170.667-76.373-170.667-170.667v-533.333c0-129.707 105.173-234.667 234.667-234.667s234.667 104.96 234.667 234.667v490.667h-64z" /> -<glyph unicode="" d="M503.467 494.933c-96.853 25.173-128 50.987-128 91.52 0 46.507 42.88 79.147 115.2 79.147 75.947 0 104.107-36.267 106.667-89.6h94.293c-2.773 73.6-47.787 140.587-136.96 162.56v93.44h-128v-92.16c-82.773-18.133-149.333-71.467-149.333-154.027 0-98.56 81.707-147.627 200.533-176.213 106.88-25.6 128-62.933 128-103.040 0-29.227-20.693-76.16-115.2-76.16-87.893 0-122.667 39.467-127.147 89.6h-94.080c5.333-93.44 75.093-145.707 157.227-163.413v-92.587h128v91.733c82.987 16 149.333 64 149.333 151.68 0 120.747-103.68 162.133-200.533 187.52z" /> -<glyph unicode="" d="M128 832v-768h768v768h-768zM469.333 149.333h-256v256h256v-256zM469.333 490.667h-256v256h256v-256zM810.667 149.333h-256v256h256v-256zM810.667 490.667h-256v256h256v-256z" /> -<glyph unicode="" d="M384 490.667h-85.333v-85.333h85.333v85.333zM554.667 320h-85.333v-85.333h85.333v85.333zM384 832h-85.333v-85.333h85.333v85.333zM554.667 490.667h-85.333v-85.333h85.333v85.333zM213.333 832h-85.333v-85.333h85.333v85.333zM554.667 661.333h-85.333v-85.333h85.333v85.333zM725.333 490.667h-85.333v-85.333h85.333v85.333zM554.667 832h-85.333v-85.333h85.333v85.333zM725.333 832h-85.333v-85.333h85.333v85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM213.333 661.333h-85.333v-85.333h85.333v85.333zM810.667 832v-85.333h85.333v85.333h-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM213.333 490.667h-85.333v-85.333h85.333v85.333zM128 64h768v85.333h-768v-85.333zM213.333 320h-85.333v-85.333h85.333v85.333z" /> -<glyph unicode="" d="M298.667 746.667h85.333v85.333h-85.333v-85.333zM298.667 405.333h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333zM469.333 234.667h85.333v85.333h-85.333v-85.333zM469.333 64h85.333v85.333h-85.333v-85.333zM128 64h85.333v85.333h-85.333v-85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM128 405.333h85.333v85.333h-85.333v-85.333zM128 576h85.333v85.333h-85.333v-85.333zM128 746.667h85.333v85.333h-85.333v-85.333zM469.333 405.333h85.333v85.333h-85.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM810.667 64h85.333v85.333h-85.333v-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM469.333 576h85.333v85.333h-85.333v-85.333zM810.667 832v-85.333h85.333v85.333h-85.333zM469.333 746.667h85.333v85.333h-85.333v-85.333zM640 64h85.333v85.333h-85.333v-85.333zM640 405.333h85.333v85.333h-85.333v-85.333zM640 746.667h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M757.333 661.333l-160 160-426.667-426.667v-160h160l426.667 426.667zM883.413 787.413c16.64 16.64 16.64 43.733 0 60.373l-99.627 99.627c-16.64 16.64-43.733 16.64-60.373 0l-83.413-83.413 160-160 83.413 83.413zM0 106.667h1024v-170.667h-1024z" /> -<glyph unicode="" d="M128 64h85.333v85.333h-85.333v-85.333zM213.333 661.333h-85.333v-85.333h85.333v85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333zM213.333 832h-85.333v-85.333h85.333v85.333zM384 832h-85.333v-85.333h85.333v85.333zM725.333 832h-85.333v-85.333h85.333v85.333zM554.667 661.333h-85.333v-85.333h85.333v85.333zM554.667 832h-85.333v-85.333h85.333v85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM469.333 64h85.333v85.333h-85.333v-85.333zM128 405.333h768v85.333h-768v-85.333zM810.667 832v-85.333h85.333v85.333h-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM469.333 234.667h85.333v85.333h-85.333v-85.333zM640 64h85.333v85.333h-85.333v-85.333zM810.667 64h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M128 64h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333zM213.333 661.333h-85.333v-85.333h85.333v85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM384 832h-85.333v-85.333h85.333v85.333zM213.333 832h-85.333v-85.333h85.333v85.333zM725.333 832h-85.333v-85.333h85.333v85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM810.667 832v-85.333h85.333v85.333h-85.333zM640 64h85.333v85.333h-85.333v-85.333zM554.667 832h-85.333v-341.333h-341.333v-85.333h341.333v-341.333h85.333v341.333h341.333v85.333h-341.333v341.333zM810.667 64h85.333v85.333h-85.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M469.333 64h85.333v85.333h-85.333v-85.333zM469.333 234.667h85.333v85.333h-85.333v-85.333zM469.333 746.667h85.333v85.333h-85.333v-85.333zM469.333 576h85.333v85.333h-85.333v-85.333zM469.333 405.333h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333zM298.667 746.667h85.333v85.333h-85.333v-85.333zM298.667 405.333h85.333v85.333h-85.333v-85.333zM128 64h85.333v768h-85.333v-768zM810.667 576h85.333v85.333h-85.333v-85.333zM640 64h85.333v85.333h-85.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM810.667 832v-85.333h85.333v85.333h-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM810.667 64h85.333v85.333h-85.333v-85.333zM640 405.333h85.333v85.333h-85.333v-85.333zM640 746.667h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M554.667 661.333h-85.333v-85.333h85.333v85.333zM554.667 490.667h-85.333v-85.333h85.333v85.333zM725.333 490.667h-85.333v-85.333h85.333v85.333zM128 832v-768h768v768h-768zM810.667 149.333h-597.333v597.333h597.333v-597.333zM554.667 320h-85.333v-85.333h85.333v85.333zM384 490.667h-85.333v-85.333h85.333v85.333z" /> -<glyph unicode="" d="M298.667 64h85.333v85.333h-85.333v-85.333zM128 746.667h85.333v85.333h-85.333v-85.333zM298.667 746.667h85.333v85.333h-85.333v-85.333zM298.667 405.333h85.333v85.333h-85.333v-85.333zM128 64h85.333v85.333h-85.333v-85.333zM469.333 64h85.333v85.333h-85.333v-85.333zM128 405.333h85.333v85.333h-85.333v-85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM128 576h85.333v85.333h-85.333v-85.333zM469.333 234.667h85.333v85.333h-85.333v-85.333zM640 405.333h85.333v85.333h-85.333v-85.333zM810.667 832v-768h85.333v768h-85.333zM640 64h85.333v85.333h-85.333v-85.333zM640 746.667h85.333v85.333h-85.333v-85.333zM469.333 405.333h85.333v85.333h-85.333v-85.333zM469.333 746.667h85.333v85.333h-85.333v-85.333zM469.333 576h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M640 64h85.333v85.333h-85.333v-85.333zM810.667 64h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333zM469.333 64h85.333v85.333h-85.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM128 832v-768h85.333v682.667h682.667v85.333h-768zM810.667 576h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M298.667 64h85.333v85.333h-85.333v-85.333zM298.667 405.333h85.333v85.333h-85.333v-85.333zM469.333 405.333h85.333v85.333h-85.333v-85.333zM469.333 64h85.333v85.333h-85.333v-85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM128 64h85.333v85.333h-85.333v-85.333zM128 405.333h85.333v85.333h-85.333v-85.333zM128 576h85.333v85.333h-85.333v-85.333zM469.333 234.667h85.333v85.333h-85.333v-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM128 832v-85.333h768v85.333h-768zM810.667 234.667h85.333v85.333h-85.333v-85.333zM640 64h85.333v85.333h-85.333v-85.333zM469.333 576h85.333v85.333h-85.333v-85.333zM810.667 64h85.333v85.333h-85.333v-85.333zM640 405.333h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M128 576h85.333v85.333h-85.333v-85.333zM128 746.667h85.333v85.333h-85.333v-85.333zM298.667 64h85.333v85.333h-85.333v-85.333zM298.667 405.333h85.333v85.333h-85.333v-85.333zM128 405.333h85.333v85.333h-85.333v-85.333zM128 64h85.333v85.333h-85.333v-85.333zM128 234.667h85.333v85.333h-85.333v-85.333zM298.667 746.667h85.333v85.333h-85.333v-85.333zM810.667 234.667h85.333v85.333h-85.333v-85.333zM469.333 64h85.333v768h-85.333v-768zM810.667 64h85.333v85.333h-85.333v-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM810.667 832v-85.333h85.333v85.333h-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM640 746.667h85.333v85.333h-85.333v-85.333zM640 64h85.333v85.333h-85.333v-85.333zM640 405.333h85.333v85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M298.667 320v-85.333h426.667v85.333h-426.667zM128 64h768v85.333h-768v-85.333zM128 405.333h768v85.333h-768v-85.333zM298.667 661.333v-85.333h426.667v85.333h-426.667zM128 832v-85.333h768v85.333h-768z" /> -<glyph unicode="" d="M128 64h768v85.333h-768v-85.333zM128 234.667h768v85.333h-768v-85.333zM128 405.333h768v85.333h-768v-85.333zM128 576h768v85.333h-768v-85.333zM128 832v-85.333h768v85.333h-768z" /> -<glyph unicode="" d="M640 320h-512v-85.333h512v85.333zM640 661.333h-512v-85.333h512v85.333zM128 405.333h768v85.333h-768v-85.333zM128 64h768v85.333h-768v-85.333zM128 832v-85.333h768v85.333h-768z" /> -<glyph unicode="" d="M128 64h768v85.333h-768v-85.333zM384 234.667h512v85.333h-512v-85.333zM128 405.333h768v85.333h-768v-85.333zM384 576h512v85.333h-512v-85.333zM128 832v-85.333h768v85.333h-768z" /> -<glyph unicode="" d="M665.6 499.627c41.173 28.8 70.4 75.307 70.4 119.040 0 96.213-74.453 170.667-170.667 170.667h-266.667v-597.333h300.373c89.387 0 158.293 72.533 158.293 161.707 0 64.853-36.907 120.107-91.733 145.92zM426.667 682.667h128c35.413 0 64-28.587 64-64s-28.587-64-64-64h-128v128zM576 298.667h-149.333v128h149.333c35.413 0 64-28.587 64-64s-28.587-64-64-64z" /> -<glyph unicode="" d="M139.52 746.667l-54.187-54.4 297.387-297.387-105.387-245.547h128l66.987 156.16 241.493-241.493 54.187 54.4-628.48 628.267zM256 746.667v-7.68l120.32-120.32h102.187l-30.72-71.467 89.6-89.6 69.12 161.067h246.827v128h-597.333z" /> -<glyph unicode="" d="M706.56 578.56l-381.44 381.44-60.373-60.373 101.547-101.547-219.52-219.52c-24.96-24.96-24.96-65.493 0-90.453l234.667-234.667c12.373-12.587 28.8-18.773 45.227-18.773s32.853 6.187 45.227 18.773l234.667 234.667c24.96 24.96 24.96 65.493 0 90.453zM222.080 533.333l204.587 204.373 204.587-204.373h-409.173zM810.667 469.333s-85.333-92.373-85.333-149.333c0-47.147 38.187-85.333 85.333-85.333s85.333 38.187 85.333 85.333c0 56.96-85.333 149.333-85.333 149.333zM0 106.667h1024v-170.667h-1024z" /> -<glyph unicode="" d="M768 362.667c0 170.667-256 460.8-256 460.8s-56.747-64.427-116.693-150.187l366.293-366.293c4.053 17.92 6.4 36.48 6.4 55.68zM730.453 229.547l-505.6 505.6-54.187-54.4 141.653-141.653c-32.64-62.293-56.32-124.8-56.32-176.427 0-141.44 114.56-256 256-256 64.853 0 123.733 24.32 168.747 64l112.427-112.427 54.187 54.4-116.907 116.907z" /> -<glyph unicode="" d="M0 106.667h1024v-170.667h-1024zM469.333 832l-234.667-597.333h96l48 128h266.667l48-128h96l-234.667 597.333h-85.333zM410.667 448l101.333 270.293 101.333-270.293h-202.667z" /> -<glyph unicode="" d="M469.333 234.667h426.667v85.333h-426.667v-85.333zM128 448l170.667-170.667v341.333l-170.667-170.667zM128 64h768v85.333h-768v-85.333zM128 832v-85.333h768v85.333h-768zM469.333 576h426.667v85.333h-426.667v-85.333zM469.333 405.333h426.667v85.333h-426.667v-85.333z" /> -<glyph unicode="" d="M128 64h768v85.333h-768v-85.333zM128 618.667v-341.333l170.667 170.667-170.667 170.667zM469.333 234.667h426.667v85.333h-426.667v-85.333zM128 832v-85.333h768v85.333h-768zM469.333 576h426.667v85.333h-426.667v-85.333zM469.333 405.333h426.667v85.333h-426.667v-85.333z" /> -<glyph unicode="" d="M426.667 789.333v-128h94.507l-146.347-341.333h-118.827v-128h341.333v128h-94.507l146.347 341.333h118.827v128z" /> -<glyph unicode="" d="M256 661.333h106.667l-149.333 149.333-149.333-149.333h106.667v-426.667h-106.667l149.333-149.333 149.333 149.333h-106.667v426.667zM426.667 746.667v-85.333h512v85.333h-512zM426.667 149.333h512v85.333h-512v-85.333zM426.667 405.333h512v85.333h-512v-85.333z" /> -<glyph unicode="" d="M170.667 512c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64zM170.667 768c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64zM170.667 248.96c-31.36 0-56.96-25.387-56.96-56.96s25.6-56.96 56.96-56.96 56.96 25.387 56.96 56.96-25.6 56.96-56.96 56.96zM298.667 149.333h597.333v85.333h-597.333v-85.333zM298.667 405.333h597.333v85.333h-597.333v-85.333zM298.667 746.667v-85.333h597.333v85.333h-597.333z" /> -<glyph unicode="" d="M85.333 234.667h85.333v-21.333h-42.667v-42.667h42.667v-21.333h-85.333v-42.667h128v170.667h-128v-42.667zM128 618.667h42.667v170.667h-85.333v-42.667h42.667v-128zM85.333 490.667h76.8l-76.8-89.6v-38.4h128v42.667h-76.8l76.8 89.6v38.4h-128v-42.667zM298.667 746.667v-85.333h597.333v85.333h-597.333zM298.667 149.333h597.333v85.333h-597.333v-85.333zM298.667 405.333h597.333v85.333h-597.333v-85.333z" /> -<glyph unicode="" d="M768 789.333v42.667c0 23.467-19.2 42.667-42.667 42.667h-512c-23.467 0-42.667-19.2-42.667-42.667v-170.667c0-23.467 19.2-42.667 42.667-42.667h512c23.467 0 42.667 19.2 42.667 42.667v42.667h42.667v-170.667h-426.667v-469.333c0-23.467 19.2-42.667 42.667-42.667h85.333c23.467 0 42.667 19.2 42.667 42.667v384h341.333v341.333h-128z" /> -<glyph unicode="" d="M256 234.667h128l85.333 170.667v256h-256v-256h128zM597.333 234.667h128l85.333 170.667v256h-256v-256h128z" /> -<glyph unicode="" d="M384 789.333v-128h213.333v-512h128v512h213.333v128h-554.667zM128 448h128v-298.667h128v298.667h128v128h-384v-128z" /> -<glyph unicode="" d="M426.667 149.333h170.667v128h-170.667v-128zM213.333 789.333v-128h213.333v-128h170.667v128h213.333v128h-597.333zM128 362.667h768v85.333h-768v-85.333z" /> -<glyph unicode="" d="M768 789.333h-512v-85.333l277.333-256-277.333-256v-85.333h512v128h-298.667l213.333 213.333-213.333 213.333h298.667z" /> -<glyph unicode="" d="M384 533.333v-213.333h85.333v469.333h85.333v-469.333h85.333v469.333h85.333v85.333h-341.333c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667zM896 192l-170.667 170.667v-128h-512v-85.333h512v-128l170.667 170.667z" /> -<glyph unicode="" d="M512 234.667c141.44 0 256 114.56 256 256v341.333h-106.667v-341.333c0-82.56-66.773-149.333-149.333-149.333s-149.333 66.773-149.333 149.333v341.333h-106.667v-341.333c0-141.44 114.56-256 256-256zM213.333 149.333v-85.333h597.333v85.333h-597.333z" /> -<glyph unicode="" d="M426.667 533.333v-213.333h85.333v469.333h85.333v-469.333h85.333v469.333h85.333v85.333h-341.333c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667zM341.333 234.667v128l-170.667-170.667 170.667-170.667v128h512v85.333h-512z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM384 234.667h-85.333v298.667h85.333v-298.667zM554.667 234.667h-85.333v426.667h85.333v-426.667zM725.333 234.667h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h597.333l170.667-170.667v768c0 47.147-38.187 85.333-85.333 85.333zM768 362.667h-512v85.333h512v-85.333zM768 490.667h-512v85.333h512v-85.333zM768 618.667h-512v85.333h512v-85.333z" /> -<glyph unicode="" d="M256 874.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-682.667c0-47.147 37.76-85.333 84.907-85.333h512.427c47.147 0 85.333 38.187 85.333 85.333v512l-256 256h-341.333zM554.667 576v234.667l234.667-234.667h-234.667z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333zM661.333 490.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM362.667 490.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM512 213.333c99.413 0 183.68 62.080 217.813 149.333h-435.627c34.133-87.253 118.4-149.333 217.813-149.333z" /> -<glyph unicode="" d="M725.333 448h-213.333v-213.333h213.333v213.333zM682.667 917.333v-85.333h-341.333v85.333h-85.333v-85.333h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333h-42.667v85.333h-85.333zM810.667 149.333h-597.333v469.333h597.333v-469.333z" /> -<glyph unicode="" d="M166.4 448c0 72.96 59.307 132.267 132.267 132.267h170.667v81.067h-170.667c-117.76 0-213.333-95.573-213.333-213.333s95.573-213.333 213.333-213.333h170.667v81.067h-170.667c-72.96 0-132.267 59.307-132.267 132.267zM341.333 405.333h341.333v85.333h-341.333v-85.333zM725.333 661.333h-170.667v-81.067h170.667c72.96 0 132.267-59.307 132.267-132.267s-59.307-132.267-132.267-132.267h-170.667v-81.067h170.667c117.76 0 213.333 95.573 213.333 213.333s-95.573 213.333-213.333 213.333z" /> -<glyph unicode="" d="M896 149.333v597.333c0 47.147-38.187 85.333-85.333 85.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333zM362.667 384l106.667-128.213 149.333 192.213 192-256h-597.333l149.333 192z" /> -<glyph unicode="" d="M725.333 88.96l60.373 60.373-145.707 145.707-60.373-60.373 145.707-145.707zM320 618.667h149.333v-238.293l-231.040-231.040 60.373-60.373 256 256v273.707h149.333l-192 192-192-192z" /> -<glyph unicode="" d="M938.24 789.333c0 47.147-37.76 85.333-84.907 85.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h597.333l170.667-170.667-0.427 768z" /> -<glyph unicode="" d="M128 224v-160h160l472.107 472.107-160 160-472.107-472.107zM883.413 659.413c16.64 16.64 16.64 43.733 0 60.373l-99.627 99.627c-16.64 16.64-43.733 16.64-60.373 0l-78.080-78.080 160-160 78.080 78.080z" /> -<glyph unicode="" d="M213.333 789.333v-85.333h597.333v85.333h-597.333zM213.333 362.667h170.667v-256h256v256h170.667l-298.667 298.667-298.667-298.667z" /> -<glyph unicode="" d="M682.667 405.333h-128v426.667h-85.333v-426.667h-128l170.667-170.667 170.667 170.667zM170.667 149.333v-85.333h682.667v85.333h-682.667z" /> -<glyph unicode="" d="M341.333 149.333h128v-170.667h85.333v170.667h128l-170.667 170.667-170.667-170.667zM682.667 746.667h-128v170.667h-85.333v-170.667h-128l170.667-170.667 170.667 170.667zM170.667 490.667v-85.333h682.667v85.333h-682.667z" /> -<glyph unicode="" d="M341.333 490.667h128v-426.667h85.333v426.667h128l-170.667 170.667-170.667-170.667zM170.667 832v-85.333h682.667v85.333h-682.667z" /> -<glyph unicode="" d="M170.667 149.333h256v85.333h-256v-85.333zM853.333 746.667h-682.667v-85.333h682.667v85.333zM725.333 490.667h-554.667v-85.333h565.333c47.147 0 85.333-38.187 85.333-85.333s-38.187-85.333-85.333-85.333h-96v85.333l-128-128 128-128v85.333h85.333c94.080 0 170.667 76.587 170.667 170.667s-76.587 170.667-170.667 170.667z" /> -<glyph unicode="" d="M320 192c-129.707 0-234.667 105.173-234.667 234.667s104.96 234.667 234.667 234.667h448c94.293 0 170.667-76.373 170.667-170.667s-76.373-170.667-170.667-170.667h-362.667c-58.88 0-106.667 47.787-106.667 106.667s47.787 106.667 106.667 106.667h320v-64h-320c-23.467 0-42.667-18.987-42.667-42.667s19.2-42.667 42.667-42.667h362.667c58.88 0 106.667 47.787 106.667 106.667s-47.787 106.667-106.667 106.667h-448c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667h405.333v-64h-405.333z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-230.187-69.973-283.733-172.16-128.213-13.867-228.267-122.453-228.267-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.68 203.947-198.187 211.84z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM704 277.333h-362.667c-70.613 0-128 57.387-128 128s57.387 128 128 128l5.76-0.64c18.987 73.813 85.333 128.64 164.907 128.64 94.293 0 170.667-76.373 170.667-170.667h21.333c58.88 0 106.667-47.787 106.667-106.667s-47.787-106.667-106.667-106.667z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-230.187-69.973-283.733-172.16-128.213-13.867-228.267-122.453-228.267-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.68 203.947-198.187 211.84zM426.667 234.667l-149.333 149.333 60.373 60.373 88.96-88.96 220.8 220.8 60.373-60.373-281.173-281.173z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-230.187-69.973-283.733-172.16-128.213-13.867-228.267-122.453-228.267-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.68 203.947-198.187 211.84zM725.333 405.333l-213.333-213.333-213.333 213.333h128v170.667h170.667v-170.667h128z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-62.933 0-121.6-18.56-171.093-49.92l62.293-62.293c32.64 16.853 69.547 26.88 108.8 26.88 129.707 0 234.667-104.96 234.667-234.667v-21.333h64c70.613 0 128-57.387 128-128 0-48.427-27.093-90.027-66.773-111.787l61.867-61.867c54.4 38.613 90.24 101.76 90.24 173.653 0 112.64-87.68 203.947-198.187 211.84zM128 734.933l117.333-116.907c-136.107-5.76-245.333-117.76-245.333-255.36 0-141.44 114.56-256 256-256h500.267l85.333-85.333 54.4 54.187-713.6 713.813-54.4-54.4zM329.6 533.333l341.333-341.333h-414.933c-94.293 0-170.667 76.373-170.667 170.667s76.373 170.667 170.667 170.667h73.6z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-230.187-69.973-283.733-172.16-128.213-13.867-228.267-122.453-228.267-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.68 203.947-198.187 211.84zM810.667 192h-554.667c-94.293 0-170.667 76.373-170.667 170.667s76.373 170.667 170.667 170.667h30.293c27.947 98.347 118.187 170.667 225.707 170.667 129.707 0 234.667-104.96 234.667-234.667v-21.333h64c70.613 0 128-57.387 128-128s-57.387-128-128-128z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-230.187-69.973-283.733-172.16-128.213-13.867-228.267-122.453-228.267-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.68 203.947-198.187 211.84zM597.333 405.333v-170.667h-170.667v170.667h-128l213.333 213.333 213.333-213.333h-128z" /> -<glyph unicode="" d="M810.667 576h-170.667v256h-256v-256h-170.667l298.667-298.667 298.667 298.667zM213.333 192v-85.333h597.333v85.333h-597.333z" /> -<glyph unicode="" d="M384 277.333h256v256h170.667l-298.667 298.667-298.667-298.667h170.667zM213.333 192h597.333v-85.333h-597.333z" /> -<glyph unicode="" d="M426.667 789.333h-256c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333h-341.333l-85.333 85.333z" /> -<glyph unicode="" d="M853.333 704h-341.333l-85.333 85.333h-256c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM853.333 192h-682.667v426.667h682.667v-426.667z" /> -<glyph unicode="" d="M853.333 704h-341.333l-85.333 85.333h-256c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM640 576c47.147 0 85.333-38.187 85.333-85.333s-38.187-85.333-85.333-85.333-85.333 38.187-85.333 85.333 38.187 85.333 85.333 85.333zM810.667 234.667h-341.333v42.667c0 56.96 113.707 85.333 170.667 85.333s170.667-28.373 170.667-85.333v-42.667z" /> -<glyph unicode="" d="M896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-128h85.333v128h768v-597.333h-298.667v-85.333h298.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM42.667 192v-128h128c0 70.613-57.387 128-128 128zM42.667 362.667v-85.333c117.76 0 213.333-95.573 213.333-213.333h85.333c0 164.907-133.76 298.667-298.667 298.667zM42.667 533.333v-85.333c212.053 0 384-171.947 384-384h85.333c0 259.2-210.133 469.333-469.333 469.333z" /> -<glyph unicode="" d="M42.667 192v-128h128c0 70.613-57.387 128-128 128zM42.667 362.667v-85.333c117.76 0 213.333-95.573 213.333-213.333h85.333c0 164.907-133.76 298.667-298.667 298.667zM810.667 661.333h-597.333v-69.76c168.96-54.613 302.293-187.947 356.907-356.907h240.427v426.667zM42.667 533.333v-85.333c212.053 0 384-171.947 384-384h85.333c0 259.2-210.133 469.333-469.333 469.333zM896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-128h85.333v128h768v-597.333h-298.667v-85.333h298.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M853.333 192c47.147 0 84.907 38.187 84.907 85.333l0.427 426.667c0 47.147-38.187 85.333-85.333 85.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h-170.667v-85.333h1024v85.333h-170.667zM170.667 704h682.667v-426.667h-682.667v426.667z" /> -<glyph unicode="" d="M896 874.667h-768c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h298.667l-85.333-128v-42.667h341.333v42.667l-85.333 128h298.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM896 362.667h-768v426.667h768v-426.667z" /> -<glyph unicode="" d="M896 874.667h-768c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h298.667v-85.333h-85.333v-85.333h341.333v85.333h-85.333v85.333h298.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM896 277.333h-768v512h768v-512z" /> -<glyph unicode="" d="M341.333-21.333h341.333v85.333h-341.333v-85.333zM682.667 916.907l-341.333 0.427c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h341.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 84.907-85.333 84.907zM682.667 320h-341.333v426.667h341.333v-426.667z" /> -<glyph unicode="" d="M640 640v234.667h-256v-234.667l128-128 128 128zM320 576h-234.667v-256h234.667l128 128-128 128zM384 256v-234.667h256v234.667l-128 128-128-128zM704 576l-128-128 128-128h234.667v256h-234.667z" /> -<glyph unicode="" d="M512 917.333c-212.053 0-384-171.947-384-384v-298.667c0-70.613 57.387-128 128-128h128v341.333h-170.667v85.333c0 164.907 133.76 298.667 298.667 298.667s298.667-133.76 298.667-298.667v-85.333h-170.667v-341.333h128c70.613 0 128 57.387 128 128v298.667c0 212.053-171.947 384-384 384z" /> -<glyph unicode="" d="M512 917.333c-212.053 0-384-171.947-384-384v-298.667c0-70.613 57.387-128 128-128h128v341.333h-170.667v85.333c0 164.907 133.76 298.667 298.667 298.667s298.667-133.76 298.667-298.667v-85.333h-170.667v-341.333h170.667v-42.667h-298.667v-85.333h256c70.613 0 128 57.387 128 128v426.667c0 212.053-171.947 384-384 384z" /> -<glyph unicode="" d="M853.333 746.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-426.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM469.333 618.667h85.333v-85.333h-85.333v85.333zM469.333 490.667h85.333v-85.333h-85.333v85.333zM341.333 618.667h85.333v-85.333h-85.333v85.333zM341.333 490.667h85.333v-85.333h-85.333v85.333zM298.667 405.333h-85.333v85.333h85.333v-85.333zM298.667 533.333h-85.333v85.333h85.333v-85.333zM682.667 234.667h-341.333v85.333h341.333v-85.333zM682.667 405.333h-85.333v85.333h85.333v-85.333zM682.667 533.333h-85.333v85.333h85.333v-85.333zM810.667 405.333h-85.333v85.333h85.333v-85.333zM810.667 533.333h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M661.333 512c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM362.667 512c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM512 213.333c111.36 0 205.867 71.253 241.067 170.667h-482.133c35.2-99.413 129.707-170.667 241.067-170.667zM511.787 896c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM512 128c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333z" /> -<glyph unicode="" d="M316.373 609.707l195.627-195.627 195.627 195.627 60.373-60.373-256-256-256 256z" /> -<glyph unicode="" d="M657.707 263.040l-195.627 195.627 195.627 195.627-60.373 60.373-256-256 256-256z" /> -<glyph unicode="" d="M366.293 257.707l195.627 195.627-195.627 195.627 60.373 60.373 256-256-256-256z" /> -<glyph unicode="" d="M316.373 302.293l195.627 195.627 195.627-195.627 60.373 60.373-256 256-256-256z" /> -<glyph unicode="" d="M896 490.667h-604.587l152.96 152.96-60.373 60.373-256-256 256-256 60.373 60.373-152.96 152.96h604.587z" /> -<glyph unicode="" d="M512 600.96l195.627-195.627 60.373 60.373-256 256-256-256 60.373-60.373 195.627 195.627zM256 192h512v85.333h-512v-85.333z" /> -<glyph unicode="" d="M256 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM512 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M853.333 832h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-426.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM469.333 704h85.333v-85.333h-85.333v85.333zM469.333 576h85.333v-85.333h-85.333v85.333zM341.333 704h85.333v-85.333h-85.333v85.333zM341.333 576h85.333v-85.333h-85.333v85.333zM298.667 490.667h-85.333v85.333h85.333v-85.333zM298.667 618.667h-85.333v85.333h85.333v-85.333zM682.667 320h-341.333v85.333h341.333v-85.333zM682.667 490.667h-85.333v85.333h85.333v-85.333zM682.667 618.667h-85.333v85.333h85.333v-85.333zM810.667 490.667h-85.333v85.333h85.333v-85.333zM810.667 618.667h-85.333v85.333h85.333v-85.333zM512-21.333l170.667 170.667h-341.333l170.667-170.667z" /> -<glyph unicode="" d="M810.667 661.333v-170.667h-561.92l152.96 152.96-60.373 60.373-256-256 256-256 60.373 60.373-152.96 152.96h647.253v256z" /> -<glyph unicode="" d="M494.293 643.627l152.96-152.96h-604.587v-85.333h604.587l-152.96-152.96 60.373-60.373 256 256-256 256-60.373-60.373zM853.333 704v-512h85.333v512h-85.333z" /> -<glyph unicode="" d="M512 320c70.613 0 127.573 57.387 127.573 128l0.427 256c0 70.827-57.173 128-128 128-70.613 0-128-57.173-128-128v-256c0-70.613 57.387-128 128-128zM738.133 448c0-128-108.16-217.6-226.133-217.6-117.76 0-226.133 89.6-226.133 217.6h-72.533c0-145.707 116.053-266.027 256-286.72v-139.947h85.333v139.947c139.947 20.693 256 141.013 256 286.72h-72.533z" /> -<glyph unicode="" d="M853.333 192c46.933 0 85.333 38.4 85.333 85.333v426.667c0 46.933-38.4 85.333-85.333 85.333h-682.667c-46.933 0-85.333-38.4-85.333-85.333v-426.667c0-46.933 38.4-85.333 85.333-85.333h-170.667v-85.333h1024v85.333h-170.667zM170.667 704h682.667v-426.667h-682.667v426.667z" /> -<glyph unicode="" d="M938.667 192v640h-853.333v-640h-85.333v-85.333h1024v85.333h-85.333zM597.333 192h-170.667v42.667h170.667v-42.667zM853.333 320h-682.667v426.667h682.667v-426.667z" /> -<glyph unicode="" d="M853.333 192c47.147 0 84.907 38.187 84.907 85.333l0.427 469.333c0 47.147-38.187 85.333-85.333 85.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-469.333c0-47.147 38.187-85.333 85.333-85.333h-170.667c0-47.147 38.187-85.333 85.333-85.333h853.333c47.147 0 85.333 38.187 85.333 85.333h-170.667zM170.667 746.667h682.667v-469.333h-682.667v469.333zM512 149.333c-23.467 0-42.667 19.2-42.667 42.667s19.2 42.667 42.667 42.667 42.667-19.2 42.667-42.667-19.2-42.667-42.667-42.667z" /> -<glyph unicode="" d="M853.333 192v42.667c47.147 0 84.907 38.187 84.907 85.333l0.427 426.667c0 47.147-38.187 85.333-85.333 85.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333v-42.667h-170.667v-85.333h1024v85.333h-170.667zM170.667 746.667h682.667v-426.667h-682.667v426.667z" /> -<glyph unicode="" d="M640 576h-256v-256h256v256zM554.667 405.333h-85.333v85.333h85.333v-85.333zM896 490.667v85.333h-85.333v85.333c0 47.147-38.187 85.333-85.333 85.333h-85.333v85.333h-85.333v-85.333h-85.333v85.333h-85.333v-85.333h-85.333c-47.147 0-85.333-38.187-85.333-85.333v-85.333h-85.333v-85.333h85.333v-85.333h-85.333v-85.333h85.333v-85.333c0-47.147 38.187-85.333 85.333-85.333h85.333v-85.333h85.333v85.333h85.333v-85.333h85.333v85.333h85.333c47.147 0 85.333 38.187 85.333 85.333v85.333h85.333v85.333h-85.333v85.333h85.333zM725.333 234.667h-426.667v426.667h426.667v-426.667z" /> -<glyph unicode="" d="M554.667 914.347v-338.347h298.667c0 174.080-130.347 317.44-298.667 338.347zM170.667 320c0-188.587 152.747-341.333 341.333-341.333s341.333 152.747 341.333 341.333v170.667h-682.667v-170.667zM469.333 914.347c-168.32-20.907-298.667-164.267-298.667-338.347h298.667v338.347z" /> -<glyph unicode="" d="M682.667 917.333h-341.333c-70.613 0-128-57.387-128-128v-682.667c0-70.613 57.387-128 128-128h341.333c70.613 0 128 57.387 128 128v682.667c0 70.613-57.387 128-128 128zM597.333 64h-170.667v42.667h170.667v-42.667zM736 192h-448v597.333h448v-597.333z" /> -<glyph unicode="" d="M661.333 917.333h-341.333c-58.88 0-106.667-47.787-106.667-106.667v-725.333c0-58.88 47.787-106.667 106.667-106.667h341.333c58.88 0 106.667 47.787 106.667 106.667v725.333c0 58.88-47.787 106.667-106.667 106.667zM490.667 21.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM682.667 192h-384v597.333h384v-597.333z" /> -<glyph unicode="" d="M170.667 704h768v85.333h-768c-47.147 0-85.333-38.187-85.333-85.333v-469.333h-85.333v-128h597.333v128h-426.667v469.333zM981.333 618.667h-256c-23.467 0-42.667-19.2-42.667-42.667v-426.667c0-23.467 19.2-42.667 42.667-42.667h256c23.467 0 42.667 19.2 42.667 42.667v426.667c0 23.467-19.2 42.667-42.667 42.667zM938.667 234.667h-170.667v298.667h170.667v-298.667z" /> -<glyph unicode="" d="M938.667 704v85.333h-647.68l85.333-85.333h562.347zM81.92 889.813l-54.4-54.4 77.44-77.44c-11.947-14.72-19.627-33.493-19.627-53.973v-469.333h-85.333v-128h756.48l100.48-100.48 54.187 54.4-829.227 829.227zM170.667 692.267l457.813-457.6h-457.813v457.6zM981.333 618.667h-256c-23.467 0-42.667-19.2-42.667-42.667v-178.347l85.333-85.333v221.013h170.667v-298.667h-93.013l128-128h7.68c23.467 0 42.667 19.2 42.667 42.667v426.667c0 23.467-19.2 42.667-42.667 42.667z" /> -<glyph unicode="" d="M512 917.333l-384-170.667v-256c0-237.013 163.627-458.027 384-512 220.373 53.973 384 274.987 384 512v256l-384 170.667zM512 448.427h298.667c-22.613-175.787-139.733-332.373-298.667-381.227v380.8h-298.667v243.2l298.667 132.693v-375.467z" /> -<glyph unicode="" d="M852.907 789.333c0 47.147-37.76 85.333-84.907 85.333h-341.333l-256-256v-512c0-47.147 38.187-85.333 85.333-85.333h512.427c47.147 0 84.907 38.187 84.907 85.333l-0.427 682.667zM384 149.333h-85.333v85.333h85.333v-85.333zM725.333 149.333h-85.333v85.333h85.333v-85.333zM384 320h-85.333v170.667h85.333v-170.667zM554.667 149.333h-85.333v170.667h85.333v-170.667zM554.667 405.333h-85.333v85.333h85.333v-85.333zM725.333 320h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M725.333 916.907l-426.667 0.427c-47.147 0-85.333-38.187-85.333-85.333v-768c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v768c0 47.147-38.187 84.907-85.333 84.907zM725.333 149.333h-426.667v597.333h426.667v-597.333z" /> -<glyph unicode="" d="M725.333 874.667h-426.667c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-84.907 85.333-84.907l426.667-0.427c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM512 789.333c47.147 0 85.333-38.187 85.333-85.333s-38.187-85.333-85.333-85.333-85.333 38.187-85.333 85.333 38.187 85.333 85.333 85.333zM512 106.667c-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333-95.573-213.333-213.333-213.333zM512 448c-70.613 0-128-57.387-128-128s57.387-128 128-128 128 57.387 128 128-57.387 128-128 128z" /> -<glyph unicode="" d="M896 789.333h-768c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 84.907 38.187 84.907 85.333l0.427 512c0 47.147-38.187 85.333-85.333 85.333zM810.667 192h-597.333v512h597.333v-512z" /> -<glyph unicode="" d="M768 960h-512c-70.613 0-128-57.387-128-128v-768c0-70.613 57.387-128 128-128h512c70.613 0 128 57.387 128 128v768c0 70.613-57.387 128-128 128zM597.333 21.333h-170.667v42.667h170.667v-42.667zM821.333 149.333h-618.667v682.667h618.667v-682.667z" /> -<glyph unicode="" d="M789.333 960h-597.333c-58.88 0-106.667-47.787-106.667-106.667v-810.667c0-58.88 47.787-106.667 106.667-106.667h597.333c58.88 0 106.667 47.787 106.667 106.667v810.667c0 58.88-47.787 106.667-106.667 106.667zM490.667-21.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM810.667 149.333h-640v682.667h640v-682.667z" /> -<glyph unicode="" d="M896 832h-768c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h213.333v-85.333h341.333v85.333h213.333c47.147 0 84.907 38.187 84.907 85.333l0.427 512c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-768v512h768v-512z" /> -<glyph unicode="" d="M853.333 448c0 108.587-50.773 205.227-129.92 267.733l-40.747 244.267h-341.333l-40.747-244.267c-79.147-62.507-129.92-159.147-129.92-267.733s50.773-205.227 129.92-267.733l40.747-244.267h341.333l40.747 244.267c79.147 62.507 129.92 159.147 129.92 267.733zM256 448c0 141.44 114.56 256 256 256s256-114.56 256-256-114.56-256-256-256-256 114.56-256 256z" /> -<glyph unicode="" d="M170.667 704h-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333zM853.333 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM810.667 490.667h-170.667v-170.667h-85.333v170.667h-170.667v85.333h170.667v170.667h85.333v-170.667h170.667v-85.333z" /> -<glyph unicode="" d="M512 874.667c-235.307 0-426.667-191.36-426.667-426.667s191.36-426.667 426.667-426.667 426.667 191.36 426.667 426.667-191.36 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333zM640 448c0-70.613-57.387-128-128-128s-128 57.387-128 128 57.387 128 128 128 128-57.387 128-128z" /> -<glyph unicode="" d="M614.4 704l-17.067 85.333h-384v-725.333h85.333v298.667h238.933l17.067-85.333h298.667v426.667z" /> -<glyph unicode="" d="M512 832v-395.733c-20.053 7.040-41.387 11.733-64 11.733-106.027 0-192-85.973-192-192s85.973-192 192-192c98.773 0 179.2 74.88 189.867 170.667h2.133v469.333h170.667v128h-298.667z" /> -<glyph unicode="" d="M426.667 576c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM426.667 405.333c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM298.667 554.667c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM426.667 256c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM298.667 384c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM426.667 640c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM597.333 576c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM597.333 640c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM725.333 384c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM725.333 554.667c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333zM597.333 256c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM597.333 405.333c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667z" /> -<glyph unicode="" d="M213.333 213.333c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM384 405.333c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM384 576c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM128 64h768v85.333h-768v-85.333zM213.333 554.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM213.333 384c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM384 234.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM725.333 256c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM128 832v-85.333h768v85.333h-768zM725.333 597.333c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM725.333 426.667c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM554.667 576c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM554.667 405.333c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM554.667 234.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667z" /> -<glyph unicode="" d="M597.333 661.333c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM588.8 470.187c2.773-0.427 5.547-0.853 8.533-0.853 35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64c0-2.987 0.427-5.76 0.853-8.747 3.84-28.16 26.24-50.56 54.613-54.4zM597.333 810.667c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM426.667 810.667c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM896 512c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM426.667 661.333c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM768 320c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM768 490.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM768 661.333c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM597.333 85.333c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM106.667 734.933l161.493-161.493c-4.053 1.28-7.893 2.56-12.16 2.56-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667c0 4.267-1.28 8.107-2.347 12.16l119.893-119.893c-30.507-5.12-53.547-31.147-53.547-62.933 0-35.413 28.587-64 64-64 31.787 0 57.813 23.040 62.933 53.333l119.893-119.893c-3.84 1.28-7.893 2.56-12.16 2.56-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667c0 4.267-1.28 8.107-2.347 12.16l161.28-161.493 54.4 54.4-692.267 692.267-54.4-54.4zM426.667 234.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM896 384c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM256 405.333c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM128 554.667c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM426.667 85.333c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM256 234.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM128 384c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333z" /> -<glyph unicode="" d="M256 405.333c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM256 234.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM256 576c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM128 554.667c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM256 746.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM896 512c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM597.333 661.333c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM597.333 810.667c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM128 384c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM426.667 85.333c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM426.667 810.667c11.733 0 21.333 9.6 21.333 21.333s-9.6 21.333-21.333 21.333-21.333-9.6-21.333-21.333 9.6-21.333 21.333-21.333zM426.667 661.333c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667-42.667-19.2-42.667-42.667 19.2-42.667 42.667-42.667zM426.667 426.667c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64zM768 405.333c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM768 234.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM768 576c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM768 746.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM896 384c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM597.333 234.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM597.333 85.333c-11.733 0-21.333-9.6-21.333-21.333s9.6-21.333 21.333-21.333 21.333 9.6 21.333 21.333-9.6 21.333-21.333 21.333zM426.667 597.333c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64zM426.667 234.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667 42.667 19.2 42.667 42.667-19.2 42.667-42.667 42.667zM597.333 426.667c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64zM597.333 597.333c-35.413 0-64-28.587-64-64s28.587-64 64-64 64 28.587 64 64-28.587 64-64 64z" /> -<glyph unicode="" d="M938.667 448c0-235.641-191.025-426.667-426.667-426.667s-426.667 191.025-426.667 426.667c0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667z" /> -<glyph unicode="" d="M426.667 874.667c-77.867 0-150.613-21.12-213.333-57.6 127.36-73.813 213.333-211.2 213.333-369.067s-85.973-295.253-213.333-369.067c62.72-36.48 135.467-57.6 213.333-57.6 235.733 0 426.667 190.933 426.667 426.667s-190.933 426.667-426.667 426.667z" /> -<glyph unicode="" d="M384 874.667c-44.587 0-87.68-6.827-128-19.627 173.013-54.4 298.667-216.107 298.667-407.040s-125.653-352.64-298.667-407.040c40.32-12.587 83.413-19.627 128-19.627 235.733 0 426.667 190.933 426.667 426.667s-190.933 426.667-426.667 426.667z" /> -<glyph unicode="" d="M853.333 589.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893l141.44 141.44-141.44 141.44zM512 192c-38.187 0-74.24 8.533-106.667 23.467 88.107 40.533 149.333 129.28 149.333 232.533s-61.227 192-149.333 232.533c32.427 14.933 68.48 23.467 106.667 23.467 141.44 0 256-114.56 256-256s-114.56-256-256-256z" /> -<glyph unicode="" d="M853.333 306.56l141.44 141.44-141.44 141.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893zM512 192c-141.44 0-256 114.56-256 256s114.56 256 256 256 256-114.56 256-256-114.56-256-256-256z" /> -<glyph unicode="" d="M853.333 306.56l141.44 141.44-141.44 141.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893zM512 192v512c141.44 0 256-114.56 256-256s-114.56-256-256-256z" /> -<glyph unicode="" d="M853.333 589.44v199.893h-199.893l-141.44 141.44-141.44-141.44h-199.893v-199.893l-141.44-141.44 141.44-141.44v-199.893h199.893l141.44-141.44 141.44 141.44h199.893v199.893l141.44 141.44-141.44 141.44zM512 192c-141.44 0-256 114.56-256 256s114.56 256 256 256 256-114.56 256-256-114.56-256-256-256zM512 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667z" /> -<glyph unicode="" d="M298.667 362.667c-70.613 0-128-57.387-128-128 0-55.893-49.28-85.333-85.333-85.333 39.253-52.053 106.453-85.333 170.667-85.333 94.293 0 170.667 76.373 170.667 170.667 0 70.613-57.387 128-128 128zM883.413 762.453l-56.96 56.96c-16.64 16.64-43.733 16.64-60.373 0l-382.080-382.080 117.333-117.333 382.080 382.080c16.853 16.853 16.853 43.733 0 60.373z" /> -<glyph unicode="" d="M401.067 512l203.307 352.213c-29.653 6.613-60.587 10.453-92.373 10.453-102.4 0-196.053-36.053-269.653-96.213l156.373-270.72 2.347 4.267zM919.040 576c-39.253 124.8-134.4 224.427-255.787 270.507l-156.16-270.507h411.947zM930.133 533.333h-319.573l12.373-21.333 203.307-352c69.547 75.947 112.427 176.853 112.427 288 0 29.227-2.987 57.813-8.533 85.333zM364.16 448l-166.4 288c-69.547-75.947-112.427-176.853-112.427-288 0-29.227 2.987-57.813 8.533-85.333h319.573l-49.28 85.333zM104.96 320c39.253-124.8 134.4-224.427 255.787-270.507l156.16 270.507h-411.947zM585.813 320l-166.4-288.213c29.867-6.613 60.8-10.453 92.587-10.453 102.4 0 196.053 36.053 269.653 96.213l-156.373 270.72-39.467-68.267z" /> -<glyph unicode="" d="M648.533 448c0-75.405-61.128-136.533-136.533-136.533s-136.533 61.128-136.533 136.533c0 75.405 61.128 136.533 136.533 136.533s136.533-61.128 136.533-136.533zM384 874.667l-78.080-85.333h-135.253c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333h-135.253l-78.080 85.333h-256zM512 234.667c-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333-95.573-213.333-213.333-213.333z" /> -<glyph unicode="" d="M426.667 106.667h-213.333v-85.333h213.333v-85.333l128 128-128 128v-85.333zM597.333 106.667v-85.333h213.333v85.333h-213.333zM512 618.667c47.147 0 85.333 38.187 85.333 85.333s-38.187 85.333-85.333 85.333-85.12-38.187-85.12-85.333c0.213-47.147 37.973-85.333 85.12-85.333zM725.333 960h-426.667c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM298.667 874.667h426.667v-448c0 71.040-142.293 106.667-213.333 106.667s-213.333-35.627-213.333-106.667v448z" /> -<glyph unicode="" d="M426.667 106.667h-213.333v-85.333h213.333v-85.333l128 128-128 128v-85.333zM597.333 106.667v-85.333h213.333v85.333h-213.333zM725.333 960h-426.667c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM511.787 704c-47.147 0-85.12 38.187-85.12 85.333s37.973 85.333 85.12 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M597.333 746.667c0 47.147-38.187 85.333-85.333 85.333h-42.667v42.667c0 23.467-19.2 42.667-42.667 42.667h-170.667c-23.467 0-42.667-19.2-42.667-42.667v-42.667h-42.667c-47.147 0-85.333-38.187-85.333-85.333v-640c0-47.147 38.187-85.333 85.333-85.333h341.333c47.147 0 85.333 38.187 85.333 85.333h341.333v640h-341.333zM512 192h-85.333v85.333h85.333v-85.333zM512 576h-85.333v85.333h85.333v-85.333zM682.667 192h-85.333v85.333h85.333v-85.333zM682.667 576h-85.333v85.333h85.333v-85.333zM853.333 192h-85.333v85.333h85.333v-85.333zM853.333 576h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M512 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667zM213.333 320h-85.333v-170.667c0-47.147 38.187-85.333 85.333-85.333h170.667v85.333h-170.667v170.667zM213.333 746.667h170.667v85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-170.667h85.333v170.667zM810.667 832h-170.667v-85.333h170.667v-170.667h85.333v170.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333v170.667h-85.333v-170.667z" /> -<glyph unicode="" d="M213.333 320h-85.333v-170.667c0-47.147 38.187-85.333 85.333-85.333h170.667v85.333h-170.667v170.667zM213.333 746.667h170.667v85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-170.667h85.333v170.667zM810.667 832h-170.667v-85.333h170.667v-170.667h85.333v170.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333v170.667h-85.333v-170.667zM512 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667zM512 362.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M938.667 277.333v512c0 47.147-38.187 85.333-85.333 85.333h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333zM469.333 448l86.613-115.627 126.72 158.293 170.667-213.333h-512l128 170.667zM85.333 704v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333h-85.333z" /> -<glyph unicode="" d="M883.413 719.787l-99.627 99.627c-16.64 16.64-43.733 16.64-60.373 0l-133.333-133.333-81.707 81.92-60.373-60.373 60.587-60.587-380.587-380.373v-202.667h202.667l380.587 380.587 60.373-60.587 60.373 60.373-81.92 81.92 133.333 133.333c16.853 16.64 16.853 43.52 0 60.16zM295.253 149.333l-81.92 81.92 344.107 344.107 81.92-81.92-344.107-344.107z" /> -<glyph unicode="" d="M512 832c-212.053 0-384-171.947-384-384s171.947-384 384-384c35.413 0 64 28.587 64 64 0 16.64-6.187 31.573-16.64 42.88-10.027 11.307-16 26.027-16 42.453 0 35.413 28.587 64 64 64h75.307c117.76 0 213.333 95.573 213.333 213.333 0 188.587-171.947 341.333-384 341.333zM277.333 448c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM405.333 618.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM618.667 618.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM746.667 448c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64z" /> -<glyph unicode="" d="M426.667 832h-213.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h213.333v-85.333h85.333v938.667h-85.333v-85.333zM426.667 192h-213.333l213.333 256v-256zM810.667 832h-213.333v-85.333h213.333v-554.667l-213.333 256v-384h213.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M554.667 661.333h-85.333v-170.667h-170.667v-85.333h170.667v-170.667h85.333v170.667h170.667v85.333h-170.667v170.667zM512 874.667c-235.307 0-426.667-191.36-426.667-426.667s191.36-426.667 426.667-426.667 426.667 191.36 426.667 426.667-191.36 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333z" /> -<glyph unicode="" d="M682.667 618.667h-85.333v-128h-128v-85.333h128v-128h85.333v128h128v85.333h-128zM85.333 448c0 119.040 70.187 221.653 171.093 269.653v91.947c-149.12-52.48-256.427-194.56-256.427-361.6s107.307-309.12 256.427-361.6v91.947c-100.907 48-171.093 150.613-171.093 269.653zM640 832c-211.84 0-384-172.16-384-384s172.16-384 384-384 384 172.16 384 384-172.16 384-384 384zM640 149.333c-164.693 0-298.667 133.973-298.667 298.667s133.973 298.667 298.667 298.667 298.667-133.973 298.667-298.667-133.973-298.667-298.667-298.667z" /> -<glyph unicode="" d="M725.333 320h85.333v341.333c0 47.147-38.187 85.333-85.333 85.333h-341.333v-85.333h341.333v-341.333zM298.667 234.667v682.667h-85.333v-170.667h-170.667v-85.333h170.667v-426.667c0-47.147 38.187-85.333 85.333-85.333h426.667v-170.667h85.333v170.667h170.667v85.333h-682.667z" /> -<glyph unicode="" d="M810.667 789.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM810.667 192h-597.333v512h597.333v-512z" /> -<glyph unicode="" d="M810.667 746.667h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 234.667h-597.333v426.667h597.333v-426.667z" /> -<glyph unicode="" d="M810.667 661.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-256c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v256c0 47.147-38.187 85.333-85.333 85.333zM810.667 320h-597.333v256h597.333v-256z" /> -<glyph unicode="" d="M810.667 704h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-341.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v341.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 277.333h-597.333v341.333h597.333v-341.333z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v597.333h597.333v-597.333z" /> -<glyph unicode="" d="M128 746.667v-170.667h85.333v170.667h170.667v85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333zM213.333 320h-85.333v-170.667c0-47.147 38.187-85.333 85.333-85.333h170.667v85.333h-170.667v170.667zM810.667 149.333h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333v170.667h-85.333v-170.667zM810.667 832h-170.667v-85.333h170.667v-170.667h85.333v170.667c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M810.667 746.667h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-426.667c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 234.667h-597.333v426.667h597.333v-426.667z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v597.333h597.333v-597.333zM595.84 435.84l-117.333-151.040-83.84 100.693-117.333-150.827h469.333l-150.827 201.173z" /> -<glyph unicode="" d="M725.333 832h-426.667c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM725.333 149.333h-426.667v597.333h426.667v-597.333z" /> -<glyph unicode="" d="M768 789.333h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM768 192h-512v512h512v-512z" /> -<glyph unicode="" d="M85.333 298.667v-85.333h853.333v85.333h-853.333zM85.333 512v-85.333h853.333v85.333h-853.333zM85.333 725.333v-85.333h853.333v85.333h-853.333z" /> -<glyph unicode="" d="M128 789.333l384-682.667 384 682.667h-768zM272 704h480l-240-426.667-240 426.667z" /> -<glyph unicode="" d="M128 224v-160h160l472.107 472.107-160 160-472.107-472.107zM883.413 659.413c16.64 16.64 16.64 43.733 0 60.373l-99.627 99.627c-16.64 16.64-43.733 16.64-60.373 0l-78.080-78.080 160-160 78.080 78.080z" /> -<glyph unicode="" d="M640 234.667v-85.333h85.333v85.333h85.333v85.333h-85.333v85.333h-85.333v-85.333h-85.333v-85.333h85.333zM853.333 874.667h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM213.333 746.667h256v-85.333h-256v85.333zM853.333 106.667h-682.667l682.667 682.667v-682.667z" /> -<glyph unicode="" d="M170.667 490.667v-85.333h341.333v85.333h-341.333zM810.667 192h-85.333v453.333l-128-43.733v72.533l200.533 72.533h12.8v-554.667z" /> -<glyph unicode="" d="M641.92 264.96l122.24 130.773c16 16.853 30.72 33.493 44.373 50.133 13.44 16.64 25.173 33.28 34.987 49.707 9.813 16.64 17.493 33.067 22.827 49.707 5.547 16.64 8.32 33.493 8.32 50.56 0 22.827-3.84 43.52-11.52 62.293-7.68 18.56-18.773 34.56-33.493 47.573s-32.64 23.040-53.973 30.293c-21.333 7.040-45.653 10.667-72.96 10.667-29.44 0-55.893-4.48-78.933-13.653s-42.453-21.547-58.24-37.333-27.733-34.347-35.84-55.467c-7.68-20.053-11.52-41.6-11.947-64.213h91.307c0.213 13.227 1.92 25.813 5.547 37.12 3.84 12.373 9.6 23.040 17.28 32s17.28 15.787 28.8 20.907c11.733 4.907 25.387 7.467 41.173 7.467 13.013 0 24.533-2.133 34.56-6.613s18.56-10.453 25.387-18.133c6.827-7.68 12.16-17.067 15.787-27.52 3.627-10.667 5.333-22.187 5.333-34.773 0-9.173-1.28-18.56-3.627-27.733s-6.4-19.2-12.373-29.867c-5.973-10.667-13.867-22.4-23.68-35.413-9.813-12.8-22.4-27.52-37.333-44.16l-178.133-194.347v-62.933h368.213v72.96h-254.080zM85.333 490.667v-85.333h341.333v85.333h-341.333z" /> -<glyph unicode="" d="M426.667 661.333h-85.333v-170.667h-170.667v-85.333h170.667v-170.667h85.333v170.667h170.667v85.333h-170.667v170.667zM853.333 192h-85.333v453.333l-128-43.733v72.533l200.533 72.533h12.8v-554.667z" /> -<glyph unicode="" d="M684.587 264.96l122.24 130.773c16 16.853 30.72 33.493 44.373 50.133 13.44 16.64 25.173 33.28 34.987 49.707 9.813 16.64 17.493 33.067 22.827 49.707 5.547 16.64 8.32 33.493 8.32 50.56 0 22.827-3.84 43.52-11.52 62.293-7.68 18.56-18.773 34.56-33.493 47.573s-32.64 23.040-53.973 30.293c-21.333 7.040-45.653 10.667-72.96 10.667-29.44 0-55.893-4.48-78.933-13.653s-42.453-21.547-58.24-37.333-27.733-34.347-35.84-55.467c-7.68-20.053-11.52-41.6-11.947-64.213h91.307c0.213 13.227 1.92 25.813 5.547 37.12 3.84 12.373 9.6 23.040 17.28 32s17.28 15.787 28.8 20.907c11.733 4.907 25.387 7.467 41.173 7.467 13.013 0 24.533-2.133 34.56-6.613s18.56-10.453 25.387-18.133c6.827-7.68 12.16-17.067 15.787-27.52 3.627-10.667 5.333-22.187 5.333-34.773 0-9.173-1.28-18.56-3.627-27.733s-6.4-19.2-12.373-29.867c-5.973-10.667-13.867-22.4-23.68-35.413-9.813-12.8-22.4-27.52-37.333-44.16l-178.133-194.347v-62.933h368.213v72.96h-254.080zM341.333 661.333h-85.333v-170.667h-170.667v-85.333h170.667v-170.667h85.333v170.667h170.667v85.333h-170.667v170.667z" /> -<glyph unicode="" d="M688.64 426.667c0-42.667-4.267-78.933-12.587-108.8s-20.267-53.973-35.627-72.747c-15.36-18.56-33.92-32.213-55.467-40.533s-45.653-12.587-72.32-12.587c-26.453 0-50.56 4.267-72.32 12.587s-40.32 21.973-55.893 40.533c-15.573 18.56-27.733 42.88-36.053 72.747-8.533 29.867-12.8 66.133-12.8 108.8v87.040c0 42.667 4.267 78.933 12.587 108.587s20.267 53.76 35.84 72.107c15.36 18.347 33.92 31.787 55.68 39.893s45.867 12.16 72.32 12.16c26.667 0 50.987-4.053 72.747-12.16s40.32-21.547 55.893-39.893c15.36-18.347 27.307-42.453 35.84-72.107 8.32-29.653 12.587-65.92 12.587-108.587v-87.040zM598.613 527.573c0 27.52-1.92 50.56-5.76 69.12s-9.387 33.707-16.853 45.227c-7.467 11.52-16.427 19.84-27.307 24.747-10.667 5.12-23.040 7.68-36.907 7.68s-26.24-2.56-36.907-7.68c-10.88-5.12-19.84-13.44-27.307-24.747-7.467-11.52-13.013-26.667-16.853-45.227s-5.76-41.813-5.76-69.12v-113.92c0-27.093 1.92-50.347 5.973-69.333s9.6-34.56 17.067-46.293c7.467-11.947 16.64-20.48 27.52-26.027 10.88-5.333 23.253-8.107 37.12-8.107 14.080 0 26.453 2.773 37.12 8.107s19.627 14.080 26.88 26.027c7.253 11.947 12.8 27.307 16.427 46.293s5.547 42.24 5.547 69.333v113.92z" /> -<glyph unicode="" d="M681.173 521.173l-117.333-151.040-83.84 100.693-117.333-150.827h469.333l-150.827 201.173zM128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM597.333 320h85.333v426.667h-170.667v-85.333h85.333v-341.333zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333zM725.333 405.333h-170.667v85.333h85.333c47.147 0 85.333 38.187 85.333 85.333v85.333c0 47.147-38.187 85.333-85.333 85.333h-170.667v-85.333h170.667v-85.333h-85.333c-47.147 0-85.333-38.187-85.333-85.333v-170.667h256v85.333z" /> -<glyph unicode="" d="M896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333zM128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM725.333 405.333v64c0 35.413-28.587 64-64 64 35.413 0 64 28.587 64 64v64c0 47.147-38.187 85.333-85.333 85.333h-170.667v-85.333h170.667v-85.333h-85.333v-85.333h85.333v-85.333h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM640 320h85.333v426.667h-85.333v-170.667h-85.333v170.667h-85.333v-256h170.667v-170.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333z" /> -<glyph unicode="" d="M896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333zM128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM725.333 405.333v85.333c0 47.147-38.187 85.333-85.333 85.333h-85.333v85.333h170.667v85.333h-256v-256h170.667v-85.333h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333zM554.667 320h85.333c47.147 0 85.333 38.187 85.333 85.333v85.333c0 47.147-38.187 85.333-85.333 85.333h-85.333v85.333h170.667v85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-256c0-47.147 38.187-85.333 85.333-85.333zM554.667 490.667h85.333v-85.333h-85.333v85.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333zM554.667 320l170.667 341.333v85.333h-256v-85.333h170.667l-170.667-341.333h85.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333zM554.667 320h85.333c47.147 0 85.333 38.187 85.333 85.333v64c0 35.413-28.587 64-64 64 35.413 0 64 28.587 64 64v64c0 47.147-38.187 85.333-85.333 85.333h-85.333c-47.147 0-85.333-38.187-85.333-85.333v-64c0-35.413 28.587-64 64-64-35.413 0-64-28.587-64-64v-64c0-47.147 38.187-85.333 85.333-85.333zM554.667 661.333h85.333v-85.333h-85.333v85.333zM554.667 490.667h85.333v-85.333h-85.333v85.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333zM640 746.667h-85.333c-47.147 0-85.333-38.187-85.333-85.333v-85.333c0-47.147 38.187-85.333 85.333-85.333h85.333v-85.333h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333v256c0 47.147-38.187 85.333-85.333 85.333zM640 576h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM597.333 448v170.667c0 47.147-38.187 85.333-85.333 85.333h-42.667c-47.147 0-85.333-38.187-85.333-85.333v-42.667c0-47.147 38.187-85.333 85.333-85.333h42.667v-42.667h-128v-85.333h128c47.147 0 85.333 38.187 85.333 85.333zM469.333 576v42.667h42.667v-42.667h-42.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 576h-85.333v85.333h-85.333v-85.333h-85.333v-85.333h85.333v-85.333h85.333v85.333h85.333v-256h-597.333v597.333h597.333v-256z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333l-298.667 341.333v-341.333h-298.667l298.667 341.333v256h298.667v-597.333z" /> -<glyph unicode="" d="M213.333 320h-85.333v-170.667c0-47.147 38.187-85.333 85.333-85.333h170.667v85.333h-170.667v170.667zM213.333 746.667h170.667v85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-170.667h85.333v170.667zM810.667 832h-170.667v-85.333h170.667v-170.667h85.333v170.667c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-170.667v-85.333h170.667c47.147 0 85.333 38.187 85.333 85.333v170.667h-85.333v-170.667zM512 576c-70.613 0-128-57.387-128-128s57.387-128 128-128 128 57.387 128 128-57.387 128-128 128z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-229.973-69.973-283.52-172.16-128.427-13.653-228.48-122.453-228.48-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.467 203.947-198.187 211.84zM810.667 192h-554.667c-94.080 0-170.667 76.587-170.667 170.667s76.587 170.667 170.667 170.667 170.667-76.587 170.667-170.667h85.333c0 117.76-79.573 216.533-187.733 246.4 42.88 57.387 110.933 94.933 187.733 94.933 129.493 0 234.667-105.173 234.667-234.667v-21.333h64c70.613 0 128-57.387 128-128s-57.387-128-128-128z" /> -<glyph unicode="" d="M853.333 789.333h-170.667l-170.667 170.667-170.667-170.667h-170.667c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM853.333 106.667h-682.667v597.333h192.64l150.187 149.333 148.48-149.333h191.36v-597.333zM768 618.667h-512v-426.667h512z" /> -<glyph unicode="" d="M597.333 704l-160-213.333 121.6-162.133-68.267-51.2c-72.107 96-192 256-192 256l-256-341.333h938.667l-384 512z" /> -<glyph unicode="" d="M128 746.667h-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667v85.333h-682.667v682.667zM896 917.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM896 234.667h-597.333v597.333h597.333v-597.333z" /> -<glyph unicode="" d="M469.333 786.347v86.187c-85.76-8.533-163.84-42.667-227.2-94.293l60.8-60.8c47.36 36.48 104.107 61.227 166.4 68.907zM781.867 778.24c-63.147 51.627-141.44 85.76-227.2 94.293v-86.187c62.293-7.893 119.040-32.427 166.4-69.12l60.8 61.013zM850.347 490.667h86.187c-8.533 85.76-42.667 163.84-94.293 227.2l-60.8-60.8c36.48-47.36 61.227-104.107 68.907-166.4zM242.773 657.067l-60.8 60.8c-51.84-63.36-85.973-141.44-94.507-227.2h86.187c7.893 62.293 32.427 119.040 69.12 166.4zM173.653 405.333h-86.187c8.533-85.76 42.667-163.84 94.293-227.2l60.8 60.8c-36.48 47.36-61.013 104.32-68.907 166.4zM640 448c0 70.613-57.387 128-128 128s-128-57.387-128-128 57.387-128 128-128 128 57.387 128 128zM781.227 239.147l60.8-60.8c51.84 63.147 85.973 141.227 94.507 226.987h-86.187c-7.68-62.080-32.427-119.040-69.12-166.187zM554.667 109.653v-86.187c85.76 8.533 163.84 42.667 227.2 94.293l-60.8 60.8c-47.36-36.48-104.107-61.013-166.4-68.907zM242.133 117.76c63.36-51.627 141.44-85.76 227.2-94.293v86.187c-62.293 7.893-119.040 32.427-166.4 69.12l-60.8-61.013z" /> -<glyph unicode="" d="M797.653 430.933c-11.947 6.827-24.32 12.373-36.693 17.067 12.373 4.693 24.747 10.24 36.693 17.067 81.92 47.36 127.573 133.333 127.787 221.653-76.587 43.947-173.867 47.36-255.787 0-11.947-6.827-22.827-14.72-33.28-23.253 2.133 13.44 3.627 26.667 3.627 40.533 0 94.72-51.627 177.28-128 221.44-76.373-44.16-128-126.72-128-221.44 0-13.867 1.28-27.093 3.413-40.32-10.453 8.32-21.333 16.213-33.28 23.253-81.92 47.36-179.2 43.947-255.787 0 0.213-88.32 45.867-174.293 127.787-221.653 11.947-6.827 24.32-12.373 36.693-17.067-12.373-4.693-24.747-10.24-36.693-17.067-81.92-47.36-127.573-133.333-127.787-221.653 76.587-43.947 173.867-47.36 255.787 0 11.947 6.827 22.827 14.72 33.28 23.253-1.92-13.653-3.413-26.88-3.413-40.747 0-94.72 51.627-177.28 128-221.44 76.373 44.373 128 126.72 128 221.44 0 13.867-1.493 27.093-3.413 40.32 10.453-8.32 21.333-16.213 33.28-23.253 81.92-47.36 179.2-43.947 255.787 0-0.213 88.533-45.867 174.507-128 221.867zM512 277.333c-94.293 0-170.667 76.373-170.667 170.667s76.373 170.667 170.667 170.667 170.667-76.373 170.667-170.667-76.373-170.667-170.667-170.667z" /> -<glyph unicode="" d="M298.667 490.667h-256v-85.333h256v85.333zM391.253 629.12l-90.453 90.453-60.373-60.373 90.453-90.453 60.373 60.373zM554.667 917.333h-85.333v-256h85.333v256zM783.573 659.2l-60.373 60.373-90.453-90.453 60.373-60.373 90.453 90.453zM725.333 490.667v-85.333h256v85.333h-256zM512 576c-70.613 0-128-57.387-128-128s57.387-128 128-128 128 57.387 128 128-57.387 128-128 128zM632.747 266.88l90.453-90.453 60.373 60.373-90.453 90.453-60.373-60.373zM240.427 236.8l60.373-60.373 90.453 90.453-60.373 60.373-90.453-90.453zM469.333-21.333h85.333v256h-85.333v-256z" /> -<glyph unicode="" d="M128 874.667v-512h128v-384l298.667 512h-170.667l170.667 384h-426.667zM810.667 874.667h-85.333l-136.533-384h81.067l29.867 85.333h136.533l29.867-85.333h81.067l-136.533 384zM718.933 633.6l49.067 155.733 49.067-155.733h-98.133z" /> -<glyph unicode="" d="M139.733 832l-54.4-54.4 213.333-213.333v-158.933h128v-384l152.96 262.187 176.64-176.853 54.4 54.187-670.933 671.147zM725.333 533.333h-170.667l170.667 341.333h-426.667v-93.013l360.96-360.96 65.707 112.64z" /> -<glyph unicode="" d="M298.667 874.667v-469.333h128v-384l298.667 512h-170.667l170.667 341.333z" /> -<glyph unicode="" d="M640 64h85.333v85.333h-85.333v-85.333zM810.667 576h85.333v85.333h-85.333v-85.333zM128 746.667v-597.333c0-47.147 38.187-85.333 85.333-85.333h170.667v85.333h-170.667v597.333h170.667v85.333h-170.667c-47.147 0-85.333-38.187-85.333-85.333zM810.667 832v-85.333h85.333c0 47.147-38.187 85.333-85.333 85.333zM469.333-21.333h85.333v938.667h-85.333v-938.667zM810.667 234.667h85.333v85.333h-85.333v-85.333zM640 746.667h85.333v85.333h-85.333v-85.333zM810.667 405.333h85.333v85.333h-85.333v-85.333zM810.667 64c47.147 0 85.333 38.187 85.333 85.333h-85.333v-85.333z" /> -<glyph unicode="" d="M469.333 576h85.333v-85.333h-85.333zM384 490.667h85.333v-85.333h-85.333zM554.667 490.667h85.333v-85.333h-85.333zM640 576h85.333v-85.333h-85.333zM298.667 576h85.333v-85.333h-85.333zM810.667 832h-597.333c-46.933 0-85.333-38.4-85.333-85.333v-597.333c0-46.933 38.4-85.333 85.333-85.333h597.333c46.933 0 85.333 38.4 85.333 85.333v597.333c0 46.933-38.4 85.333-85.333 85.333zM384 192h-85.333v85.333h85.333v-85.333zM554.667 192h-85.333v85.333h85.333v-85.333zM725.333 192h-85.333v85.333h85.333v-85.333zM810.667 490.667h-85.333v-85.333h85.333v-85.333h-85.333v85.333h-85.333v-85.333h-85.333v85.333h-85.333v-85.333h-85.333v85.333h-85.333v-85.333h-85.333v85.333h85.333v85.333h-85.333v256h597.333v-256z" /> -<glyph unicode="" d="M426.667 448c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM256 618.667c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM256 277.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 618.667c47.147 0 85.333 38.187 85.333 85.333s-38.187 85.333-85.333 85.333-85.333-38.187-85.333-85.333 38.187-85.333 85.333-85.333zM597.333 277.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 448c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM597.333 618.667c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM426.667 789.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M341.333 789.333v-62.080l85.333-85.333v147.413h170.667v-170.667h-147.413l85.333-85.333h62.080v-62.080l85.333-85.333v147.413h170.667v-170.667h-147.413l85.333-85.333h62.080v-62.080l85.333-85.333v659.413c0 47.147-38.187 85.333-85.333 85.333h-659.413l85.333-85.333h62.080zM682.667 789.333h170.667v-170.667h-170.667v170.667zM54.4 905.6l-54.4-54.187 85.333-85.333v-659.413c0-47.147 38.187-85.333 85.333-85.333h659.413l85.333-85.333 54.187 54.4-915.2 915.2zM426.667 424.747l62.080-62.080h-62.080v62.080zM170.667 680.747l62.080-62.080h-62.080v62.080zM341.333 106.667h-170.667v170.667h170.667v-170.667zM341.333 362.667h-170.667v170.667h147.413l23.253-23.253v-147.413zM597.333 106.667h-170.667v170.667h147.413l23.253-23.253v-147.413zM682.667 106.667v62.080l62.080-62.080h-62.080z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM341.333 106.667h-170.667v170.667h170.667v-170.667zM341.333 362.667h-170.667v170.667h170.667v-170.667zM341.333 618.667h-170.667v170.667h170.667v-170.667zM597.333 106.667h-170.667v170.667h170.667v-170.667zM597.333 362.667h-170.667v170.667h170.667v-170.667zM597.333 618.667h-170.667v170.667h170.667v-170.667zM853.333 106.667h-170.667v170.667h170.667v-170.667zM853.333 362.667h-170.667v170.667h170.667v-170.667zM853.333 618.667h-170.667v170.667h170.667v-170.667z" /> -<glyph unicode="" d="M768 234.667l-628.48 628.267-54.187-54.187 170.667-170.667v-147.413h-85.333v170.667h-85.333v-426.667h85.333v170.667h85.333v-170.667h85.333v318.080l42.667-42.667v-275.413h170.667c28.587 0 53.547 14.080 69.12 35.627l270.293-270.293 54.187 54.4-180.267 180.267zM554.667 320h-85.333v104.747l85.333-85.333v-19.413zM768 405.333h42.667l34.987-139.52 30.933-31.147h62.080l-50.773 178.133c29.867 13.227 50.773 43.093 50.773 77.867v85.333c0 47.147-38.187 85.333-85.333 85.333h-170.667v-232.747l85.333-85.333v62.080zM768 576h85.333v-85.333h-85.333v85.333zM640 471.253v104.747c0 47.147-38.187 85.333-85.333 85.333h-104.747l190.080-190.080z" /> -<glyph unicode="" d="M256 490.667h-85.333v170.667h-85.333v-426.667h85.333v170.667h85.333v-170.667h85.333v426.667h-85.333v-170.667zM554.667 661.333h-170.667v-426.667h170.667c47.147 0 85.333 38.187 85.333 85.333v256c0 47.147-38.187 85.333-85.333 85.333zM554.667 320h-85.333v256h85.333v-256zM938.667 490.667v85.333c0 47.147-38.187 85.333-85.333 85.333h-170.667v-426.667h85.333v170.667h42.667l42.667-170.667h85.333l-50.773 178.133c29.867 13.227 50.773 43.093 50.773 77.867zM853.333 490.667h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M725.333 704c-141.44 0-256-114.56-256-256s114.56-256 256-256 256 114.56 256 256-114.56 256-256 256zM213.333 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667zM213.333 362.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M213.333 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667zM725.333 704c-141.44 0-256-114.56-256-256s114.56-256 256-256 256 114.56 256 256-114.56 256-256 256zM725.333 277.333c-94.293 0-170.667 76.373-170.667 170.667s76.373 170.667 170.667 170.667 170.667-76.373 170.667-170.667-76.373-170.667-170.667-170.667z" /> -<glyph unicode="" d="M756.48 447.147l169.813 169.813c16.64 16.64 16.64 43.733 0 60.373l-184.96 184.96c-16.64 16.64-43.733 16.64-60.373 0l-169.813-169.813-169.813 169.6c-8.32 8.32-19.2 12.587-30.080 12.587s-21.76-4.267-30.080-12.587l-185.173-184.96c-16.64-16.64-16.64-43.733 0-60.373l169.813-169.813-169.813-169.6c-16.64-16.64-16.64-43.733 0-60.373l184.96-184.96c16.64-16.64 43.733-16.64 60.373 0l169.813 169.813 169.813-169.813c8.32-8.32 19.2-12.587 30.080-12.587s21.76 4.267 30.080 12.587l184.96 184.96c16.64 16.64 16.64 43.733 0 60.373l-169.6 169.813zM512 576c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM311.040 492.373l-154.667 154.667 154.88 154.88 154.667-154.667-154.88-154.88zM426.667 405.333c-23.467 0-42.667 19.2-42.667 42.667s19.2 42.667 42.667 42.667 42.667-19.2 42.667-42.667-19.2-42.667-42.667-42.667zM512 320c-23.467 0-42.667 19.2-42.667 42.667s19.2 42.667 42.667 42.667 42.667-19.2 42.667-42.667-19.2-42.667-42.667-42.667zM597.333 490.667c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM711.040 92.373l-154.667 154.667 154.88 154.88 154.667-154.667-154.88-154.88z" /> -<glyph unicode="" d="M896 149.333v597.333c0 47.147-38.187 85.333-85.333 85.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333zM362.667 384l106.667-128.213 149.333 192.213 192-256h-597.333l149.333 192z" /> -<glyph unicode="" d="M682.667 533.333h-85.333v-85.333h85.333v85.333zM682.667 362.667h-85.333v-85.333h85.333v85.333zM341.333 533.333h-85.333v-85.333h85.333v85.333zM512 533.333h-85.333v-85.333h85.333v85.333zM853.333 789.333h-682.667c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 192h-682.667v512h682.667v-512z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM234.667 640h85.333v85.333h64v-85.333h85.333v-64h-85.333v-85.333h-64v85.333h-85.333v64zM810.667 149.333h-597.333l597.333 597.333v-597.333zM725.333 234.667v64h-213.333v-64h213.333z" /> -<glyph unicode="" d="M597.333 704l-160-213.333 121.6-162.133-68.267-51.2c-72.107 96-192 256-192 256l-256-341.333h938.667l-384 512z" /> -<glyph unicode="" d="M256 832h-128v-128c70.613 0 128 57.387 128 128zM597.333 832h-85.333c0-212.053-171.947-384-384-384v-85.333c259.2 0 469.333 210.133 469.333 469.333zM426.667 832h-85.333c0-117.76-95.573-213.333-213.333-213.333v-85.333c164.907 0 298.667 133.76 298.667 298.667zM426.667 64h85.333c0 212.053 171.947 384 384 384v85.333c-259.2 0-469.333-210.133-469.333-469.333zM768 64h128v128c-70.613 0-128-57.387-128-128zM597.333 64h85.333c0 117.76 95.573 213.333 213.333 213.333v85.333c-164.907 0-298.667-133.76-298.667-298.667z" /> -<glyph unicode="" d="M426.667 832h-85.333c0-15.573-1.92-30.72-5.12-45.44l68.053-68.053c14.293 35.2 22.4 73.387 22.4 113.493zM128 777.6l121.173-121.173c-34.56-23.68-76.16-37.76-121.173-37.76v-85.333c68.693 0 131.627 23.467 181.973 62.293l60.8-60.8c-65.92-54.187-150.613-86.827-242.773-86.827v-85.333c115.84 0 221.653 42.027 303.36 111.573l106.88-106.88c-69.547-81.707-111.573-187.52-111.573-303.36h85.333c0 92.16 32.64 176.853 86.827 242.987l60.8-60.8c-38.827-50.56-62.293-113.493-62.293-182.187h85.333c0 45.013 14.080 86.613 37.973 121.173l121.173-121.173 54.187 54.4-713.6 713.6-54.4-54.4zM597.333 832h-85.333c0-64-16-124.373-43.733-177.493l62.507-62.507c42.027 70.4 66.56 152.107 66.56 240zM850.56 272.213c14.72 3.2 29.867 5.12 45.44 5.12v85.333c-40.107 0-78.293-8.107-113.28-22.4l67.84-68.053zM656 466.773l62.507-62.507c53.12 27.733 113.493 43.733 177.493 43.733v85.333c-87.893 0-169.6-24.533-240-66.56z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667z" /> -<glyph unicode="" d="M512 533.333c-164.693 0-298.667-133.973-298.667-298.667h85.333c0 117.547 95.787 213.333 213.333 213.333s213.333-95.787 213.333-213.333h85.333c0 164.693-133.973 298.667-298.667 298.667zM512 704c-258.773 0-469.333-210.56-469.333-469.333h85.333c0 211.627 172.373 384 384 384s384-172.373 384-384h85.333c0 258.773-210.56 469.333-469.333 469.333z" /> -<glyph unicode="" d="M810.88 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM640.213 512c0-35.413-28.587-64-64-64 35.413 0 64-28.587 64-64v-64c0-47.147-38.187-85.333-85.333-85.333h-170.667v85.333h170.667v85.333h-85.333v85.333h85.333v85.333h-170.667v85.333h170.667c47.147 0 85.333-38.187 85.333-85.333v-64z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM640 234.667h-85.333v170.667h-170.667v256h85.333v-170.667h85.333v170.667h85.333v-426.667z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM640 576h-170.667v-85.333h85.333c47.147 0 85.333-38.187 85.333-85.333v-85.333c0-47.147-38.187-85.333-85.333-85.333h-170.667v85.333h170.667v85.333h-170.667v256h256v-85.333z" /> -<glyph unicode="" d="M469.333 320h85.333v85.333h-85.333v-85.333zM810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM640 576h-170.667v-85.333h85.333c47.147 0 85.333-38.187 85.333-85.333v-85.333c0-47.147-38.187-85.333-85.333-85.333h-85.333c-47.147 0-85.333 38.187-85.333 85.333v256c0 47.147 38.187 85.333 85.333 85.333h170.667v-85.333z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM597.333 234.667h-85.333v341.333h-85.333v85.333h170.667v-426.667z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM640 490.667c0-47.147-38.187-85.333-85.333-85.333h-85.333v-85.333h170.667v-85.333h-256v170.667c0 47.147 38.187 85.333 85.333 85.333h85.333v85.333h-170.667v85.333h170.667c47.147 0 85.333-38.187 85.333-85.333v-85.333z" /> -<glyph unicode="" d="M554.667 661.333h-85.333v-170.667h-170.667v-85.333h170.667v-170.667h85.333v170.667h170.667v85.333h-170.667v170.667zM512 874.667c-235.307 0-426.667-191.36-426.667-426.667s191.36-426.667 426.667-426.667h341.333c47.147 0 85.333 38.187 85.333 85.333v341.333c0 235.307-191.36 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333z" /> -<glyph unicode="" d="M768 789.333l85.333-170.667h-128l-85.333 170.667h-85.333l85.333-170.667h-128l-85.333 170.667h-85.333l85.333-170.667h-128l-85.333 170.667h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v597.333h-170.667z" /> -<glyph unicode="" d="M554.667 272.213c148.267 17.493 263.253 143.36 263.253 296.32 0 164.907-133.76 298.667-298.667 298.667s-298.667-133.76-298.667-298.667c0-147.84 107.52-270.293 248.747-294.187v-167.68h-256v-85.333h597.333v85.333h-256v165.547z" /> -<glyph unicode="" d="M945.92 568.747c0 164.907-133.76 298.667-298.667 298.667s-298.667-133.76-298.667-298.667c0-147.84 107.52-270.293 248.747-294.187v-167.893h-341.333v128h42.667v170.667c0 23.467-19.2 42.667-42.667 42.667h-128c-23.467 0-42.667-19.2-42.667-42.667v-170.667h42.667v-213.333h682.667v85.333h-128v165.547c148.267 17.493 263.253 143.573 263.253 296.533zM192 490.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64z" /> -<glyph unicode="" d="M657.707 643.627l-60.373 60.373-256-256 256-256 60.373 60.373-195.627 195.627z" /> -<glyph unicode="" d="M426.667 704l-60.373-60.373 195.627-195.627-195.627-195.627 60.373-60.373 256 256z" /> -<glyph unicode="" d="M512 832c-212.053 0-384-171.947-384-384s171.947-384 384-384c35.413 0 64 28.587 64 64 0 16.64-6.187 31.573-16.64 42.88-10.027 11.307-16 26.027-16 42.453 0 35.413 28.587 64 64 64h75.307c117.76 0 213.333 95.573 213.333 213.333 0 188.587-171.947 341.333-384 341.333zM277.333 448c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM405.333 618.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM618.667 618.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM746.667 448c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64z" /> -<glyph unicode="" d="M981.333 192v512c0 47.147-38.187 85.333-85.333 85.333h-768c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333zM362.667 426.667l106.667-128.213 149.333 192.213 192-256h-597.333l149.333 192z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.16 0-341.333 153.173-341.333 341.333s153.173 341.333 341.333 341.333 341.333-153.173 341.333-341.333-153.173-341.333-341.333-341.333z" /> -<glyph unicode="" d="M853.333 680.747v-465.493c-110.72 32.853-225.28 49.493-341.333 49.493s-230.4-16.64-341.333-49.493v465.493c110.72-32.853 225.28-49.493 341.333-49.493s230.4 16.64 341.333 49.493zM914.347 789.333c-4.053 0-8.533-0.853-13.227-2.56-125.44-46.72-257.28-70.187-389.12-70.187s-263.68 23.467-389.12 70.187c-4.693 1.707-9.173 2.56-13.44 2.56-14.080 0-24.107-10.027-24.107-26.667v-629.333c0.213-16.64 10.027-26.667 24.107-26.667 4.053 0 8.533 0.853 13.227 2.56 125.44 46.72 257.28 70.187 389.12 70.187s263.68-23.467 389.12-70.187c4.693-1.707 9.173-2.56 13.227-2.56 14.080 0 24.32 10.027 24.107 26.667v629.333c0.427 16.64-9.813 26.667-23.893 26.667z" /> -<glyph unicode="" d="M850.773 58.88c-46.72 125.44-70.187 257.28-70.187 389.12s23.467 263.68 70.187 389.12c1.707 4.693 2.56 9.173 2.56 13.44 0 14.080-10.027 24.107-26.667 24.107h-629.333c-16.64-0.213-26.667-10.027-26.667-24.107 0-4.053 0.853-8.533 2.56-13.227 46.72-125.44 70.187-257.28 70.187-389.12s-23.467-263.68-70.187-389.12c-1.707-4.907-2.56-9.387-2.56-13.653 0-14.080 10.027-24.107 26.667-24.107h629.333c16.64 0 26.667 10.24 26.667 24.32 0 4.053-0.853 8.533-2.56 13.227zM279.253 106.667c32.853 110.72 49.493 225.28 49.493 341.333s-16.64 230.4-49.493 341.333h465.493c-32.853-110.72-49.493-225.28-49.493-341.333s16.64-230.4 49.493-341.333h-465.493z" /> -<glyph unicode="" d="M512 704c104.533 0 200.96-8.32 311.040-27.093 20.053-76.16 30.293-153.173 30.293-228.907s-10.24-152.747-30.293-228.907c-110.080-18.773-206.507-27.093-311.040-27.093s-200.96 8.32-311.040 27.093c-20.053 76.16-30.293 153.173-30.293 228.907s10.24 152.747 30.293 228.907c110.080 18.773 206.507 27.093 311.040 27.093zM512 789.333c-116.48 0-222.933-10.24-339.413-30.72l-39.467-7.040-10.667-38.187c-24.747-88.32-37.12-176.853-37.12-265.387s12.373-177.067 37.12-265.387l10.667-38.187 39.467-7.040c116.48-20.48 222.933-30.72 339.413-30.72s222.933 10.24 339.413 30.72l39.467 7.040 10.667 38.187c24.747 88.32 37.12 176.853 37.12 265.387s-12.373 177.067-37.12 265.387l-10.667 38.187-39.467 7.040c-116.48 20.48-222.933 30.72-339.413 30.72z" /> -<glyph unicode="" d="M896 149.333v597.333c0 47.147-38.187 85.333-85.333 85.333h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333zM362.667 384l106.667-128.213 149.333 192.213 192-256h-597.333l149.333 192z" /> -<glyph unicode="" d="M768 874.667h-512c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 85.333-85.333 85.333zM256 789.333h213.333v-341.333l-106.667 64-106.667-64v341.333zM256 149.333l128 164.48 91.52-109.867 128 164.907 164.48-219.52h-512z" /> -<glyph unicode="" d="M648.533 448c0-75.405-61.128-136.533-136.533-136.533s-136.533 61.128-136.533 136.533c0 75.405 61.128 136.533 136.533 136.533s136.533-61.128 136.533-136.533zM384 874.667l-78.080-85.333h-135.253c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333h-135.253l-78.080 85.333h-256zM512 234.667c-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333-95.573-213.333-213.333-213.333z" /> -<glyph unicode="" d="M938.667 277.333v512c0 47.147-38.187 85.333-85.333 85.333h-512c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333zM469.333 448l86.613-115.627 126.72 158.293 170.667-213.333h-512l128 170.667zM85.333 704v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333v85.333h-597.333v597.333h-85.333z" /> -<glyph unicode="" d="M512 437.333c52.907 0 96 42.88 96 96 0 52.907-43.093 96-96 96s-96-43.093-96-96c0-53.12 43.093-96 96-96zM704 266.667c0 64-128 96-192 96s-192-32-192-96v-32h384v32zM810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v597.333h597.333v-597.333z" /> -<glyph unicode="" d="M512 768c-213.333 0-395.52-132.693-469.333-320 73.813-187.307 256-320 469.333-320s395.52 132.693 469.333 320c-73.813 187.307-255.787 320-469.333 320zM512 234.667c-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333-95.573-213.333-213.333-213.333zM512 576c-70.613 0-128-57.387-128-128s57.387-128 128-128 128 57.387 128 128-57.387 128-128 128z" /> -<glyph unicode="" d="M303.36 596.267l-60.373 60.373c-38.4-49.493-62.080-106.667-69.333-165.973h86.187c6.187 37.333 20.693 73.387 43.52 105.6zM259.84 405.333h-86.187c7.253-59.307 30.933-116.48 69.333-165.973l60.373 60.373c-22.827 32.213-37.333 68.267-43.52 105.6zM302.933 178.56c49.493-38.613 107.093-61.44 166.4-68.693v86.187c-37.333 6.187-73.173 20.907-105.173 43.733l-61.227-61.227zM554.667 786.347v130.987l-194.133-194.133 194.133-189.867v166.827c120.96-20.267 213.333-125.44 213.333-252.16s-92.373-231.893-213.333-252.16v-86.187c168.32 21.12 298.667 164.267 298.667 338.347s-130.347 317.227-298.667 338.347z" /> -<glyph unicode="" d="M663.467 723.2l-194.133 194.133v-130.987c-168.32-20.907-298.667-164.267-298.667-338.347s130.347-317.44 298.667-338.347v86.187c-120.96 20.267-213.333 125.44-213.333 252.16s92.373 231.893 213.333 252.16v-166.827l194.133 189.867zM850.347 490.667c-7.253 59.307-30.933 116.48-69.333 165.973l-60.373-60.373c22.827-32.213 37.333-68.267 43.52-105.6h86.187zM554.667 196.053v-86.4c59.307 7.253 116.907 30.293 166.4 68.693l-61.227 61.227c-32-22.613-67.84-37.12-105.173-43.52zM720.64 299.733l60.373-60.373c38.4 49.493 62.080 106.667 69.333 165.973h-86.187c-6.187-37.333-20.693-73.387-43.52-105.6z" /> -<glyph unicode="" d="M426.667 618.667v-341.333l213.333 170.667-213.333 170.667zM810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v597.333h597.333v-597.333z" /> -<glyph unicode="" d="M896 704h-768c-47.147 0-85.333-38.187-85.333-85.333v-341.333c0-47.147 38.187-85.333 85.333-85.333h768c47.147 0 85.333 38.187 85.333 85.333v341.333c0 47.147-38.187 85.333-85.333 85.333zM896 277.333h-768v341.333h85.333v-170.667h85.333v170.667h85.333v-170.667h85.333v170.667h85.333v-170.667h85.333v170.667h85.333v-170.667h85.333v170.667h85.333v-341.333z" /> -<glyph unicode="" d="M107.947 121.387l57.387-23.68v385.067l-103.467-249.813c-17.92-43.307 2.773-93.44 46.080-111.573zM939.947 279.68l-211.627 510.507c-13.227 32-44.373 51.84-77.013 52.48-11.307 0.213-22.827-1.92-34.133-6.4l-314.24-130.133c-32-13.227-51.627-44.16-52.48-76.8-0.213-11.52 1.707-23.040 6.4-34.347l211.413-510.507c13.44-32.427 44.8-52.053 78.080-52.48 11.093 0 22.187 1.92 33.067 6.4l314.24 130.133c43.307 17.92 64.213 67.84 46.293 111.147zM336 586.667c-23.467 0-42.667 19.2-42.667 42.667s19.2 42.667 42.667 42.667 42.667-19.2 42.667-42.667-19.2-42.667-42.667-42.667zM250.667 117.333c0-46.933 38.4-85.333 85.333-85.333h62.080l-147.413 355.84v-270.507z" /> -<glyph unicode="" d="M853.333 789.333h-135.253l-78.080 85.333h-256l-78.080-85.333h-135.253c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM640 298.667v106.667h-256v-106.667l-149.333 149.333 149.333 149.333v-106.667h256v106.667l149.333-149.333-149.333-149.333z" /> -<glyph unicode="" d="M768 554.667v149.333c0 23.467-18.987 42.667-42.667 42.667h-597.333c-23.68 0-42.667-19.2-42.667-42.667v-512c0-23.467 18.987-42.667 42.667-42.667h597.333c23.68 0 42.667 19.2 42.667 42.667v149.333l170.667-170.667v554.667l-170.667-170.667zM554.667 298.667v106.667h-256v-106.667l-149.333 149.333 149.333 149.333v-106.667h256v106.667l149.333-149.333-149.333-149.333z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333zM661.333 490.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM362.667 490.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM512 213.333c99.413 0 183.68 62.080 217.813 149.333h-435.627c34.133-87.253 118.4-149.333 217.813-149.333z" /> -<glyph unicode="" d="M832.427 828.8l-701.227-701.227c3.84-14.72 11.307-27.947 21.76-38.4l0.213-0.213c10.453-10.453 23.68-17.92 38.4-21.76l701.227 701.227c-7.893 29.44-30.933 52.48-60.373 60.373zM506.88 832l-378.88-378.88v-120.747l499.627 499.627h-120.747zM213.333 832c-46.933 0-85.333-38.4-85.333-85.333v-85.547l170.88 170.88h-85.547zM810.667 64c23.467 0 44.8 9.6 60.16 24.96 15.573 15.573 25.173 36.907 25.173 60.373v85.547l-170.88-170.88h85.547zM396.373 64h120.747l378.88 378.88v120.747l-499.627-499.627z" /> -<glyph unicode="" d="M693.12 629.12c-50.133 49.92-115.627 74.88-181.12 74.88v-256l-181.12-181.12c100.053-100.053 261.973-100.053 362.027 0s100.053 262.187 0.213 362.24zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 191.147 426.667 426.667c0 235.733-190.933 426.667-426.667 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333z" /> -<glyph unicode="" d="M640 917.333h-256v-85.333h256v85.333zM469.333 362.667h85.333v256h-85.333v-256zM811.733 644.907l60.8 60.8c-18.347 21.973-38.4 42.027-60.373 60.373l-60.8-60.8c-65.493 52.48-148.907 84.053-239.573 84.053-212.267 0-383.787-171.947-383.787-384s171.52-384 383.787-384 384.213 171.947 384.213 384c0 90.667-31.573 173.867-84.267 239.573zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667z" /> -<glyph unicode="" d="M495.36 406.4c-6.827 10.24-15.573 19.627-26.24 27.947-10.88 8.32-23.893 14.933-39.467 20.267 13.013 5.76 24.32 13.013 34.133 21.333 9.813 8.533 17.92 17.493 24.32 27.093s11.307 19.627 14.72 30.080c3.2 10.453 4.907 20.693 4.907 30.933 0 23.68-4.053 44.373-11.733 62.507-7.893 17.92-18.987 33.067-33.28 45.013s-31.36 21.12-51.413 27.307c-20.053 6.187-42.027 9.173-66.133 9.173-23.467 0-45.013-3.413-64.853-10.453s-36.907-16.64-51.2-29.013c-14.293-12.373-25.387-27.093-33.493-43.947s-11.947-35.413-11.947-55.253h84.48c0 10.88 1.92 20.693 5.973 29.44s9.387 16.213 16.427 22.187c7.040 6.187 15.147 10.88 24.747 14.293s19.84 5.12 30.933 5.12c26.027 0 45.227-6.613 58.027-20.053 12.587-13.44 18.987-32 18.987-56.107 0-11.52-1.707-22.187-5.12-31.573-3.413-9.6-8.747-17.707-16-24.32-7.253-6.827-16.213-11.947-26.88-15.787s-23.253-5.76-37.973-5.76h-50.133v-66.773h50.133c14.293 0 27.307-1.707 38.827-4.907s21.333-8.32 29.44-15.147c8.107-6.827 14.293-15.573 18.773-26.027s6.613-22.827 6.613-37.333c0-26.453-7.467-46.72-22.613-60.587s-35.627-20.907-61.867-20.907c-12.587 0-23.893 1.707-34.133 5.333s-18.987 8.747-26.027 15.36c-7.253 6.613-12.8 14.507-16.64 23.893-4.053 9.173-5.973 19.413-5.973 30.72h-85.12c0-23.467 4.48-44.16 13.653-61.867 8.96-17.92 21.12-32.853 36.48-44.8s33.067-20.907 53.12-26.88c20.053-5.973 41.173-8.96 63.147-8.96 24.107 0 46.507 3.413 67.413 9.813 20.693 6.613 38.827 16.213 53.973 28.8s27.093 28.16 35.627 46.72c8.533 18.56 12.8 39.68 12.8 63.36 0 12.587-1.493 24.747-4.693 36.48-3.2 11.947-8.107 23.040-14.72 33.28zM890.667 347.093c-6.187 12.16-15.147 22.613-26.88 31.573s-26.24 16.427-43.093 22.613c-17.067 6.187-36.267 11.52-57.6 16-14.933 3.2-27.093 6.4-36.907 9.813-9.813 3.2-17.707 6.827-23.467 10.667s-9.813 8.32-12.16 13.013c-2.347 4.693-3.413 10.24-3.413 16.427s1.28 11.947 3.84 17.707c2.56 5.547 6.4 10.453 11.52 14.72s11.52 7.68 19.413 10.24c7.68 2.56 16.853 3.84 27.307 3.84 10.667 0 20.053-1.493 28.16-4.693 8.107-2.987 14.933-7.253 20.267-12.587 5.547-5.333 9.6-11.307 12.373-17.92 2.773-6.827 4.053-13.653 4.053-20.693h83.2c0 16.64-3.413 32.213-10.027 46.507-6.827 14.293-16.427 26.88-29.227 37.547s-28.373 18.987-46.72 24.96c-18.56 6.187-39.253 9.173-62.507 9.173-21.973 0-41.813-2.987-59.307-8.96-17.707-5.973-32.64-14.293-45.227-24.533-12.373-10.24-21.973-22.187-28.587-35.84s-10.027-27.947-10.027-42.88c0-15.573 3.2-29.227 9.813-41.173 6.4-11.947 15.573-22.187 27.307-30.933s25.6-16.213 42.027-22.4c16.213-6.187 34.347-11.307 54.187-15.36 16.64-3.413 30.080-7.040 40.533-10.88s18.347-8.107 24.107-12.587c5.76-4.48 9.6-9.173 11.52-14.293s2.987-10.667 2.987-16.64c0-13.44-5.76-24.32-17.067-32.64-11.52-8.32-28.16-12.587-49.92-12.587-9.387 0-18.56 1.067-27.307 3.2-8.96 2.133-16.853 5.547-23.893 10.453-7.040 4.693-12.8 11.093-17.493 18.773-4.48 7.68-7.253 17.28-7.893 28.8h-80.853c0-15.36 3.413-30.293 10.027-45.013s16.64-27.947 29.867-39.467c13.227-11.733 29.653-21.12 49.067-28.16 19.413-7.253 42.027-10.88 67.2-10.88 22.613 0 43.093 2.773 61.653 8.107 18.56 5.547 34.347 13.227 47.36 23.040 13.227 10.027 23.253 21.76 30.293 35.413s10.667 28.8 10.667 45.227c0 16.853-3.2 31.147-9.173 43.307z" /> -<glyph unicode="" d="M0 630.827v-71.893l128 42.667v-409.6h85.333v512h-10.88l-202.453-73.173zM1014.827 347.093c-6.187 12.16-15.147 22.613-26.88 31.573s-26.24 16.427-43.093 22.613c-17.067 6.187-36.267 11.52-57.6 16-14.933 3.2-27.093 6.4-36.907 9.813-9.813 3.2-17.707 6.827-23.467 10.667s-9.813 8.32-12.16 13.013c-2.347 4.693-3.413 10.24-3.413 16.427s1.28 11.947 3.84 17.707c2.56 5.547 6.4 10.453 11.52 14.72s11.52 7.68 19.413 10.24c7.68 2.56 16.853 3.84 27.307 3.84 10.667 0 20.053-1.493 28.16-4.693 8.107-2.987 14.933-7.253 20.267-12.587 5.547-5.333 9.6-11.307 12.373-17.92 2.773-6.827 4.053-13.653 4.053-20.693h83.2c0 16.64-3.413 32.213-10.027 46.507s-16.427 26.88-29.227 37.547c-12.8 10.667-28.373 18.987-46.72 24.96-18.56 6.187-39.253 9.173-62.293 9.173-21.973 0-41.813-2.987-59.307-8.96-17.707-5.973-32.64-14.293-45.227-24.533-12.373-10.24-21.973-22.187-28.587-35.84s-10.027-27.947-10.027-42.88c0-15.573 3.2-29.227 9.813-41.173 6.4-11.947 15.573-22.187 27.307-30.933s25.6-16.213 42.027-22.4c16.213-6.187 34.347-11.307 54.187-15.36 16.64-3.413 30.080-7.040 40.533-10.88s18.347-8.107 24.107-12.587c5.76-4.48 9.6-9.173 11.52-14.293s2.987-10.667 2.987-16.64c0-13.44-5.76-24.32-17.067-32.64-11.52-8.32-28.16-12.587-49.92-12.587-9.387 0-18.56 1.067-27.307 3.2-8.96 2.133-16.853 5.547-23.893 10.453-7.040 4.693-12.8 11.093-17.493 18.773-4.48 7.68-7.253 17.28-7.893 28.8h-80.853c0-15.36 3.413-30.293 10.027-45.013s16.64-27.947 29.867-39.467c13.227-11.733 29.653-21.12 49.067-28.16 19.413-7.253 42.027-10.88 67.2-10.88 22.613 0 43.093 2.773 61.653 8.107 18.56 5.547 34.347 13.227 47.36 23.040 13.227 10.027 23.253 21.76 30.293 35.413s10.667 28.8 10.667 45.227c-0.213 16.853-3.2 31.147-9.387 43.307zM589.653 659.413c-14.507 17.28-32 29.653-52.267 37.333-20.48 7.68-43.093 11.52-68.267 11.52-24.747 0-47.36-3.84-67.84-11.52s-37.973-20.053-52.267-37.333c-14.507-17.28-25.6-39.893-33.493-67.627-7.893-27.947-11.733-61.867-11.733-101.973v-81.707c0-40.107 4.053-74.24 11.947-102.187 8.107-27.947 19.413-50.773 33.92-68.267 14.72-17.493 32.213-30.293 52.48-38.187 20.48-7.893 43.093-11.733 67.84-11.733 24.96 0 47.787 4.053 68.053 11.733 20.267 7.893 37.547 20.48 52.053 38.187 14.293 17.493 25.6 40.32 33.493 68.267s11.733 62.080 11.733 102.187v81.707c0 40.107-4.053 74.027-11.733 101.973-8.107 27.733-19.413 50.347-33.92 67.627zM550.613 395.733c0-25.6-1.707-47.147-5.12-65.067s-8.747-32.427-15.573-43.52-15.36-19.2-25.173-24.32c-10.027-5.12-21.547-7.68-34.773-7.68-13.013 0-24.533 2.56-34.773 7.68s-18.773 13.227-25.813 24.32c-7.040 11.093-12.373 25.6-16 43.52s-5.547 39.467-5.547 65.067v106.88c0 25.813 1.707 47.36 5.333 64.853s8.96 31.573 15.787 42.453c7.040 10.88 15.573 18.56 25.6 23.253s21.547 7.040 34.56 7.040c13.013 0 24.533-2.347 34.56-7.040s18.56-12.587 25.6-23.253c7.040-10.88 12.16-24.96 15.787-42.453s5.333-39.253 5.333-64.853v-106.88z" /> -<glyph unicode="" d="M512 789.333c-94.293 0-170.667-76.373-170.667-170.667 0-94.080 76.373-170.667 170.667-170.667s170.667 76.587 170.667 170.667c0 94.293-76.373 170.667-170.667 170.667zM512 362.667c-113.707 0-341.333-56.96-341.333-170.667v-85.333h682.667v85.333c0 113.707-227.627 170.667-341.333 170.667z" /> -<glyph unicode="" d="M812.16 765.867l-60.8-60.8c-65.493 52.693-148.907 84.267-239.573 84.267-78.080 0-150.4-23.467-210.987-63.36l62.080-62.080c43.947 25.387 94.72 40.107 149.12 40.107 164.907 0 298.667-133.76 298.667-298.667 0-54.4-14.72-105.173-40.107-149.12l62.080-62.080c39.893 60.587 63.36 133.12 63.36 211.2 0 90.667-31.573 173.867-84.267 239.573l60.8 60.8-60.373 60.16zM640 917.333h-256v-85.333h256v85.333zM469.333 557.44l85.333-85.333v146.56h-85.333v-61.227zM128.853 789.333l-54.4-54.187 117.547-117.547c-40.32-60.8-64-133.76-64-212.267 0-212.053 171.52-384 383.787-384 78.507 0 151.467 23.68 212.267 64l106.667-106.667 54.187 54.4-756.053 756.267zM512 106.667c-164.907 0-298.667 133.76-298.667 298.667 0 54.827 14.933 106.027 40.747 150.187l408.107-408.107c-44.16-25.813-95.36-40.747-150.187-40.747z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM469.333 109.653c-168.32 20.907-298.667 164.267-298.667 338.347s130.347 317.44 298.667 338.347v-676.693zM554.667 786.347c43.947-5.547 85.333-19.2 122.453-39.68h-122.453v39.68zM554.667 661.333h223.573c10.667-13.44 20.48-27.733 29.013-42.667h-252.587v42.667zM554.667 533.333h287.573c3.627-13.867 6.4-28.16 8.32-42.667h-295.893v42.667zM554.667 109.653v39.68h122.453c-37.12-20.48-78.507-34.133-122.453-39.68zM778.24 234.667h-223.573v42.667h252.587c-8.533-14.933-18.347-29.227-29.013-42.667zM842.24 362.667h-287.573v42.667h295.68c-1.707-14.507-4.693-28.8-8.107-42.667z" /> -<glyph unicode="" d="M938.667 192v85.333h-597.333v512h85.333l-128 128-128-128h85.333v-85.333h-170.667v-85.333h170.667v-341.333c0-47.147 38.187-85.333 85.333-85.333h341.333v-85.333h-85.333l128-128 128 128h-85.333v85.333h170.667zM426.667 618.667h256v-256h85.333v256c0 47.147-38.187 85.333-85.333 85.333h-256v-85.333z" /> -<glyph unicode="" d="M128 234.667v-85.333h256v85.333h-256zM128 746.667v-85.333h426.667v85.333h-426.667zM554.667 64v85.333h341.333v85.333h-341.333v85.333h-85.333v-256h85.333zM298.667 576v-85.333h-170.667v-85.333h170.667v-85.333h85.333v256h-85.333zM896 405.333v85.333h-426.667v-85.333h426.667zM640 576h85.333v85.333h170.667v85.333h-170.667v85.333h-85.333v-256z" /> -<glyph unicode="" d="M292.267 420.267h98.133l-49.067 155.733-49.067-155.733zM938.667 661.333l-51.413-268.373-63.787 268.373h-68.267l-63.573-268.373-51.627 268.373h-32.427c-62.507 77.867-158.507 128-266.24 128-188.587 0-341.333-152.747-341.333-341.333s152.747-341.333 341.333-341.333c133.76 0 249.173 77.013 305.28 189.013l4.053-18.347h74.667l64 260.267 64-260.267h74.667l87.467 384h-76.8zM439.467 277.333l-29.867 85.333h-136.533l-29.867-85.333h-81.067l136.533 384h85.333l136.533-384h-81.067z" /> -<glyph unicode="" d="M825.813 531.84c-29.013 146.773-158.507 257.493-313.813 257.493-123.307 0-230.187-69.973-283.733-172.16-128.213-13.867-228.267-122.453-228.267-254.507 0-141.44 114.56-256 256-256h554.667c117.76 0 213.333 95.573 213.333 213.333 0 112.64-87.68 203.947-198.187 211.84z" /> -<glyph unicode="" d="M151.467 169.173l60.373-60.373 76.587 76.587-60.373 60.373-76.587-76.587zM469.333 2.133h85.333v125.867h-85.333v-125.867zM170.667 512h-128v-85.333h128v85.333zM640 690.773v205.227h-256v-205.227c-76.373-44.373-128-126.72-128-221.44 0-141.44 114.56-256 256-256s256 114.56 256 256c0 94.72-51.627 177.28-128 221.44zM853.333 512v-85.333h128v85.333h-128zM735.787 185.387l76.587-76.587 60.373 60.373-76.587 76.587-60.373-60.373z" /> -<glyph unicode="" d="M213.333 341.333h597.333v256h-597.333v-256zM469.333 936.533v-125.867h85.333v125.867h-85.333zM812.16 829.867l-76.587-76.587 60.373-60.373 76.587 76.587-60.373 60.373zM554.667 2.133v125.867h-85.333v-125.867h85.333zM872.533 169.173l-76.587 76.587-60.373-60.373 76.587-76.587 60.373 60.373zM151.467 769.493l76.587-76.587 60.373 60.373-76.587 76.587-60.373-60.373zM211.84 108.8l76.587 76.587-60.373 60.373-76.587-76.587 60.373-60.373z" /> -<glyph unicode="" d="M288.213 753.28l-76.373 76.587-60.373-60.373 76.587-76.587 60.16 60.373zM170.667 512h-128v-85.333h128v85.333zM554.667 936.533h-85.333v-125.867h85.333v125.867zM872.533 769.493l-60.373 60.373-76.587-76.587 60.373-60.373 76.587 76.587zM735.787 185.387l76.587-76.587 60.373 60.373-76.587 76.587-60.373-60.373zM853.333 512v-85.333h128v85.333h-128zM512 725.333c-141.44 0-256-114.56-256-256s114.56-256 256-256 256 114.56 256 256-114.56 256-256 256zM469.333 2.133h85.333v125.867h-85.333v-125.867zM151.467 169.173l60.373-60.373 76.587 76.587-60.373 60.373-76.587-76.587z" /> -<glyph unicode="" d="M810.667 917.333h-597.333c-47.147 0-84.907-38.187-84.907-85.333l-0.427-551.893c0-29.44 14.933-55.467 37.547-70.827l346.24-230.613 346.24 230.613c22.613 15.36 37.547 41.387 37.547 70.827l0.427 551.893c0 47.147-38.187 85.333-85.333 85.333zM426.667 277.333l-213.333 213.333 60.373 60.373 152.96-152.96 323.627 323.627 60.373-60.373-384-384z" /> -<glyph unicode="" d="M926.080 478.080l-384 384c-16.64 16.64-43.733 16.64-60.16 0l-384-384c-16.64-16.64-16.64-43.733 0-60.373l384-384c16.64-16.64 43.733-16.64 60.373 0l384 384c16.64 16.853 16.64 43.733-0.213 60.373zM597.333 341.333v106.667h-170.667v-128h-85.333v170.667c0 23.68 18.987 42.667 42.667 42.667h213.333v106.667l149.333-149.333-149.333-149.333z" /> -<glyph unicode="" d="M682.667 755.2c42.24 0 76.8 34.347 76.8 76.8s-34.56 76.8-76.8 76.8c-42.453 0-76.8-34.347-76.8-76.8s34.347-76.8 76.8-76.8zM810.667 448c-117.76 0-213.333-95.573-213.333-213.333s95.573-213.333 213.333-213.333 213.333 95.573 213.333 213.333-95.573 213.333-213.333 213.333zM810.667 85.333c-82.56 0-149.333 66.773-149.333 149.333s66.773 149.333 149.333 149.333 149.333-66.773 149.333-149.333-66.773-149.333-149.333-149.333zM631.467 533.333h179.2v76.8h-136.533l-82.56 139.307c-12.587 21.333-35.84 35.627-62.507 35.627-20.053 0-38.187-8.107-51.2-21.333l-157.867-157.653c-13.227-13.227-21.333-31.36-21.333-51.413 0-26.88 14.293-49.493 36.267-62.72l142.933-86.613v-213.333h76.8v276.48l-96 71.253 98.987 99.413 73.813-105.813zM213.333 448c-117.76 0-213.333-95.573-213.333-213.333s95.573-213.333 213.333-213.333 213.333 95.573 213.333 213.333-95.573 213.333-213.333 213.333zM213.333 85.333c-82.56 0-149.333 66.773-149.333 149.333s66.773 149.333 149.333 149.333 149.333-66.773 149.333-149.333-66.773-149.333-149.333-149.333z" /> -<glyph unicode="" d="M170.667 277.333c0-37.76 16.64-71.253 42.667-94.72v-75.947c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v42.667h341.333v-42.667c0-23.467 18.987-42.667 42.667-42.667h42.667c23.467 0 42.667 19.2 42.667 42.667v75.947c26.027 23.467 42.667 56.96 42.667 94.72v426.667c0 149.333-152.747 170.667-341.333 170.667s-341.333-21.333-341.333-170.667v-426.667zM320 234.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM704 234.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM768 490.667h-512v213.333h512v-213.333z" /> -<glyph unicode="" d="M807.253 703.573c-8.747 25.173-32.64 43.093-60.587 43.093h-469.333c-27.947 0-51.84-17.92-60.587-43.093l-88.747-255.573v-341.333c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v42.667h512v-42.667c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v341.333l-88.747 255.573zM277.333 277.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM746.667 277.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM213.333 490.667l64 192h469.333l64-192h-597.333z" /> -<glyph unicode="" d="M853.333 64c-59.307 0-118.613 20.053-170.667 56.533-104.107-72.96-237.227-72.96-341.333 0-52.053-36.48-111.36-56.533-170.667-56.533h-85.333v-85.333h85.333c58.667 0 116.907 14.72 170.667 42.453 107.52-55.253 233.813-55.253 341.333 0 53.76-27.52 112-42.453 170.667-42.453h85.333v85.333h-85.333zM168.32 149.333h2.347c68.267 0 129.067 37.547 170.667 85.333 41.6-47.787 102.4-85.333 170.667-85.333s129.067 37.547 170.667 85.333c41.813-47.787 102.187-85.333 170.667-85.333h2.347l80.853 285.227c3.627 10.88 2.56 22.827-2.56 33.067-5.333 10.24-14.507 17.92-25.6 21.12l-55.040 18.133v197.12c0 47.147-38.187 85.333-85.333 85.333h-128v128h-256v-128h-128c-47.147 0-85.333-38.187-85.333-85.333v-197.12l-54.827-17.92c-11.093-3.413-20.267-10.88-25.6-21.12s-6.187-22.187-2.56-33.067l80.64-285.44zM256 704h512v-169.173l-256 83.84-256-83.84v169.173z" /> -<glyph unicode="" d="M512 874.667c-188.587 0-341.333-21.333-341.333-170.667v-405.333c0-82.56 66.987-149.333 149.333-149.333l-64-64v-21.333h512v21.333l-64 64c82.56 0 149.333 66.773 149.333 149.333v405.333c0 149.333-152.747 170.667-341.333 170.667zM320 234.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM469.333 490.667h-213.333v213.333h213.333v-213.333zM704 234.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM768 490.667h-213.333v213.333h213.333v-213.333z" /> -<glyph unicode="" d="M170.667 298.667c0-82.56 66.987-149.333 149.333-149.333l-64-64v-21.333h512v21.333l-64 64c82.56 0 149.333 66.773 149.333 149.333v448c0 149.333-152.747 170.667-341.333 170.667s-341.333-21.333-341.333-170.667v-448zM512 234.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM768 533.333h-512v213.333h512v-213.333z" /> -<glyph unicode="" d="M512 874.667c-188.587 0-341.333-21.333-341.333-170.667v-405.333c0-82.56 66.987-149.333 149.333-149.333l-64-64v-21.333h512v21.333l-64 64c82.56 0 149.333 66.773 149.333 149.333v405.333c0 149.333-152.747 170.667-341.333 170.667zM320 234.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM469.333 490.667h-213.333v213.333h213.333v-213.333zM704 234.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM768 490.667h-213.333v213.333h213.333v-213.333z" /> -<glyph unicode="" d="M597.333 797.867c42.24 0 76.8 34.347 76.8 76.8s-34.56 76.8-76.8 76.8c-42.453 0-76.8-34.347-76.8-76.8s34.347-76.8 76.8-76.8zM602.453 533.333h208.213v76.8h-154.667l-85.333 142.080c-12.587 21.333-35.84 35.413-62.293 35.413-7.253 0-14.293-1.067-20.907-2.987l-231.467-72.107v-221.867h76.8v156.373l89.813 27.947-166.613-653.653h76.8l122.453 346.027 99.413-132.693v-213.333h76.8v273.28l-106.24 193.707 31.36 122.453 45.867-77.44z" /> -<glyph unicode="" d="M896 277.333v85.333l-341.333 213.333v234.667c0 35.413-28.587 64-64 64s-64-28.587-64-64v-234.667l-341.333-213.333v-85.333l341.333 106.667v-234.667l-85.333-64v-64l149.333 42.667 149.333-42.667v64l-85.333 64v234.667l341.333-106.667z" /> -<glyph unicode="" d="M298.667 405.333c70.613 0 128 57.387 128 128s-57.387 128-128 128-128-57.387-128-128 57.387-128 128-128zM810.667 661.333h-341.333v-298.667h-341.333v384h-85.333v-640h85.333v128h768v-128h85.333v384c0 94.293-76.373 170.667-170.667 170.667z" /> -<glyph unicode="" d="M511.787 168.96l-314.667 244.693-69.12-53.76 384-298.667 384 298.667-69.547 53.973-314.667-244.907zM512 277.333l384 298.667-384 298.667-384-298.667 69.547-53.973 314.453-244.693z" /> -<glyph unicode="" d="M845.227 320.427l50.773 39.467-60.8 60.8-50.773-39.467 60.8-60.8zM826.24 521.6l69.76 54.4-384 298.667-124.373-96.64 336-336 102.613 79.573zM139.733 917.333l-54.4-54.4 180.053-180.053-137.387-106.88 69.547-53.973 314.453-244.693 89.387 69.547 60.8-60.8-150.613-117.12-314.453 244.693-69.12-53.76 384-298.667 210.987 164.267 161.493-161.493 54.187 54.4-798.933 798.933z" /> -<glyph unicode="" d="M896 277.333v85.333l-341.333 213.333v234.667c0 35.413-28.587 64-64 64s-64-28.587-64-64v-234.667l-341.333-213.333v-85.333l341.333 106.667v-234.667l-85.333-64v-64l149.333 42.667 149.333-42.667v64l-85.333 64v234.667l341.333-106.667z" /> -<glyph unicode="" d="M469.333 234.667h85.333v42.667h42.667c23.467 0 42.667 19.2 42.667 42.667v128c0 23.467-19.2 42.667-42.667 42.667h-128v42.667h170.667v85.333h-85.333v42.667h-85.333v-42.667h-42.667c-23.467 0-42.667-19.2-42.667-42.667v-128c0-23.467 19.2-42.667 42.667-42.667h128v-42.667h-170.667v-85.333h85.333v-42.667zM853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 192h-682.667v512h682.667v-512z" /> -<glyph unicode="" d="M853.333 448c0 47.147 38.187 85.333 85.333 85.333v170.667c0 47.147-38.187 85.333-85.333 85.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.213-170.667c47.147-0.213 85.12-38.4 85.12-85.333 0-47.147-38.187-85.333-85.12-85.333l-0.213-170.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v170.667c-47.147 0-85.333 38.187-85.333 85.333zM664.747 243.2l-152.747 98.133-152.747-98.133 46.080 175.573-140.373 114.773 181.12 10.667 65.92 168.32 65.92-168.32 181.12-10.667-140.373-114.773 46.080-175.573z" /> -<glyph unicode="" d="M469.333 405.333v-256h-213.333v-85.333h512v85.333h-213.333v256l341.333 341.333v85.333h-768v-85.333l341.333-341.333zM320 661.333l-85.333 85.333h554.667l-85.333-85.333h-384z" /> -<glyph unicode="" d="M853.333 832h-682.667v-426.667c0-94.293 76.373-170.667 170.667-170.667h256c94.293 0 170.667 76.373 170.667 170.667v128h85.333c47.147 0 85.333 38.187 85.333 85.333v128c0 47.147-38.187 85.333-85.333 85.333zM853.333 618.667h-85.333v128h85.333v-128zM85.333 64h768v85.333h-768v-85.333z" /> -<glyph unicode="" d="M725.333 746.667c35.413 0 64 28.587 64 64 0 42.667-64 115.2-64 115.2s-64-72.533-64-115.2c0-35.413 28.587-64 64-64zM512 746.667c35.413 0 64 28.587 64 64 0 42.667-64 115.2-64 115.2s-64-72.533-64-115.2c0-35.413 28.587-64 64-64zM298.667 746.667c35.413 0 64 28.587 64 64 0 42.667-64 115.2-64 115.2s-64-72.533-64-115.2c0-35.413 28.587-64 64-64zM807.253 618.24c-8.747 25.173-32.64 43.093-60.587 43.093h-469.333c-27.947 0-51.84-17.92-60.587-43.093l-88.747-255.573v-341.333c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v42.667h512v-42.667c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v341.333l-88.747 255.573zM277.333 192c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM746.667 192c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM213.333 405.333l64 192h469.333l64-192h-597.333z" /> -<glyph unicode="" d="M810.667 661.333v128h-597.333v-128h-128v-554.667h341.333v170.667h170.667v-170.667h341.333v554.667h-128zM469.333 533.333h-85.333v-42.667h85.333v-42.667h-128v128h85.333v42.667h-85.333v42.667h128v-128zM682.667 448h-42.667v85.333h-85.333v128h42.667v-85.333h42.667v85.333h42.667v-213.333z" /> -<glyph unicode="" d="M128 874.667l85.973-778.027c4.907-42.453 40.96-75.307 84.693-75.307h426.667c43.733 0 79.787 32.853 84.693 75.307l85.973 778.027h-768zM512 149.333c-70.613 0-128 57.387-128 128 0 85.333 128 230.4 128 230.4s128-145.067 128-230.4c0-70.613-57.387-128-128-128zM781.867 618.667h-539.733l-18.773 170.667h577.493l-18.987-170.667z" /> -<glyph unicode="" d="M512 21.333c212.053 0 384 171.947 384 384-212.053 0-384-171.947-384-384zM239.147 522.667c0-58.88 47.787-106.667 106.667-106.667 22.4 0 43.307 7.040 60.373 18.773l-0.853-8.107c0-58.88 47.787-106.667 106.667-106.667s106.667 47.787 106.667 106.667l-0.853 8.107c17.28-11.947 37.973-18.773 60.373-18.773 58.88 0 106.667 47.787 106.667 106.667 0 42.453-24.96 78.933-61.013 96 35.84 17.067 61.013 53.547 61.013 96 0 58.88-47.787 106.667-106.667 106.667-22.4 0-43.307-7.040-60.373-18.773l0.853 8.107c0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667l0.853-8.107c-17.28 11.947-37.973 18.773-60.373 18.773-58.88 0-106.667-47.787-106.667-106.667 0-42.453 24.96-78.933 61.013-96-36.053-17.067-61.013-53.547-61.013-96zM512 725.333c58.88 0 106.667-47.787 106.667-106.667s-47.787-106.667-106.667-106.667-106.667 47.787-106.667 106.667 47.787 106.667 106.667 106.667zM128 405.333c0-212.053 171.947-384 384-384 0 212.053-171.947 384-384 384z" /> -<glyph unicode="" d="M843.52 651.52l0.64 0.64-158.933 158.507-45.227-45.227 90.027-90.027c-40.107-15.36-68.693-53.973-68.693-99.413 0-58.88 47.787-106.667 106.667-106.667 15.147 0 29.653 3.2 42.667 8.96v-307.627c0-23.467-19.2-42.667-42.667-42.667s-42.667 19.2-42.667 42.667v192c0 47.147-38.187 85.333-85.333 85.333h-42.667v298.667c0 47.147-38.187 85.333-85.333 85.333h-256c-47.147 0-85.333-38.187-85.333-85.333v-682.667h426.667v320h64v-213.333c0-58.88 47.787-106.667 106.667-106.667s106.667 47.787 106.667 106.667v405.333c0 29.44-11.947 56.107-31.147 75.52zM512 533.333h-256v213.333h256v-213.333zM768 533.333c-23.467 0-42.667 19.2-42.667 42.667s19.2 42.667 42.667 42.667 42.667-19.2 42.667-42.667-19.2-42.667-42.667-42.667z" /> -<glyph unicode="" d="M298.667 192c-47.147 0-84.907-38.187-84.907-85.333s37.76-85.333 84.907-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM42.667 874.667v-85.333h85.333l153.387-323.627-57.6-104.533c-6.613-12.373-10.453-26.24-10.453-41.173 0-47.147 38.187-85.333 85.333-85.333h512v85.333h-493.867c-5.973 0-10.667 4.693-10.667 10.667 0 1.92 0.427 3.627 1.28 5.12l38.187 69.547h317.867c32 0 59.947 17.707 74.667 43.947l152.533 276.907c3.413 5.973 5.333 13.013 5.333 20.48 0 23.68-19.2 42.667-42.667 42.667h-630.827l-40.533 85.333h-139.307zM725.333 192c-47.147 0-84.907-38.187-84.907-85.333s37.76-85.333 84.907-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-84.907-38.187-84.907-85.333l-0.427-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM768 362.667h-170.667v-170.667h-170.667v170.667h-170.667v170.667h170.667v170.667h170.667v-170.667h170.667v-170.667z" /> -<glyph unicode="" d="M298.667 405.333c70.613 0 128 57.387 128 128s-57.387 128-128 128-128-57.387-128-128 57.387-128 128-128zM810.667 661.333h-341.333v-298.667h-341.333v384h-85.333v-640h85.333v128h768v-128h85.333v384c0 94.293-76.373 170.667-170.667 170.667z" /> -<glyph unicode="" d="M391.253 241.92c66.56-66.56 174.72-66.56 241.28 0s66.56 174.72 0 241.28l-241.28-241.28zM768 874.24l-512 0.427c-47.147 0-85.333-38.187-85.333-85.333v-682.667c0-47.147 38.187-85.333 85.333-85.333h512c47.147 0 85.333 38.187 85.333 85.333v682.667c0 47.147-38.187 84.907-85.333 84.907zM426.667 789.333c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM298.667 789.333c23.467 0 42.667-19.2 42.667-42.667s-19.2-42.667-42.667-42.667-42.667 19.2-42.667 42.667 19.2 42.667 42.667 42.667zM512 106.667c-141.44 0-256 114.56-256 256s114.56 256 256 256 256-114.56 256-256-114.56-256-256-256z" /> -<glyph unicode="" d="M512 467.413c-100.907 93.653-235.52 151.253-384 151.253v-469.333c148.48 0 283.093-57.6 384-151.253 100.907 93.653 235.52 151.253 384 151.253v469.333c-148.48 0-283.093-57.6-384-151.253zM512 618.667c70.613 0 128 57.387 128 128s-57.387 128-128 128-128-57.387-128-128 57.387-128 128-128z" /> -<glyph unicode="" d="M810.667 704h-85.333c0 117.76-95.573 213.333-213.333 213.333s-213.333-95.573-213.333-213.333h-85.333c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM512 832c70.613 0 128-57.387 128-128h-256c0 70.613 57.387 128 128 128zM512 405.333c-117.76 0-213.333 95.573-213.333 213.333h85.333c0-70.613 57.387-128 128-128s128 57.387 128 128h85.333c0-117.76-95.573-213.333-213.333-213.333z" /> -<glyph unicode="" d="M768 832v-85.333h-85.333v85.333h-341.333v-85.333h-85.333v85.333h-85.333v-768h85.333v85.333h85.333v-85.333h341.333v85.333h85.333v-85.333h85.333v768h-85.333zM341.333 234.667h-85.333v85.333h85.333v-85.333zM341.333 405.333h-85.333v85.333h85.333v-85.333zM341.333 576h-85.333v85.333h85.333v-85.333zM768 234.667h-85.333v85.333h85.333v-85.333zM768 405.333h-85.333v85.333h85.333v-85.333zM768 576h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M913.493 465.92l-383.787 383.787c-15.573 15.36-36.907 24.96-60.373 24.96h-298.667c-47.147 0-85.333-38.187-85.333-85.333v-298.667c0-23.68 9.6-45.013 25.173-60.373l384-384c15.36-15.36 36.693-24.96 60.16-24.96s45.013 9.6 60.373 24.96l298.667 298.667c15.36 15.573 24.96 36.907 24.96 60.373 0 23.68-9.6 45.013-25.173 60.587zM234.667 661.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64z" /> -<glyph unicode="" d="M554.667 832h-298.667v-768h170.667v256h128c141.44 0 256 114.56 256 256s-114.56 256-256 256zM563.2 490.667h-136.533v170.667h136.533c47.147 0 85.333-38.187 85.333-85.333s-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M896 746.667h-112.853l48.853 134.187-100.267 36.48-62.080-170.667h-541.653v-85.333l85.333-256-85.333-256v-85.333h768v85.333l-85.333 256 85.333 256v85.333zM682.667 362.667h-128v-128h-85.333v128h-128v85.333h128v128h85.333v-128h128v-85.333z" /> -<glyph unicode="" d="M282.667 499.413c61.44-120.747 160.213-219.52 281.173-280.96l93.867 94.080c11.733 11.733 28.587 15.147 43.307 10.453 47.787-15.787 99.2-24.32 152.32-24.32 23.68 0 42.667-18.987 42.667-42.667v-149.333c0-23.68-18.987-42.667-42.667-42.667-400.64 0-725.333 324.693-725.333 725.333 0 23.68 19.2 42.667 42.667 42.667h149.333c23.68 0 42.667-18.987 42.667-42.667 0-53.12 8.533-104.533 24.32-152.32 4.693-14.72 1.28-31.573-10.453-43.307l-93.867-94.293z" /> -<glyph unicode="" d="M512 874.667c-152.107 0-289.067-65.92-383.573-170.667l383.573-682.667 383.787 682.453c-94.507 104.96-231.467 170.88-383.787 170.88zM298.667 661.333c0 47.147 38.187 85.333 85.333 85.333s85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333-85.333 38.187-85.333 85.333zM512 320c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M853.333 448c0 47.147 38.187 85.333 85.333 85.333v170.667c0 47.147-38.187 85.333-85.333 85.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.213-170.667c47.147-0.213 85.12-38.4 85.12-85.333 0-47.147-38.187-85.333-85.12-85.333l-0.213-170.667c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v170.667c-47.147 0-85.333 38.187-85.333 85.333zM664.747 243.2l-152.747 98.133-152.747-98.133 46.080 175.573-140.373 114.773 181.12 10.667 65.92 168.32 65.92-168.32 181.12-10.667-140.373-114.773 46.080-175.573z" /> -<glyph unicode="" d="M853.333 789.333h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM853.333 618.667l-341.333-213.333-341.333 213.333v85.333l341.333-213.333 341.333 213.333v-85.333z" /> -<glyph unicode="" d="M810.667 618.667h-597.333c-70.613 0-128-57.387-128-128v-256h170.667v-170.667h512v170.667h170.667v256c0 70.613-57.387 128-128 128zM682.667 149.333h-341.333v213.333h341.333v-213.333zM810.667 448c-23.68 0-42.667 18.987-42.667 42.667s18.987 42.667 42.667 42.667c23.68 0 42.667-18.987 42.667-42.667s-18.987-42.667-42.667-42.667zM768 832h-512v-170.667h512v170.667z" /> -<glyph unicode="" d="M345.6 390.613l120.747 120.747-299.307 299.307c-66.56-66.56-66.56-174.72 0-241.28l178.56-178.773zM635.093 468.053c65.067-30.507 157.013-8.96 224.853 58.88 81.707 81.707 97.28 198.4 34.773 260.907-62.72 62.507-179.627 46.933-261.12-34.773-67.84-67.84-89.173-159.787-58.88-224.853-94.933-94.72-416.64-416.427-416.64-416.427l60.373-60.373 293.547 293.547 293.547-293.547 60.373 60.373-293.547 293.547 62.72 62.72z" /> -<glyph unicode="" d="M648.533 448c0-75.405-61.128-136.533-136.533-136.533s-136.533 61.128-136.533 136.533c0 75.405 61.128 136.533 136.533 136.533s136.533-61.128 136.533-136.533zM384 874.667l-78.080-85.333h-135.253c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333h-135.253l-78.080 85.333h-256zM512 234.667c-117.76 0-213.333 95.573-213.333 213.333s95.573 213.333 213.333 213.333 213.333-95.573 213.333-213.333-95.573-213.333-213.333-213.333z" /> -<glyph unicode="" d="M853.333 618.667h-128v170.667h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-469.333h85.333c0-70.613 57.387-128 128-128s128 57.387 128 128h256c0-70.613 57.387-128 128-128s128 57.387 128 128h85.333v213.333l-128 170.667zM256 170.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM832 554.667l83.84-106.667h-190.507v106.667h106.667zM768 170.667c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64z" /> -<glyph unicode="" d="M807.253 703.573c-8.747 25.173-32.64 43.093-60.587 43.093h-106.667v85.333h-256v-85.333h-106.667c-27.947 0-51.84-17.92-60.587-43.093l-88.747-255.573v-341.333c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v42.667h512v-42.667c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v341.333l-88.747 255.573zM277.333 277.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM746.667 277.333c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM213.333 490.667l64 192h469.333l64-192h-597.333z" /> -<glyph unicode="" d="M810.667 874.667h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h170.667l128-128 128 128h170.667c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM512 733.867c63.573 0 115.2-51.627 115.2-115.2s-51.627-115.2-115.2-115.2c-63.573 0-115.2 51.627-115.2 115.2s51.627 115.2 115.2 115.2zM768 277.333h-512v38.4c0 85.333 170.667 132.267 256 132.267s256-46.933 256-132.267v-38.4z" /> -<glyph unicode="" d="M874.667 832c-2.347 0-4.48-0.213-6.613-1.067l-228.053-88.533-256 89.6-240.427-81.067c-8.96-2.987-15.573-10.667-15.573-20.48v-645.12c0-11.733 9.6-21.333 21.333-21.333 2.347 0 4.48 0.213 6.613 1.067l228.053 88.533 256-89.6 240.64 80.853c8.96 3.2 15.36 10.88 15.36 20.693v645.12c0 11.733-9.6 21.333-21.333 21.333zM640 149.333l-256 89.813v507.52l256-89.813v-507.52z" /> -<glyph unicode="" d="M512 618.667c-94.293 0-170.667-76.373-170.667-170.667s76.373-170.667 170.667-170.667 170.667 76.373 170.667 170.667-76.373 170.667-170.667 170.667zM893.44 490.667c-19.627 177.92-160.853 319.147-338.773 338.773v87.893h-85.333v-87.893c-177.92-19.627-319.147-160.853-338.773-338.773h-87.893v-85.333h87.893c19.627-177.92 160.853-319.147 338.773-338.773v-87.893h85.333v87.893c177.92 19.627 319.147 160.853 338.773 338.773h87.893v85.333h-87.893zM512 149.333c-164.907 0-298.667 133.76-298.667 298.667s133.76 298.667 298.667 298.667 298.667-133.76 298.667-298.667-133.76-298.667-298.667-298.667z" /> -<glyph unicode="" d="M512 874.667l-320-780.587 30.080-30.080 289.92 128 289.92-128 30.080 30.080z" /> -<glyph unicode="" d="M768 618.667c0 141.44-114.56 256-256 256s-256-114.56-256-256c0-192 256-469.333 256-469.333s256 277.333 256 469.333zM426.667 618.667c0 47.147 38.187 85.333 85.333 85.333s85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333-85.333 38.187-85.333 85.333zM213.333 106.667v-85.333h597.333v85.333h-597.333z" /> -<glyph unicode="" d="M512 874.667c-164.907 0-298.667-133.76-298.667-298.667 0-224 298.667-554.667 298.667-554.667s298.667 330.667 298.667 554.667c0 164.907-133.76 298.667-298.667 298.667zM512 469.333c-58.88 0-106.667 47.787-106.667 106.667s47.787 106.667 106.667 106.667 106.667-47.787 106.667-106.667-47.787-106.667-106.667-106.667z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM256 362.667v105.6l293.547 293.547c8.32 8.32 21.76 8.32 30.080 0l75.52-75.52c8.32-8.32 8.32-21.76 0-30.080l-293.547-293.547h-105.6zM768 362.667h-320l85.333 85.333h234.667v-85.333z" /> -<glyph unicode="" d="M345.6 390.613l120.747 120.747-299.307 299.307c-66.56-66.56-66.56-174.72 0-241.28l178.56-178.773zM635.093 468.053c65.067-30.507 157.013-8.96 224.853 58.88 81.707 81.707 97.28 198.4 34.773 260.907-62.72 62.507-179.627 46.933-261.12-34.773-67.84-67.84-89.173-159.787-58.88-224.853-94.933-94.72-416.64-416.427-416.64-416.427l60.373-60.373 293.547 293.547 293.547-293.547 60.373 60.373-293.547 293.547 62.72 62.72z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM213.333 747.093h128c0-70.613-57.387-128.427-128-128.427v128.427zM213.333 448v85.333c117.76 0 213.333 96 213.333 213.76h85.333c0-164.907-133.76-299.093-298.667-299.093zM213.333 192l149.333 192 106.667-128.213 149.333 192.213 192-256h-597.333z" /> -<glyph unicode="" d="M853.333 789.333h-682.667v-85.333h682.667v85.333zM896 362.667v85.333l-42.667 213.333h-682.667l-42.667-213.333v-85.333h42.667v-256h426.667v256h170.667v-256h85.333v256h42.667zM512 192h-256v170.667h256v-170.667z" /> -<glyph unicode="" d="M597.333 704l-160-213.333 121.6-162.133-68.267-51.2c-72.107 96-192 256-192 256l-256-341.333h938.667l-384 512z" /> -<glyph unicode="" d="M853.333 533.333h-128v48.64c73.6 18.987 128 85.12 128 164.693h-128v42.667c0 23.467-18.987 42.667-42.667 42.667h-341.333c-23.467 0-42.667-19.2-42.667-42.667v-42.667h-128c0-79.36 54.613-145.707 128-164.693v-48.64h-128c0-79.36 54.613-145.707 128-164.693v-48.64h-128c0-79.36 54.613-145.707 128-164.693v-48.64c0-23.467 19.2-42.667 42.667-42.667h341.333c23.68 0 42.667 19.2 42.667 42.667v48.64c73.6 18.987 128 85.12 128 164.693h-128v48.64c73.6 18.987 128 85.333 128 164.693zM512 149.333c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM512 362.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333zM512 576c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M170.667 618.667h170.667v170.667h-170.667v-170.667zM426.667 106.667h170.667v170.667h-170.667v-170.667zM170.667 106.667h170.667v170.667h-170.667v-170.667zM170.667 362.667h170.667v170.667h-170.667v-170.667zM426.667 362.667h170.667v170.667h-170.667v-170.667zM682.667 789.333v-170.667h170.667v170.667h-170.667zM426.667 618.667h170.667v170.667h-170.667v-170.667zM682.667 362.667h170.667v170.667h-170.667v-170.667zM682.667 106.667h170.667v170.667h-170.667v-170.667z" /> -<glyph unicode="" d="M853.333 490.667h-519.253l238.293 238.293-60.373 60.373-341.333-341.333 341.333-341.333 60.373 60.373-238.293 238.293h519.253v85.333z" /> -<glyph unicode="" d="M298.667 533.333l213.333-213.333 213.333 213.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 362.667l-170.667 170.667h341.333l-170.667-170.667z" /> -<glyph unicode="" d="M298.667 362.667l213.333 213.333 213.333-213.333z" /> -<glyph unicode="" d="M512 789.333l-60.373-60.373 238.293-238.293h-519.253v-85.333h519.253l-238.293-238.293 60.373-60.373 341.333 341.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM725.333 295.040l-60.373-60.373-152.96 152.96-152.96-152.96-60.373 60.373 152.96 152.96-152.96 152.96 60.373 60.373 152.96-152.96 152.96 152.96 60.373-60.373-152.96-152.96 152.96-152.96z" /> -<glyph unicode="" d="M384 270.080l-177.92 177.92-60.373-60.373 238.293-238.293 512 512-60.373 60.373z" /> -<glyph unicode="" d="M657.707 643.627l-60.373 60.373-256-256 256-256 60.373 60.373-195.627 195.627z" /> -<glyph unicode="" d="M426.667 704l-60.373-60.373 195.627-195.627-195.627-195.627 60.373-60.373 256 256z" /> -<glyph unicode="" d="M810.667 686.293l-60.373 60.373-238.293-238.293-238.293 238.293-60.373-60.373 238.293-238.293-238.293-238.293 60.373-60.373 238.293 238.293 238.293-238.293 60.373 60.373-238.293 238.293z" /> -<glyph unicode="" d="M512 618.667l-256-256 60.373-60.373 195.627 195.627 195.627-195.627 60.373 60.373z" /> -<glyph unicode="" d="M707.627 593.707l-195.627-195.627-195.627 195.627-60.373-60.373 256-256 256 256z" /> -<glyph unicode="" d="M298.667 362.667h-85.333v-213.333h213.333v85.333h-128v128zM213.333 533.333h85.333v128h128v85.333h-213.333v-213.333zM725.333 234.667h-128v-85.333h213.333v213.333h-85.333v-128zM597.333 746.667v-85.333h128v-128h85.333v213.333h-213.333z" /> -<glyph unicode="" d="M213.333 277.333h128v-128h85.333v213.333h-213.333v-85.333zM341.333 618.667h-128v-85.333h213.333v213.333h-85.333v-128zM597.333 149.333h85.333v128h128v85.333h-213.333v-213.333zM682.667 618.667v128h-85.333v-213.333h213.333v85.333h-128z" /> -<glyph unicode="" d="M128 192h768v85.333h-768v-85.333zM128 405.333h768v85.333h-768v-85.333zM128 704v-85.333h768v85.333h-768z" /> -<glyph unicode="" d="M256 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM768 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM512 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M512 618.667c47.147 0 85.333 38.187 85.333 85.333s-38.187 85.333-85.333 85.333-85.333-38.187-85.333-85.333 38.187-85.333 85.333-85.333zM512 533.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333zM512 277.333c-47.147 0-85.333-38.187-85.333-85.333s38.187-85.333 85.333-85.333 85.333 38.187 85.333 85.333-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M753.067 689.067c-61.653 61.867-146.773 100.267-241.067 100.267-188.587 0-340.907-152.747-340.907-341.333s152.32-341.333 340.907-341.333c158.933 0 292.053 108.8 329.813 256h-88.747c-35.2-99.413-129.493-170.667-241.067-170.667-141.44 0-256 114.56-256 256s114.56 256 256 256c70.613 0 133.973-29.44 180.267-75.733l-137.6-137.6h298.667v298.667l-100.267-100.267z" /> -<glyph unicode="" d="M316.373 167.040l60.373-60.373 135.253 135.253 135.253-135.253 60.373 60.373-195.627 195.627-195.627-195.627zM707.627 728.96l-60.373 60.373-135.253-135.253-135.253 135.253-60.373-60.373 195.627-195.627 195.627 195.627z" /> -<glyph unicode="" d="M512 711.253l135.253-135.253 60.373 60.373-195.627 195.627-195.627-195.627 60.373-60.373 135.253 135.253zM512 184.747l-135.253 135.253-60.373-60.373 195.627-195.627 195.627 195.627-60.373 60.373-135.253-135.253z" /> -<glyph unicode="" d="M213.333 277.333c0-164.907 133.76-298.667 298.667-298.667s298.667 133.76 298.667 298.667v170.667h-597.333v-170.667zM688 773.547l89.6 89.6-35.2 35.2-98.347-98.347c-40.107 19.84-84.48 32-132.053 32s-91.947-12.16-132.053-32l-98.347 98.347-35.2-35.2 89.6-89.6c-74.027-54.187-122.667-141.227-122.667-240.213v-42.667h597.333v42.667c0 98.987-48.64 186.027-122.667 240.213zM384 576c-23.68 0-42.667 19.2-42.667 42.667s18.987 42.667 42.667 42.667c23.68 0 42.667-19.2 42.667-42.667s-18.987-42.667-42.667-42.667zM640 576c-23.68 0-42.667 19.2-42.667 42.667s18.987 42.667 42.667 42.667c23.68 0 42.667-19.2 42.667-42.667s-18.987-42.667-42.667-42.667z" /> -<glyph unicode="" d="M607.573 447.573l98.987-98.987c11.947 30.933 18.773 64.427 18.773 99.413 0 34.773-6.613 68.053-18.347 98.773l-99.413-99.2zM833.28 673.493l-53.973-53.973c26.667-51.413 42.027-109.653 42.027-171.733s-15.36-120.107-42.027-171.733l51.2-51.2c41.173 66.133 65.493 143.573 65.493 226.773 0 81.493-23.253 157.227-62.72 221.867zM670.080 631.253l-243.413 243.413h-42.667v-323.627l-195.627 195.627-60.373-60.373 238.293-238.293-238.293-238.293 60.373-60.373 195.627 195.627v-323.627h42.667l243.413 243.413-183.040 183.253 183.040 183.253zM469.333 711.253l80.213-80.213-80.213-80v160.213zM549.547 264.747l-80.213-80v160.427l80.213-80.427z" /> -<glyph unicode="" d="M853.333 277.333h85.333v85.333h-85.333v-85.333zM853.333 661.333v-213.333h85.333v213.333h-85.333zM426.667 789.333c-188.587 0-341.333-152.747-341.333-341.333s152.747-341.333 341.333-341.333 341.333 152.747 341.333 341.333-152.747 341.333-341.333 341.333zM426.667 362.667c-47.147 0-85.333 38.187-85.333 85.333s38.187 85.333 85.333 85.333 85.333-38.187 85.333-85.333-38.187-85.333-85.333-85.333z" /> -<glyph unicode="" d="M512 874.667c-234.667 0-426.667-192-426.667-426.667s192-426.667 426.667-426.667 426.667 192 426.667 426.667-192 426.667-426.667 426.667zM170.667 448c0 187.733 153.6 341.333 341.333 341.333 78.933 0 151.467-27.733 209.067-72.533l-477.867-477.867c-44.8 57.6-72.533 130.133-72.533 209.067zM512 106.667c-78.933 0-151.467 27.733-209.067 72.533l477.867 477.867c44.8-57.6 72.533-130.133 72.533-209.067 0-187.733-153.6-341.333-341.333-341.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333 0 78.933 27.093 151.253 71.893 209.067l478.507-478.507c-57.813-44.8-130.133-71.893-209.067-71.893zM781.44 238.933l-478.507 478.507c57.813 44.8 130.133 71.893 209.067 71.893 188.587 0 341.333-152.747 341.333-341.333 0-78.933-27.093-151.253-71.893-209.067z" /> -<glyph unicode="" d="M807.253 746.24c-8.747 25.173-32.64 43.093-60.587 43.093h-469.333c-27.947 0-51.84-17.92-60.587-43.093l-88.747-255.573v-341.333c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v42.667h512v-42.667c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v341.333l-88.747 255.573zM277.333 320c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM746.667 320c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM213.333 533.333l64 192h469.333l64-192h-597.333z" /> -<glyph unicode="" d="M705.28 488.107l-45.227 45.227-208.213-208.213-90.453 90.453-45.227-45.227 135.68-135.68 253.44 253.44zM810.667 832h-42.667v85.333h-85.333v-85.333h-341.333v85.333h-85.333v-85.333h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v469.333h597.333v-469.333z" /> -<glyph unicode="" d="M397.227 234.667l104.107 104.107 104.107-104.107 45.227 45.227-104.107 104.107 104.107 104.107-45.227 45.227-104.107-104.107-104.107 104.107-45.227-45.227 104.107-104.107-104.107-104.107 45.227-45.227zM810.667 832h-42.667v85.333h-85.333v-85.333h-341.333v85.333h-85.333v-85.333h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v469.333h597.333v-469.333z" /> -<glyph unicode="" d="M725.333 533.333h-426.667v-85.333h426.667v85.333zM810.667 832h-42.667v85.333h-85.333v-85.333h-341.333v85.333h-85.333v-85.333h-42.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM810.667 149.333h-597.333v469.333h597.333v-469.333zM597.333 362.667h-298.667v-85.333h298.667v85.333z" /> -<glyph unicode="" d="M853.333 704h-341.333l-85.333 85.333h-256c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v426.667c0 47.147-38.187 85.333-85.333 85.333zM579.413 192l-152.747 89.387-152.747-89.387 40.32 173.653-134.827 116.693 177.707 15.36 69.547 163.627 69.333-163.627 177.707-15.36-134.827-116.693 40.533-173.653z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM213.333 362.667l149.333 192 106.667-128.213 149.333 192.213 192-256h-597.333z" /> -<glyph unicode="" d="M938.667 832h-640c-29.44 0-52.693-14.933-68.053-37.547l-230.613-346.24 230.613-346.24c15.36-22.613 41.387-37.973 70.827-37.973h637.227c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM384 384c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM597.333 384c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM810.667 384c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64z" /> -<glyph unicode="" d="M832 533.333c7.253 0 14.293-1.28 21.333-2.133v386.133l-810.667-810.667h554.667v128c0 37.76 16.427 71.893 42.667 95.36v11.307c0 105.813 86.187 192 192 192zM938.667 277.333v64c0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667v-64c-23.467 0-42.667-19.2-42.667-42.667v-170.667c0-23.467 19.2-42.667 42.667-42.667h213.333c23.467 0 42.667 19.2 42.667 42.667v170.667c0 23.467-19.2 42.667-42.667 42.667zM896 277.333h-128v64c0 35.413 28.587 64 64 64s64-28.587 64-64v-64z" /> -<glyph unicode="" d="M627.413 554.667l97.92 97.92v-161.92h21.333l121.813 121.813-91.733 91.52 91.52 91.52-121.6 121.813h-21.333v-161.92l-97.92 97.92-30.080-30.080 119.253-119.253-119.253-119.253 30.080-30.080zM768 835.627l40.107-40.107-40.107-40.107v80.213zM768 652.587l40.107-40.107-40.107-40.107v80.213zM853.333 298.667c-53.12 0-104.32 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.96 61.44-219.52 160.213-281.173 280.96l93.867 94.080c11.733 11.733 15.147 28.587 10.453 43.307-15.787 48-24.32 99.413-24.32 152.533 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.68 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667z" /> -<glyph unicode="" d="M768 490.667l213.333 213.333-213.333 213.333v-128h-170.667v-170.667h170.667v-128zM853.333 298.667c-53.12 0-104.32 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.96 61.44-219.52 160.213-281.173 280.96l93.867 94.080c11.733 11.733 15.147 28.587 10.453 43.307-15.787 48.213-24.32 99.413-24.32 152.533 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.68 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667z" /> -<glyph unicode="" d="M853.333 298.667c-53.12 0-104.32 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.96 61.44-219.52 160.213-281.173 280.96l93.867 94.080c11.733 11.733 15.147 28.587 10.453 43.307-15.787 48-24.32 99.413-24.32 152.533 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.68 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667zM810.667 448h85.333c0 212.053-171.947 384-384 384v-85.333c164.907 0 298.667-133.76 298.667-298.667zM640 448h85.333c0 117.76-95.573 213.333-213.333 213.333v-85.333c70.613 0 128-57.387 128-128z" /> -<glyph unicode="" d="M853.333 298.667c-53.12 0-104.533 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.96 61.44-219.52 160.213-281.173 280.96l93.867 94.080c11.733 11.733 15.147 28.587 10.453 43.307-15.787 48-24.32 99.413-24.32 152.533 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.467 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667zM853.333 789.333v21.333c0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667v-21.333c-23.68 0-42.667-19.2-42.667-42.667v-170.667c0-23.467 18.987-42.667 42.667-42.667h213.333c23.68 0 42.667 19.2 42.667 42.667v170.667c0 23.467-18.987 42.667-42.667 42.667zM819.2 789.333h-145.067v21.333c0 40.107 32.427 72.533 72.533 72.533s72.533-32.427 72.533-72.533v-21.333z" /> -<glyph unicode="" d="M277.333 725.333l234.667-234.667 298.667 298.667-42.667 42.667-256-256-192 192h149.333v64h-256v-256h64v149.333zM1011.413 248.747c-129.92 123.52-305.92 199.253-499.413 199.253s-369.493-75.733-499.413-199.253c-7.893-7.893-12.587-18.56-12.587-30.293s4.693-22.4 12.587-30.080l105.6-105.813c7.68-7.68 18.347-12.587 30.293-12.587 11.52 0 22.187 4.693 29.867 12.16 33.707 31.36 72.107 58.027 113.707 79.147 14.080 7.040 23.893 21.547 23.893 38.4v132.48c61.653 19.84 127.573 30.507 196.053 30.507s134.4-10.667 196.267-30.72v-132.48c0-16.853 9.813-31.36 23.893-38.4 41.6-20.907 80-47.573 113.707-79.147 7.68-7.467 18.133-12.16 29.867-12.16s22.4 4.693 30.293 12.587l105.6 105.813c7.68 7.68 12.587 18.347 12.587 30.080s-4.907 22.613-12.8 30.507z" /> -<glyph unicode="" d="M725.333 832h-85.333v-298.667h85.333v298.667zM853.333 298.667c-53.12 0-104.32 8.533-152.32 24.32-14.72 4.693-31.573 1.28-43.307-10.453l-93.867-94.080c-120.96 61.44-219.52 160.213-281.173 280.96l93.867 94.080c11.733 11.733 15.147 28.587 10.453 43.307-15.787 48-24.32 99.413-24.32 152.533 0 23.68-18.987 42.667-42.667 42.667h-149.333c-23.68 0-42.667-18.987-42.667-42.667 0-400.64 324.693-725.333 725.333-725.333 23.68 0 42.667 18.987 42.667 42.667v149.333c0 23.68-18.987 42.667-42.667 42.667zM810.667 832v-298.667h85.333v298.667h-85.333z" /> -<glyph unicode="" d="M853.333 704h-170.667v85.333l-85.333 85.333h-170.667l-85.333-85.333v-85.333h-170.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-469.333c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v469.333c0 47.147-38.187 85.333-85.333 85.333zM426.667 789.333h170.667v-85.333h-170.667v85.333zM512 149.333l-213.333 213.333h128v170.667h170.667v-170.667h128l-213.333-213.333z" /> -<glyph unicode="" d="M853.333 704h-170.667v85.333l-85.333 85.333h-170.667l-85.333-85.333v-85.333h-170.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-469.333c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v469.333c0 47.147-38.187 85.333-85.333 85.333zM426.667 789.333h170.667v-85.333h-170.667v85.333zM448 213.333l-149.333 149.333 60.373 60.373 88.96-88.96 220.8 220.8 60.373-60.373-281.173-281.173z" /> -<glyph unicode="" d="M768 874.667h-341.333l-255.147-256-0.853-512c0-46.933 38.4-85.333 85.333-85.333h512c46.933 0 85.333 38.4 85.333 85.333v682.667c0 46.933-38.4 85.333-85.333 85.333zM512 618.667h-85.333v170.667h85.333v-170.667zM640 618.667h-85.333v170.667h85.333v-170.667zM768 618.667h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M768 874.667h-341.333l-254.933-256-1.067-512c0-46.933 38.4-85.333 85.333-85.333h512c46.933 0 85.333 38.4 85.333 85.333v682.667c0 46.933-38.4 85.333-85.333 85.333zM554.667 234.667h-85.333v85.333h85.333v-85.333zM554.667 405.333h-85.333v213.333h85.333v-213.333z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM384 490.667h-85.333v85.333h85.333v-85.333zM554.667 490.667h-85.333v85.333h85.333v-85.333zM725.333 490.667h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM554.667 362.667h-85.333v85.333h85.333v-85.333zM554.667 533.333h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M512 789.333v128l-170.667-170.667 170.667-170.667v128c141.44 0 256-114.56 256-256 0-43.307-10.88-83.84-29.653-119.68l62.293-62.293c33.067 52.907 52.693 114.987 52.693 181.973 0 188.587-152.747 341.333-341.333 341.333zM512 192c-141.44 0-256 114.56-256 256 0 43.307 10.88 83.84 29.653 119.68l-62.293 62.293c-33.067-52.907-52.693-114.987-52.693-181.973 0-188.587 152.747-341.333 341.333-341.333v-128l170.667 170.667-170.667 170.667v-128z" /> -<glyph unicode="" d="M426.667 689.067v89.173c-34.133-8.747-65.92-22.827-95.147-40.96l62.507-62.507c10.453 5.333 21.333 10.453 32.64 14.293zM122.24 729.173l100.48-100.48c-32.853-52.48-52.053-114.133-52.053-180.693 0-94.293 38.613-179.2 100.48-240.853l-100.48-100.48h256v256l-95.36-95.36c-46.507 46.293-75.307 110.080-75.307 180.693 0 42.667 10.667 82.773 29.227 118.187l344.96-344.96c-10.453-5.547-21.333-10.453-32.64-14.507v-88.96c34.133 8.747 65.92 22.827 95.147 40.96l100.693-100.693 54.4 54.4-671.36 671.147-54.187-54.4zM853.333 789.333h-256v-256l95.36 95.36c46.507-46.293 75.307-110.080 75.307-180.693 0-42.667-10.667-82.773-29.227-118.187l62.507-62.507c32.853 52.48 52.053 114.133 52.053 180.693 0 94.293-38.613 179.2-100.48 240.853l100.48 100.48z" /> -<glyph unicode="" d="M128 448c0-94.293 38.827-179.2 100.48-240.853l-100.48-100.48h256v256l-95.36-95.36c-46.507 46.293-75.307 110.080-75.307 180.693 0 111.36 71.253 205.867 170.667 241.067v89.173c-147.2-37.973-256-171.307-256-330.24zM469.333 234.667h85.333v85.333h-85.333v-85.333zM896 789.333h-256v-256l95.36 95.36c46.507-46.293 75.307-110.080 75.307-180.693 0-111.36-71.253-205.867-170.667-241.067v-88.96c147.2 37.76 256 171.093 256 330.027 0 94.293-38.827 179.2-100.48 240.853l100.48 100.48zM469.333 405.333h85.333v256h-85.333v-256z" /> -<glyph unicode="" d="M725.333 916.907l-426.667 0.427c-47.147 0-85.333-38.187-85.333-85.333v-768c0-47.147 38.187-85.333 85.333-85.333h426.667c47.147 0 85.333 38.187 85.333 85.333v768c0 47.147-38.187 84.907-85.333 84.907zM725.333 149.333h-426.667v597.333h426.667v-597.333zM682.667 405.333h-128v213.333h-85.333v-213.333h-128l170.667-170.667 170.667 170.667z" /> -<glyph unicode="" d="M85.333 277.333v-85.333c117.76 0 213.333-95.573 213.333-213.333h85.333c0 164.907-133.76 298.667-298.667 298.667zM85.333 106.667v-128h128c0 70.613-57.387 128-128 128zM85.333 448v-85.333c212.053 0 384-171.947 384-384h85.333c0 259.2-210.133 469.333-469.333 469.333zM725.333 916.907l-426.667 0.427c-47.147 0-85.333-38.187-85.333-85.333v-314.453c29.44-7.040 58.027-15.787 85.333-27.307v256.427h426.667v-554.667h-129.28c22.187-53.12 35.84-110.72 40.533-170.667h88.747c47.147 0 85.333 38.187 85.333 85.333v725.333c0 47.147-38.187 84.907-85.333 84.907z" /> -<glyph unicode="" d="M807.253 746.24c-8.747 25.173-32.64 43.093-60.587 43.093h-469.333c-27.947 0-51.84-17.92-60.587-43.093l-88.747-255.573v-341.333c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v42.667h512v-42.667c0-23.467 19.2-42.667 42.667-42.667h42.667c23.68 0 42.667 19.2 42.667 42.667v341.333l-88.747 255.573zM277.333 320c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM746.667 320c-35.413 0-64 28.587-64 64s28.587 64 64 64 64-28.587 64-64-28.587-64-64-64zM213.333 533.333l64 192h469.333l64-192h-597.333z" /> -<glyph unicode="" d="M0 320h85.333v256h-85.333v-256zM128 234.667h85.333v426.667h-85.333v-426.667zM938.667 576v-256h85.333v256h-85.333zM810.667 234.667h85.333v426.667h-85.333v-426.667zM704 832h-384c-35.413 0-64-28.587-64-64v-640c0-35.413 28.587-64 64-64h384c35.413 0 64 28.587 64 64v640c0 35.413-28.587 64-64 64zM682.667 149.333h-341.333v597.333h341.333v-597.333z" /> -<glyph unicode="" d="M853.333 874.667h-682.667c-47.147 0-84.907-38.187-84.907-85.333l-0.427-768 170.667 170.667h597.333c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM768 362.667l-170.667 136.533v-136.533h-341.333v341.333h341.333v-136.533l170.667 136.533v-341.333z" /> -<glyph unicode="" d="M938.667 789.333v21.333c0 58.88-47.787 106.667-106.667 106.667s-106.667-47.787-106.667-106.667v-21.333c-23.68 0-42.667-19.2-42.667-42.667v-170.667c0-23.467 18.987-42.667 42.667-42.667h213.333c23.68 0 42.667 19.2 42.667 42.667v170.667c0 23.467-18.987 42.667-42.667 42.667zM904.533 789.333h-145.067v21.333c0 40.107 32.427 72.533 72.533 72.533s72.533-32.427 72.533-72.533v-21.333zM807.467 448c1.707-14.080 3.2-28.16 3.2-42.667 0-88.747-34.133-169.387-89.813-230.187-10.88 34.56-42.88 59.52-80.853 59.52h-42.667v128c0 23.467-19.2 42.667-42.667 42.667h-256v85.333h85.333c23.467 0 42.667 19.2 42.667 42.667v85.333h85.333c47.147 0 85.333 38.187 85.333 85.333v108.373c-40.32 12.8-83.413 19.627-128 19.627-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667c0 14.507-0.853 28.587-2.133 42.667h-86.4zM426.667 66.987c-168.32 20.907-298.667 164.267-298.667 338.347 0 26.24 3.2 51.84 8.96 76.373l204.373-204.373v-42.667c0-47.147 38.187-85.333 85.333-85.333v-82.347z" /> -<glyph unicode="" d="M512 661.333c47.147 0 85.333 38.187 85.333 85.333 0 16-4.48 31.147-12.16 43.947l-73.173 126.72-73.173-126.72c-7.68-12.8-12.16-27.947-12.16-43.947 0-47.147 38.187-85.333 85.333-85.333zM896 64v170.667c0 47.147-38.187 85.333-85.333 85.333h-42.667v128c0 47.147-38.187 85.333-85.333 85.333h-128v85.333h-85.333v-85.333h-128c-47.147 0-85.333-38.187-85.333-85.333v-128h-42.667c-47.147 0-85.333-38.187-85.333-85.333v-170.667h-85.333v-85.333h938.667v85.333h-85.333z" /> -<glyph unicode="" d="M512 661.333v170.667h-426.667v-768h853.333v597.333h-426.667zM256 149.333h-85.333v85.333h85.333v-85.333zM256 320h-85.333v85.333h85.333v-85.333zM256 490.667h-85.333v85.333h85.333v-85.333zM256 661.333h-85.333v85.333h85.333v-85.333zM426.667 149.333h-85.333v85.333h85.333v-85.333zM426.667 320h-85.333v85.333h85.333v-85.333zM426.667 490.667h-85.333v85.333h85.333v-85.333zM426.667 661.333h-85.333v85.333h85.333v-85.333zM853.333 149.333h-341.333v85.333h85.333v85.333h-85.333v85.333h85.333v85.333h-85.333v85.333h341.333v-426.667zM768 490.667h-85.333v-85.333h85.333v85.333zM768 320h-85.333v-85.333h85.333v85.333z" /> -<glyph unicode="" d="M682.667 490.667c70.613 0 127.573 57.387 127.573 128s-56.96 128-127.573 128c-70.613 0-128-57.387-128-128s57.387-128 128-128zM341.333 490.667c70.613 0 127.573 57.387 127.573 128s-56.96 128-127.573 128c-70.613 0-128-57.387-128-128s57.387-128 128-128zM341.333 405.333c-99.627 0-298.667-49.92-298.667-149.333v-106.667h597.333v106.667c0 99.413-199.040 149.333-298.667 149.333zM682.667 405.333c-12.373 0-26.24-0.853-41.173-2.347 49.493-35.627 83.84-83.627 83.84-146.987v-106.667h256v106.667c0 99.413-199.040 149.333-298.667 149.333z" /> -<glyph unicode="" d="M341.333 533.333h-128v128h-85.333v-128h-128v-85.333h128v-128h85.333v128h128v85.333zM768 490.667c70.613 0 127.573 57.387 127.573 128s-56.96 128-127.573 128c-13.653 0-26.667-2.133-39.040-6.187 24.107-34.56 38.613-76.587 38.613-121.813s-14.507-87.253-38.613-121.813c12.373-4.053 25.387-6.187 39.040-6.187zM554.667 490.667c70.613 0 127.573 57.387 127.573 128s-56.96 128-127.573 128c-70.613 0-128-57.387-128-128s57.387-128 128-128zM837.12 398.507c35.413-30.933 58.88-70.827 58.88-121.173v-85.333h128v85.333c0 65.707-101.333 106.027-186.88 121.173zM554.667 405.333c-85.333 0-256-42.667-256-128v-85.333h512v85.333c0 85.333-170.667 128-256 128z" /> -<glyph unicode="" d="M640 490.667v256l-128 128-128-128v-85.333h-256v-597.333h768v426.667h-256zM298.667 149.333h-85.333v85.333h85.333v-85.333zM298.667 320h-85.333v85.333h85.333v-85.333zM298.667 490.667h-85.333v85.333h85.333v-85.333zM554.667 149.333h-85.333v85.333h85.333v-85.333zM554.667 320h-85.333v85.333h85.333v-85.333zM554.667 490.667h-85.333v85.333h85.333v-85.333zM554.667 661.333h-85.333v85.333h85.333v-85.333zM810.667 149.333h-85.333v85.333h85.333v-85.333zM810.667 320h-85.333v85.333h85.333v-85.333z" /> -<glyph unicode="" d="M511.787 874.667c-235.733 0-426.453-190.933-426.453-426.667s190.72-426.667 426.453-426.667c235.733 0 426.88 190.933 426.88 426.667s-191.147 426.667-426.88 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333zM661.333 490.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM362.667 490.667c35.413 0 64 28.587 64 64s-28.587 64-64 64-64-28.587-64-64 28.587-64 64-64zM512 213.333c99.413 0 183.68 62.080 217.813 149.333h-435.627c34.133-87.253 118.4-149.333 217.813-149.333z" /> -<glyph unicode="" d="M490.667 21.333c47.147 0 85.333 38.187 85.333 85.333h-170.667c0-47.147 38.187-85.333 85.333-85.333zM768 277.333v234.667c0 131.2-91.093 240.64-213.333 269.653v29.013c0 35.413-28.587 64-64 64s-64-28.587-64-64v-29.013c-122.24-29.013-213.333-138.453-213.333-269.653v-234.667l-85.333-85.333v-42.667h725.333v42.667l-85.333 85.333z" /> -<glyph unicode="" d="M490.667 21.333c47.147 0 85.333 38.187 85.333 85.333h-170.667c0-47.147 38.187-85.333 85.333-85.333zM768 277.333v234.667c0 131.2-91.093 240.64-213.333 269.653v29.013c0 35.413-28.587 64-64 64s-64-28.587-64-64v-29.013c-122.24-29.013-213.333-138.453-213.333-269.653v-234.667l-85.333-85.333v-42.667h725.333v42.667l-85.333 85.333zM682.667 234.667h-384v277.333c0 106.027 85.973 192 192 192s192-85.973 192-192v-277.333z" /> -<glyph unicode="" d="M490.667 21.333c47.147 0 85.333 38.187 85.333 85.333h-170.667c0-47.147 38.187-85.333 85.333-85.333zM768 512c0 131.2-91.093 240.64-213.333 269.653v29.013c0 35.413-28.587 64-64 64s-64-28.587-64-64v-29.013c-21.76-5.12-42.24-13.653-61.653-23.68l402.987-402.987v157.013zM756.48 149.333l85.333-85.333 54.187 54.4-713.6 713.6-54.4-54.4 124.587-124.587c-24.747-41.173-39.253-89.387-39.253-141.013v-234.667l-85.333-85.333v-42.667h628.48z" /> -<glyph unicode="" d="M280.747 807.253l-61.013 61.013c-102.187-77.867-169.6-198.187-176-334.933h85.333c6.613 113.067 64.853 212.053 151.68 273.92zM852.267 533.333h85.333c-6.4 136.747-73.813 257.067-176 334.933l-60.8-60.8c86.613-62.080 144.853-161.067 151.467-274.133zM768 512c0 131.2-91.093 240.64-213.333 269.653v29.013c0 35.413-28.587 64-64 64s-64-28.587-64-64v-29.013c-122.24-29.013-213.333-138.453-213.333-269.653v-234.667l-85.333-85.333v-42.667h725.333v42.667l-85.333 85.333v234.667zM490.667 21.333c5.973 0 11.733 0.64 17.28 1.707 27.733 5.76 50.56 24.96 61.44 50.347 4.267 10.24 6.613 21.333 6.613 33.28h-170.667c0-47.147 38.187-85.333 85.333-85.333z" /> -<glyph unicode="" d="M490.667 21.333c47.147 0 85.333 38.187 85.333 85.333h-170.667c0-47.147 38.187-85.333 85.333-85.333zM768 277.333v234.667c0 131.2-91.093 240.64-213.333 269.653v29.013c0 35.413-28.587 64-64 64s-64-28.587-64-64v-29.013c-122.24-29.013-213.333-138.453-213.333-269.653v-234.667l-85.333-85.333v-42.667h725.333v42.667l-85.333 85.333zM597.333 541.867l-119.467-145.067h119.467v-76.8h-213.333v76.8l119.467 145.067h-119.467v76.8h213.333v-76.8z" /> -<glyph unicode="" d="M128 746.667v-256h213.333l-42.667 170.667 170.667-42.667v213.333h-256c-47.147 0-85.333-38.187-85.333-85.333zM341.333 405.333h-213.333v-256c0-47.147 38.187-85.333 85.333-85.333h256v213.333l-170.667-42.667 42.667 170.667zM725.333 234.667l-170.667 42.667v-213.333h256c47.147 0 85.333 38.187 85.333 85.333v256h-213.333l42.667-170.667zM810.667 832h-256v-213.333l170.667 42.667-42.667-170.667h213.333v256c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M853.333 789.333h-135.253l-78.080 85.333h-256l-78.080-85.333h-135.253c-47.147 0-85.333-38.187-85.333-85.333v-512c0-47.147 38.187-85.333 85.333-85.333h682.667c47.147 0 85.333 38.187 85.333 85.333v512c0 47.147-38.187 85.333-85.333 85.333zM512 661.333c69.547 0 130.773-33.92 169.813-85.333h-169.813c-70.613 0-128-57.387-128-128 0-15.147 2.987-29.227 7.893-42.667h-88.96c-2.773 13.867-4.267 27.947-4.267 42.667 0 117.76 95.573 213.333 213.333 213.333zM512 234.667c-69.547 0-130.773 33.707-169.6 85.333h169.6c70.613 0 128 57.387 128 128 0 14.933-2.987 29.227-7.893 42.667h88.96c2.773-13.867 4.267-27.947 4.267-42.667 0-117.76-95.573-213.333-213.333-213.333z" /> -<glyph unicode="" d="M682.667 490.667c70.613 0 127.573 57.387 127.573 128s-56.96 128-127.573 128c-70.613 0-128-57.387-128-128s57.387-128 128-128zM341.333 490.667c70.613 0 127.573 57.387 127.573 128s-56.96 128-127.573 128c-70.613 0-128-57.387-128-128s57.387-128 128-128zM341.333 405.333c-99.627 0-298.667-49.92-298.667-149.333v-106.667h597.333v106.667c0 99.413-199.040 149.333-298.667 149.333zM682.667 405.333c-12.373 0-26.24-0.853-41.173-2.347 49.493-35.627 83.84-83.627 83.84-146.987v-106.667h256v106.667c0 99.413-199.040 149.333-298.667 149.333z" /> -<glyph unicode="" d="M704 405.333c-51.413 0-131.2-14.293-192-42.88-60.8 28.587-140.587 42.88-192 42.88-92.373 0-277.333-46.293-277.333-138.667v-117.333h938.667v117.333c0 92.373-184.96 138.667-277.333 138.667zM533.333 213.333h-426.667v53.333c0 22.827 109.227 74.667 213.333 74.667s213.333-51.84 213.333-74.667v-53.333zM917.333 213.333h-320v53.333c0 19.413-8.533 36.693-22.187 52.053 37.76 12.8 83.84 22.613 128.853 22.613 104.107 0 213.333-51.84 213.333-74.667v-53.333zM320 448c82.56 0 149.333 66.987 149.333 149.333s-66.773 149.333-149.333 149.333c-82.347 0-149.333-66.987-149.333-149.333s66.987-149.333 149.333-149.333zM320 682.667c47.147 0 85.333-38.187 85.333-85.333s-38.187-85.333-85.333-85.333-85.333 38.187-85.333 85.333 38.187 85.333 85.333 85.333zM704 448c82.56 0 149.333 66.987 149.333 149.333s-66.773 149.333-149.333 149.333c-82.347 0-149.333-66.987-149.333-149.333s66.987-149.333 149.333-149.333zM704 682.667c47.147 0 85.333-38.187 85.333-85.333s-38.187-85.333-85.333-85.333-85.333 38.187-85.333 85.333 38.187 85.333 85.333 85.333z" /> -<glyph unicode="" d="M512 448c94.293 0 170.667 76.587 170.667 170.667 0 94.293-76.373 170.667-170.667 170.667s-170.667-76.373-170.667-170.667c0-94.080 76.373-170.667 170.667-170.667zM512 362.667c-113.707 0-341.333-56.96-341.333-170.667v-85.333h682.667v85.333c0 113.707-227.627 170.667-341.333 170.667z" /> -<glyph unicode="" d="M640 448c94.293 0 170.667 76.587 170.667 170.667 0 94.293-76.373 170.667-170.667 170.667s-170.667-76.373-170.667-170.667c0-94.080 76.373-170.667 170.667-170.667zM256 533.333v128h-85.333v-128h-128v-85.333h128v-128h85.333v128h128v85.333h-128zM640 362.667c-113.707 0-341.333-56.96-341.333-170.667v-85.333h682.667v85.333c0 113.707-227.627 170.667-341.333 170.667z" /> -<glyph unicode="" d="M512 708.267c49.493 0 89.6-40.107 89.6-89.6s-40.107-89.6-89.6-89.6-89.6 40.107-89.6 89.6 40.107 89.6 89.6 89.6zM512 324.267c126.933 0 260.267-62.080 260.267-89.6v-46.933h-520.533v46.933c0 27.52 133.333 89.6 260.267 89.6zM512 789.333c-94.293 0-170.667-76.373-170.667-170.667 0-94.080 76.373-170.667 170.667-170.667s170.667 76.587 170.667 170.667c0 94.293-76.373 170.667-170.667 170.667zM512 405.333c-113.707 0-341.333-56.96-341.333-170.667v-128h682.667v128c0 113.707-227.627 170.667-341.333 170.667z" /> -<glyph unicode="" d="M426.667 618.667h-85.333v-170.667h-170.667v-85.333h170.667v-170.667h85.333v170.667h170.667v85.333h-170.667zM618.667 700.587v-77.653l106.667 21.333v-452.267h85.333v554.667z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM384 234.667h-85.333v298.667h85.333v-298.667zM554.667 234.667h-85.333v426.667h85.333v-426.667zM725.333 234.667h-85.333v170.667h85.333v-170.667z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM469.333 109.653c-168.32 20.907-298.667 164.267-298.667 338.347 0 26.24 3.2 51.84 8.96 76.373l204.373-204.373v-42.667c0-47.147 38.187-85.333 85.333-85.333v-82.347zM763.52 217.813c-10.88 34.56-42.88 59.52-80.853 59.52h-42.667v128c0 23.467-19.2 42.667-42.667 42.667h-256v85.333h85.333c23.467 0 42.667 19.2 42.667 42.667v85.333h85.333c47.147 0 85.333 38.187 85.333 85.333v17.707c125.013-50.56 213.333-173.013 213.333-316.373 0-88.747-34.133-169.387-89.813-230.187z" /> -<glyph unicode="" d="M213.333 397.653v-170.667l298.667-162.987 298.667 162.987v170.667l-298.667-162.987-298.667 162.987zM512 832l-469.333-256 469.333-256 384 209.493v-294.827h85.333v341.333l-469.333 256z" /> -<glyph unicode="" d="M768 273.707c-32.427 0-61.653-12.587-83.84-32.853l-304 177.28c2.347 9.6 3.84 19.627 3.84 29.867s-1.493 20.267-3.84 29.867l300.8 175.573c22.827-21.333 53.333-34.56 87.040-34.56 70.613 0 128 57.387 128 128s-57.387 128-128 128-128-57.387-128-128c0-10.24 1.493-20.267 3.84-29.867l-300.8-175.573c-22.827 21.333-53.333 34.56-87.040 34.56-70.613 0-128-57.387-128-128s57.387-128 128-128c33.707 0 64.213 13.227 87.040 34.56l304-177.28c-2.133-8.96-3.413-18.347-3.413-27.947 0-68.693 55.68-124.373 124.373-124.373s124.373 55.68 124.373 124.373-55.68 124.373-124.373 124.373z" /> -<glyph unicode="" d="M576 931.413s31.573-113.067 31.573-204.8c0-87.893-57.6-159.36-145.707-159.36s-154.667 71.253-154.667 159.36l1.067 15.36c-85.76-102.613-137.6-234.88-137.6-379.307 0-188.587 152.747-341.333 341.333-341.333s341.333 152.747 341.333 341.333c0 230.187-110.72 435.413-277.333 568.747zM499.627 149.333c-75.947 0-137.6 59.947-137.6 133.973 0 69.333 44.587 117.973 120.107 133.12s153.6 51.413 196.907 109.867c16.64-55.040 25.387-113.067 25.387-172.16 0-112.853-91.733-204.8-204.8-204.8z" /> -<glyph unicode="" d="M810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333zM426.667 234.667l-213.333 213.333 60.373 60.373 152.96-152.96 323.627 323.627 60.373-60.373-384-384z" /> -<glyph unicode="" d="M810.667 746.667v-597.333h-597.333v597.333h597.333zM810.667 832h-597.333c-47.147 0-85.333-38.187-85.333-85.333v-597.333c0-47.147 38.187-85.333 85.333-85.333h597.333c47.147 0 85.333 38.187 85.333 85.333v597.333c0 47.147-38.187 85.333-85.333 85.333z" /> -<glyph unicode="" d="M512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333z" /> -<glyph unicode="" d="M512 661.333c-117.76 0-213.333-95.573-213.333-213.333s95.573-213.333 213.333-213.333 213.333 95.573 213.333 213.333-95.573 213.333-213.333 213.333zM512 874.667c-235.733 0-426.667-190.933-426.667-426.667s190.933-426.667 426.667-426.667 426.667 190.933 426.667 426.667-190.933 426.667-426.667 426.667zM512 106.667c-188.587 0-341.333 152.747-341.333 341.333s152.747 341.333 341.333 341.333 341.333-152.747 341.333-341.333-152.747-341.333-341.333-341.333z" /> -</font></defs></svg> diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.ttf b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.ttf Binary files differdeleted file mode 100755 index f0c07f7a..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.ttf +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.woff b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.woff Binary files differdeleted file mode 100755 index e06f547c..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.woff +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.woff2 b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.woff2 Binary files differdeleted file mode 100755 index ccf4eff7..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/material-design-icons/Material-Design-Icons.woff2 +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.ttf b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.ttf Binary files differdeleted file mode 100755 index 68822caf..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.ttf +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.woff b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.woff Binary files differdeleted file mode 100755 index 1f75afdc..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.woff +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.woff2 b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.woff2 Binary files differdeleted file mode 100755 index 350d1c3a..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Bold.woff2 +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.ttf b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.ttf Binary files differdeleted file mode 100755 index aa453407..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.ttf +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.woff b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.woff Binary files differdeleted file mode 100755 index 3480c6c8..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.woff +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.woff2 b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.woff2 Binary files differdeleted file mode 100755 index 9a4d98c4..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Light.woff2 +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.ttf b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.ttf Binary files differdeleted file mode 100755 index a3c1a1f1..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.ttf +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.woff b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.woff Binary files differdeleted file mode 100755 index 1186773f..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.woff +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.woff2 b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.woff2 Binary files differdeleted file mode 100755 index d10a5926..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Medium.woff2 +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.ttf b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.ttf Binary files differdeleted file mode 100755 index 0e58508a..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.ttf +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.woff b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.woff Binary files differdeleted file mode 100755 index f823258a..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.woff +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.woff2 b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.woff2 Binary files differdeleted file mode 100755 index b7082ef3..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Regular.woff2 +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.ttf b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.ttf Binary files differdeleted file mode 100755 index 8779333b..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.ttf +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.woff b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.woff Binary files differdeleted file mode 100755 index 2a98c1e4..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.woff +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.woff2 b/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.woff2 Binary files differdeleted file mode 100755 index a38025a1..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/font/roboto/Roboto-Thin.woff2 +++ /dev/null diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/index.html b/StoneIsland/plugins/phonegap-plugin-push/example/www/index.html deleted file mode 100755 index d2a72cb6..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/index.html +++ /dev/null @@ -1,56 +0,0 @@ -<!DOCTYPE html> -<!-- - 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. ---> -<html> - <head> - <meta charset="utf-8" /> - <meta name="format-detection" content="telephone=no" /> - <meta name="msapplication-tap-highlight" content="no" /> - <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 --> - <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> - <!-- link rel="stylesheet" type="text/css" href="css/index.css" / --> - <link type="text/css" rel="stylesheet" href="css/materialize.min.css" media="screen,projection"/> - <title>Hello World</title> - </head> - <body> - <nav> - <div class="nav-wrapper"> - <a href="#" class="brand-logo">Push Demo</a> - </div> - </nav> - - <div class="row"> - <div class="col s12 m6"> - <div class="card darken-1"> - <div class="card-content black-text"> - <span class="card-title black-text">Registration ID</span> - <p id="regId">Requested</p> - </div> - </div> - </div> - </div> - - <div id="cards"></div> - - <script type="text/javascript" src="cordova.js"></script> - <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script> - <script type="text/javascript" src="js/materialize.min.js"></script> - <script type="text/javascript" src="js/index.js"></script> - </body> -</html> diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/js/index.js b/StoneIsland/plugins/phonegap-plugin-push/example/www/js/index.js deleted file mode 100755 index 86059f91..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/js/index.js +++ /dev/null @@ -1,77 +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. - */ -var app = { - // Application Constructor - initialize: function() { - this.bindEvents(); - }, - // Bind Event Listeners - // - // Bind any events that are required on startup. Common events are: - // 'load', 'deviceready', 'offline', and 'online'. - bindEvents: function() { - document.addEventListener('deviceready', this.onDeviceReady, false); - }, - // deviceready Event Handler - // - // The scope of 'this' is the event. In order to call the 'receivedEvent' - // function, we must explicitly call 'app.receivedEvent(...);' - onDeviceReady: function() { - var push = PushNotification.init({ - "android": { - "senderID": "1234567890" - }, - "ios": {"alert": "true", "badge": "true", "sound": "true"}, - "windows": {} - }); - - push.on('registration', function(data) { - console.log("registration event"); - document.getElementById("regId").innerHTML = data.registrationId; - console.log(JSON.stringify(data)); - }); - - push.on('notification', function(data) { - console.log("notification event"); - console.log(JSON.stringify(data)); - var cards = document.getElementById("cards"); - var card = '<div class="row">' + - '<div class="col s12 m6">' + - ' <div class="card darken-1">' + - ' <div class="card-content black-text">' + - ' <span class="card-title black-text">' + data.title + '</span>' + - ' <p>' + data.message + '</p>' + - ' </div>' + - ' </div>' + - ' </div>' + - '</div>'; - cards.innerHTML += card; - - push.finish(function () { - console.log('finish successfully called'); - }); - }); - - push.on('error', function(e) { - console.log("push error"); - }); - } -}; - -app.initialize();
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/js/jquery-2.1.1.min.js b/StoneIsland/plugins/phonegap-plugin-push/example/www/js/jquery-2.1.1.min.js deleted file mode 100755 index e5ace116..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/js/jquery-2.1.1.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) -},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b)) -},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec,fc,gc=/#.*$/,hc=/([?&])_=[^&]*/,ic=/^(.*?):[ \t]*([^\r\n]*)$/gm,jc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,kc=/^(?:GET|HEAD)$/,lc=/^\/\//,mc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,nc={},oc={},pc="*/".concat("*");try{fc=location.href}catch(qc){fc=l.createElement("a"),fc.href="",fc=fc.href}ec=mc.exec(fc.toLowerCase())||[];function rc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function sc(a,b,c,d){var e={},f=a===oc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function tc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function uc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function vc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:fc,type:"GET",isLocal:jc.test(ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":pc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?tc(tc(a,n.ajaxSettings),b):tc(n.ajaxSettings,a)},ajaxPrefilter:rc(nc),ajaxTransport:rc(oc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=ic.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||fc)+"").replace(gc,"").replace(lc,ec[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=mc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===ec[1]&&h[2]===ec[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(ec[3]||("http:"===ec[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),sc(nc,k,b,v),2===t)return v;i=k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!kc.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=hc.test(d)?d.replace(hc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+pc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=sc(oc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=uc(k,v,f)),u=vc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var wc=/%20/g,xc=/\[\]$/,yc=/\r?\n/g,zc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Bc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||xc.test(a)?d(a,e):Bc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Bc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Bc(c,a[c],b,e);return d.join("&").replace(wc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Ac.test(this.nodeName)&&!zc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(yc,"\r\n")}}):{name:b.name,value:c.replace(yc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cc=0,Dc={},Ec={0:200,1223:204},Fc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Dc)Dc[a]()}),k.cors=!!Fc&&"withCredentials"in Fc,k.ajax=Fc=!!Fc,n.ajaxTransport(function(a){var b;return k.cors||Fc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Cc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Dc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Ec[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Dc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Gc=[],Hc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Gc.pop()||n.expando+"_"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Hc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Hc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Hc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Gc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Ic=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Ic)return Ic.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Jc=a.document.documentElement;function Kc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Kc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Jc;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Jc})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Kc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Lc=a.jQuery,Mc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Mc),b&&a.jQuery===n&&(a.jQuery=Lc),n},typeof b===U&&(a.jQuery=a.$=n),n}); diff --git a/StoneIsland/plugins/phonegap-plugin-push/example/www/js/materialize.min.js b/StoneIsland/plugins/phonegap-plugin-push/example/www/js/materialize.min.js deleted file mode 100755 index ed30cdaa..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/example/www/js/materialize.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/*! - * Materialize v0.96.1 (http://materializecss.com) - * Copyright 2014-2015 Materialize - * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) - */ -jQuery.easing.jswing=jQuery.easing.swing,jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(a,b,c,d,e){return jQuery.easing[jQuery.easing.def](a,b,c,d,e)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return 0==b?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return 0==b?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(0==b)return c;if(1==(b/=e))return c+d;if(g||(g=.3*e),h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(b-=1))*Math.sin(2*(b*e-f)*Math.PI/g))+c},easeOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(0==b)return c;if(1==(b/=e))return c+d;if(g||(g=.3*e),h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*b)*Math.sin(2*(b*e-f)*Math.PI/g)+d+c},easeInOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(0==b)return c;if(2==(b/=e/2))return c+d;if(g||(g=.3*e*1.5),h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return 1>b?-.5*h*Math.pow(2,10*(b-=1))*Math.sin(2*(b*e-f)*Math.PI/g)+c:h*Math.pow(2,-10*(b-=1))*Math.sin(2*(b*e-f)*Math.PI/g)*.5+d+c},easeInBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),d*(b/=e)*b*((f+1)*b-f)+c},easeOutBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),d*((b=b/e-1)*b*((f+1)*b+f)+1)+c},easeInOutBack:function(a,b,c,d,e,f){return void 0==f&&(f=1.70158),(b/=e/2)<1?d/2*b*b*(((f*=1.525)+1)*b-f)+c:d/2*((b-=2)*b*(((f*=1.525)+1)*b+f)+2)+c},easeInBounce:function(a,b,c,d,e){return d-jQuery.easing.easeOutBounce(a,e-b,0,d,e)+c},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?7.5625*d*b*b+c:2/2.75>b?d*(7.5625*(b-=1.5/2.75)*b+.75)+c:2.5/2.75>b?d*(7.5625*(b-=2.25/2.75)*b+.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+.984375)+c},easeInOutBounce:function(a,b,c,d,e){return e/2>b?.5*jQuery.easing.easeInBounce(a,2*b,0,d,e)+c:.5*jQuery.easing.easeOutBounce(a,2*b-e,0,d,e)+.5*d+c}}),jQuery.extend(jQuery.easing,{easeInOutMaterial:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:d/4*((b-=2)*b*b+2)+c}}),!function(a){function b(a){var b=a.length,d=c.type(a);return"function"===d||c.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===d||0===b||"number"==typeof b&&b>0&&b-1 in a}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return null!=a&&a==a.window},c.type=function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?e[g.call(a)]||"object":typeof a},c.isArray=Array.isArray||function(a){return"array"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,"constructor")&&!f.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;g>f&&(e=c.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=c.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=c.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=c.call(a[f],f,a[f]),e===!1)break;return a},c.data=function(a,b,e){if(void 0===e){var f=a[c.expando],g=f&&d[f];if(void 0===b)return g;if(g&&b in g)return g[b]}else if(void 0!==b){var f=a[c.expando]||(a[c.expando]=++c.uuid);return d[f]=d[f]||{},d[f][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&c.each(b,function(a,b){delete f[b]})},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for("boolean"==typeof h&&(k=h,h=arguments[i]||{},i++),"object"!=typeof h&&"function"!==c.type(h)&&(h={}),i===j&&(h=this,i--);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):void 0!==d&&(h[e]=d));return h},c.queue=function(a,d,e){function f(a,c){var d=c||[];return null!=a&&(b(Object(a))?!function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;)a[e++]=b[d++];if(c!==c)for(;void 0!==b[d];)a[e++]=b[d++];return a.length=e,a}(d,"string"==typeof a?[a]:a):[].push.call(d,a)),d}if(a){d=(d||"fx")+"queue";var g=c.data(a,d);return e?(!g||c.isArray(e)?g=c.data(a,d,f(e)):g.push(e),g):g||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||"fx";var e=c.queue(d,b),f=e.shift();"inprogress"===f&&(f=e.shift()),f&&("fx"===b&&e.unshift("inprogress"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error("Not a DOM node.")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function a(){for(var a=this.offsetParent||document;a&&"html"===!a.nodeType.toLowerCase&&"static"===a.style.position;)a=a.offsetParent;return a||document}var b=this[0],a=a.apply(b),d=this.offset(),e=/^(?:body|html)$/i.test(a.nodeName)?{top:0,left:0}:c(a).offset();return d.top-=parseFloat(b.style.marginTop)||0,d.left-=parseFloat(b.style.marginLeft)||0,a.style&&(e.top+=parseFloat(a.style.borderTopWidth)||0,e.left+=parseFloat(a.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando="velocity"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h="Boolean Number String Function Array Date RegExp Object Error".split(" "),i=0;i<h.length;i++)e["[object "+h[i]+"]"]=h[i].toLowerCase();c.fn.init.prototype=c.fn,a.Velocity={Utilities:c}}}(window),function(a){"object"==typeof module&&"object"==typeof module.exports?module.exports=a():"function"==typeof define&&define.amd?define(a):a()}(function(){return function(a,b,c,d){function e(a){for(var b=-1,c=a?a.length:0,d=[];++b<c;){var e=a[b];e&&d.push(e)}return d}function f(a){return p.isWrapped(a)?a=[].slice.call(a):p.isNode(a)&&(a=[a]),a}function g(a){var b=m.data(a,"velocity");return null===b?d:b}function h(a){return function(b){return Math.round(b*a)*(1/a)}}function i(a,c,d,e){function f(a,b){return 1-3*b+3*a}function g(a,b){return 3*b-6*a}function h(a){return 3*a}function i(a,b,c){return((f(b,c)*a+g(b,c))*a+h(b))*a}function j(a,b,c){return 3*f(b,c)*a*a+2*g(b,c)*a+h(b)}function k(b,c){for(var e=0;p>e;++e){var f=j(c,a,d);if(0===f)return c;var g=i(c,a,d)-b;c-=g/f}return c}function l(){for(var b=0;t>b;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g;while(Math.abs(f)>r&&++h<s);return g}function n(b){for(var c=0,e=1,f=t-1;e!=f&&x[e]<=b;++e)c+=u;--e;var g=(b-x[e])/(x[e+1]-x[e]),h=c+g*u,i=j(h,a,d);return i>=q?k(b,h):0==i?h:m(b,c,c+u)}function o(){y=!0,(a!=c||d!=e)&&l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v="Float32Array"in b;if(4!==arguments.length)return!1;for(var w=0;4>w;++w)if("number"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A="generateBezier("+[a,c,d,e]+")";return z.toString=function(){return A},z}function j(a,b){var c=a;return p.isString(a)?t.Easings[a]||(c=!1):c=p.isArray(a)&&1===a.length?h.apply(null,a):p.isArray(a)&&2===a.length?u.apply(null,a.concat([b])):p.isArray(a)&&4===a.length?i.apply(null,a):!1,c===!1&&(c=t.Easings[t.defaults.easing]?t.defaults.easing:s),c}function k(a){if(a){var b=(new Date).getTime(),c=t.State.calls.length;c>1e4&&(t.State.calls=e(t.State.calls));for(var f=0;c>f;f++)if(t.State.calls[f]){var h=t.State.calls[f],i=h[0],j=h[2],n=h[3],o=!!n,q=null;n||(n=t.State.calls[f][3]=b-16);for(var r=Math.min((b-n)/j.duration,1),s=0,u=i.length;u>s;s++){var w=i[s],y=w.element;if(g(y)){var z=!1;if(j.display!==d&&null!==j.display&&"none"!==j.display){if("flex"===j.display){var A=["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex"];m.each(A,function(a,b){v.setPropertyValue(y,"display",b)})}v.setPropertyValue(y,"display",j.display)}j.visibility!==d&&"hidden"!==j.visibility&&v.setPropertyValue(y,"visibility",j.visibility);for(var B in w)if("element"!==B){var C,D=w[B],E=p.isString(D.easing)?t.Easings[D.easing]:D.easing;if(1===r)C=D.endValue;else{var F=D.endValue-D.startValue;if(C=D.startValue+F*E(r,j,F),!o&&C===D.currentValue)continue}if(D.currentValue=C,"tween"===B)q=C;else{if(v.Hooks.registered[B]){var G=v.Hooks.getRoot(B),H=g(y).rootPropertyValueCache[G];H&&(D.rootPropertyValue=H)}var I=v.setPropertyValue(y,B,D.currentValue+(0===parseFloat(C)?"":D.unitType),D.rootPropertyValue,D.scrollData);v.Hooks.registered[B]&&(g(y).rootPropertyValueCache[G]=v.Normalizations.registered[G]?v.Normalizations.registered[G]("extract",null,I[1]):I[1]),"transform"===I[0]&&(z=!0)}}j.mobileHA&&g(y).transformCache.translate3d===d&&(g(y).transformCache.translate3d="(0px, 0px, 0px)",z=!0),z&&v.flushTransformCache(y)}}j.display!==d&&"none"!==j.display&&(t.State.calls[f][2].display=!1),j.visibility!==d&&"hidden"!==j.visibility&&(t.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],r,Math.max(0,n+j.duration-b),n,q),1===r&&l(f)}}t.State.isTicking&&x(k)}function l(a,b){if(!t.State.calls[a])return!1;for(var c=t.State.calls[a][0],e=t.State.calls[a][1],f=t.State.calls[a][2],h=t.State.calls[a][4],i=!1,j=0,k=c.length;k>j;j++){var l=c[j].element;if(b||f.loop||("none"===f.display&&v.setPropertyValue(l,"display",f.display),"hidden"===f.visibility&&v.setPropertyValue(l,"visibility",f.visibility)),f.loop!==!0&&(m.queue(l)[1]===d||!/\.velocityQueueEntryFlag/i.test(m.queue(l)[1]))&&g(l)){g(l).isAnimating=!1,g(l).rootPropertyValueCache={};var n=!1;m.each(v.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=g(l).transformCache[b];g(l).transformCache[b]!==d&&new RegExp("^\\("+c+"[^.]").test(e)&&(n=!0,delete g(l).transformCache[b])}),f.mobileHA&&(n=!0,delete g(l).transformCache.translate3d),n&&v.flushTransformCache(l),v.Values.removeClass(l,"velocity-animating")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(o){setTimeout(function(){throw o},1)}h&&f.loop!==!0&&h(e),g(l)&&f.loop===!0&&!b&&(m.each(g(l).tweensContainer,function(a,b){/^rotate/.test(a)&&360===parseFloat(b.endValue)&&(b.endValue=0,b.startValue=360),/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&"%"===b.unitType&&(b.endValue=0,b.startValue=100)}),t(l,"reverse",{loop:!0,delay:f.delay})),f.queue!==!1&&m.dequeue(l,f.queue)}t.State.calls[a]=!1;for(var p=0,q=t.State.calls.length;q>p;p++)if(t.State.calls[p]!==!1){i=!0;break}i===!1&&(t.State.isTicking=!1,delete t.State.calls,t.State.calls=[])}var m,n=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement("div");if(b.innerHTML="<!--[if IE "+a+"]><span></span><![endif]-->",b.getElementsByTagName("span").length)return b=null,a}return d}(),o=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),p={isString:function(a){return"string"==typeof a},isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isNodeList:function(a){return"object"==typeof a&&/^\[object (HTMLCollection|NodeList|Object)\]$/.test(Object.prototype.toString.call(a))&&a.length!==d&&(0===a.length||"object"==typeof a[0]&&a[0].nodeType>0)},isWrapped:function(a){return a&&(a.jquery||b.Zepto&&b.Zepto.zepto.isZ(a))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)return!1;return!0}},q=!1;if(a.fn&&a.fn.jquery?(m=a,q=!0):m=b.Velocity.Utilities,8>=n&&!q)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(7>=n)return void(jQuery.fn.velocity=jQuery.fn.animate);var r=400,s="swing",t={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:m,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:"",duration:r,easing:s,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(a){m.data(a,"velocity",{isSVG:p.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};b.pageYOffset!==d?(t.State.scrollAnchor=b,t.State.scrollPropertyLeft="pageXOffset",t.State.scrollPropertyTop="pageYOffset"):(t.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,t.State.scrollPropertyLeft="scrollLeft",t.State.scrollPropertyTop="scrollTop");var u=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;h=c(h||i,g),j.push(1+h.x),k+=16,Math.abs(h.x)>l&&Math.abs(h.v)>l;);return f?function(a){return j[a*(j.length-1)|0]}:k}}();t.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},m.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(a,b){t.Easings[b[0]]=i.apply(null,b[1])});var v=t.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"]},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var a=0;a<v.Lists.colors.length;a++){var b="color"===v.Lists.colors[a]?"0 0 0 1":"255 255 255 1";v.Hooks.templates[v.Lists.colors[a]]=["Red Green Blue Alpha",b]}var c,d,e;if(n)for(c in v.Hooks.templates){d=v.Hooks.templates[c],e=d[0].split(" ");var f=d[1].match(v.RegEx.valueSplit);"Color"===e[0]&&(e.push(e.shift()),f.push(f.shift()),v.Hooks.templates[c]=[e.join(" "),f.join(" ")])}for(c in v.Hooks.templates){d=v.Hooks.templates[c],e=d[0].split(" ");for(var a in e){var g=c+e[a],h=a;v.Hooks.registered[g]=[c,h]}}},getRoot:function(a){var b=v.Hooks.registered[a];return b?b[0]:a},cleanRootPropertyValue:function(a,b){return v.RegEx.valueUnwrap.test(b)&&(b=b.match(v.RegEx.valueUnwrap)[1]),v.Values.isCSSNullValue(b)&&(b=v.Hooks.templates[a][1]),b},extractValue:function(a,b){var c=v.Hooks.registered[a];if(c){var d=c[0],e=c[1];return b=v.Hooks.cleanRootPropertyValue(d,b),b.toString().match(v.RegEx.valueSplit)[e]}return b},injectValue:function(a,b,c){var d=v.Hooks.registered[a];if(d){var e,f,g=d[0],h=d[1];return c=v.Hooks.cleanRootPropertyValue(g,c),e=c.toString().match(v.RegEx.valueSplit),e[h]=b,f=e.join(" ")}return c}},Normalizations:{registered:{clip:function(a,b,c){switch(a){case"name":return"clip";case"extract":var d;return v.RegEx.wrappedValueAlreadyExtracted.test(c)?d=c:(d=c.toString().match(v.RegEx.valueUnwrap),d=d?d[1].replace(/,(\s+)?/g," "):c),d;case"inject":return"rect("+c+")"}},blur:function(a,b,c){switch(a){case"name":return t.State.isFirefox?"filter":"-webkit-filter";case"extract":var d=parseFloat(c);if(!d&&0!==d){var e=c.toString().match(/blur\(([0-9]+[A-z]+)\)/i);d=e?e[1]:0}return d;case"inject":return parseFloat(c)?"blur("+c+")":"none"}},opacity:function(a,b,c){if(8>=n)switch(a){case"name":return"filter";case"extract":var d=c.toString().match(/alpha\(opacity=(.*)\)/i);return c=d?d[1]/100:1;case"inject":return b.style.zoom=1,parseFloat(c)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(c),10)+")"}else switch(a){case"name":return"opacity";case"extract":return c;case"inject":return c}}},register:function(){9>=n||t.State.isGingerbread||(v.Lists.transformsBase=v.Lists.transformsBase.concat(v.Lists.transforms3D));for(var a=0;a<v.Lists.transformsBase.length;a++)!function(){var b=v.Lists.transformsBase[a];v.Normalizations.registered[b]=function(a,c,e){switch(a){case"name":return"transform";case"extract":return g(c)===d||g(c).transformCache[b]===d?/^scale/i.test(b)?1:0:g(c).transformCache[b].replace(/[()]/g,"");case"inject":var f=!1;switch(b.substr(0,b.length-1)){case"translate":f=!/(%|px|em|rem|vw|vh|\d)$/i.test(e);break;case"scal":case"scale":t.State.isAndroid&&g(c).transformCache[b]===d&&1>e&&(e=1),f=!/(\d)$/i.test(e);break;case"skew":f=!/(deg|\d)$/i.test(e);break;case"rotate":f=!/(deg|\d)$/i.test(e)}return f||(g(c).transformCache[b]="("+e+")"),g(c).transformCache[b]}}}();for(var a=0;a<v.Lists.colors.length;a++)!function(){var b=v.Lists.colors[a];v.Normalizations.registered[b]=function(a,c,e){switch(a){case"name":return b;case"extract":var f;if(v.RegEx.wrappedValueAlreadyExtracted.test(e))f=e;else{var g,h={black:"rgb(0, 0, 0)",blue:"rgb(0, 0, 255)",gray:"rgb(128, 128, 128)",green:"rgb(0, 128, 0)",red:"rgb(255, 0, 0)",white:"rgb(255, 255, 255)"};/^[A-z]+$/i.test(e)?g=h[e]!==d?h[e]:h.black:v.RegEx.isHex.test(e)?g="rgb("+v.Values.hexToRgb(e).join(" ")+")":/^rgba?\(/i.test(e)||(g=h.black),f=(g||e).toString().match(v.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g," ")}return 8>=n||3!==f.split(" ").length||(f+=" 1"),f;case"inject":return 8>=n?4===e.split(" ").length&&(e=e.split(/\s+/).slice(0,3).join(" ")):3===e.split(" ").length&&(e+=" 1"),(8>=n?"rgb":"rgba")+"("+e.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")"}}}()}},Names:{camelCase:function(a){return a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(n||t.State.isAndroid&&!t.State.isChrome)&&(b+="|transform"),new RegExp("^("+b+")$","i").test(a)},prefixCheck:function(a){if(t.State.prefixMatches[a])return[t.State.prefixMatches[a],!0];for(var b=["","Webkit","Moz","ms","O"],c=0,d=b.length;d>c;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\w/,function(a){return a.toUpperCase()}),p.isString(t.State.prefixElement.style[e]))return t.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return 0==a||/^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?"deg":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?"":"px"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?"inline":/^(li)$/i.test(b)?"list-item":/^(tr)$/i.test(b)?"table-row":/^(table)$/i.test(b)?"table":/^(tbody)$/i.test(b)?"table-row-group":"block"},addClass:function(a,b){a.classList?a.classList.add(b):a.className+=(a.className.length?" ":"")+b},removeClass:function(a,b){a.classList?a.classList.remove(b):a.className=a.className.toString().replace(new RegExp("(^|\\s)"+b.split(" ").join("|")+"(\\s|$)","gi")," ")}},getPropertyValue:function(a,c,e,f){function h(a,c){function e(){j&&v.setPropertyValue(a,"display","none")}var i=0;if(8>=n)i=m.css(a,c);else{var j=!1;if(/^(width|height)$/.test(c)&&0===v.getPropertyValue(a,"display")&&(j=!0,v.setPropertyValue(a,"display",v.Values.getDisplayType(a))),!f){if("height"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(v.getPropertyValue(a,"borderTopWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderBottomWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingTop"))||0)-(parseFloat(v.getPropertyValue(a,"paddingBottom"))||0);return e(),k}if("width"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(v.getPropertyValue(a,"borderLeftWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderRightWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingLeft"))||0)-(parseFloat(v.getPropertyValue(a,"paddingRight"))||0);return e(),l}}var o;o=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),"borderColor"===c&&(c="borderTopColor"),i=9===n&&"filter"===c?o.getPropertyValue(c):o[c],(""===i||null===i)&&(i=a.style[c]),e()}if("auto"===i&&/^(top|right|bottom|left)$/i.test(c)){var p=h(a,"position");("fixed"===p||"absolute"===p&&/top|left/i.test(c))&&(i=m(a).position()[c]+"px")}return i}var i;if(v.Hooks.registered[c]){var j=c,k=v.Hooks.getRoot(j);e===d&&(e=v.getPropertyValue(a,v.Names.prefixCheck(k)[0])),v.Normalizations.registered[k]&&(e=v.Normalizations.registered[k]("extract",a,e)),i=v.Hooks.extractValue(j,e)}else if(v.Normalizations.registered[c]){var l,o;l=v.Normalizations.registered[c]("name",a),"transform"!==l&&(o=h(a,v.Names.prefixCheck(l)[0]),v.Values.isCSSNullValue(o)&&v.Hooks.templates[c]&&(o=v.Hooks.templates[c][1])),i=v.Normalizations.registered[c]("extract",a,o)}if(!/^[\d-]/.test(i))if(g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(p){i=0}else i=a.getAttribute(c);else i=h(a,v.Names.prefixCheck(c)[0]);return v.Values.isCSSNullValue(i)&&(i=0),t.debug>=2&&console.log("Get "+c+": "+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if("scroll"===c)f.container?f.container["scroll"+f.direction]=d:"Left"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(v.Normalizations.registered[c]&&"transform"===v.Normalizations.registered[c]("name",a))v.Normalizations.registered[c]("inject",a,d),h="transform",d=g(a).transformCache[c];else{if(v.Hooks.registered[c]){var i=c,j=v.Hooks.getRoot(c);e=e||v.getPropertyValue(a,j),d=v.Hooks.injectValue(i,d,e),c=j}if(v.Normalizations.registered[c]&&(d=v.Normalizations.registered[c]("inject",a,d),c=v.Normalizations.registered[c]("name",a)),h=v.Names.prefixCheck(c)[0],8>=n)try{a.style[h]=d}catch(k){t.debug&&console.log("Browser does not support ["+d+"] for ["+h+"]")}else g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d;t.debug>=2&&console.log("Set "+c+" ("+h+"): "+d)}return[h,d]},flushTransformCache:function(a){function b(b){return parseFloat(v.getPropertyValue(a,b))}var c="";if((n||t.State.isAndroid&&!t.State.isChrome)&&g(a).isSVG){var d={translate:[b("translateX"),b("translateY")],skewX:[b("skewX")],skewY:[b("skewY")],scale:1!==b("scale")?[b("scale"),b("scale")]:[b("scaleX"),b("scaleY")],rotate:[b("rotateZ"),0,0]};m.each(g(a).transformCache,function(a){/^translate/i.test(a)?a="translate":/^scale/i.test(a)?a="scale":/^rotate/i.test(a)&&(a="rotate"),d[a]&&(c+=a+"("+d[a].join(" ")+") ",delete d[a])})}else{var e,f;m.each(g(a).transformCache,function(b){return e=g(a).transformCache[b],"transformPerspective"===b?(f=e,!0):(9===n&&"rotateZ"===b&&(b="rotate"),void(c+=b+e+" "))}),f&&(c="perspective"+f+" "+c)}v.setPropertyValue(a,"transform",c)}};v.Hooks.register(),v.Normalizations.register(),t.hook=function(a,b,c){var e=d;return a=f(a),m.each(a,function(a,f){if(g(f)===d&&t.init(f),c===d)e===d&&(e=t.CSS.getPropertyValue(f,b));else{var h=t.CSS.setPropertyValue(f,b,c);"transform"===h[0]&&t.CSS.flushTransformCache(f),e=h}}),e};var w=function(){function a(){return h?B.promise||null:i}function e(){function a(){function a(a,b){var c=d,e=d,g=d;return p.isArray(a)?(c=a[0],!p.isArray(a[1])&&/^[\d-]/.test(a[1])||p.isFunction(a[1])||v.RegEx.isHex.test(a[1])?g=a[1]:(p.isString(a[1])&&!v.RegEx.isHex.test(a[1])||p.isArray(a[1]))&&(e=b?a[1]:j(a[1],h.duration),a[2]!==d&&(g=a[2]))):c=a,b||(e=e||h.easing),p.isFunction(c)&&(c=c.call(f,y,x)),p.isFunction(g)&&(g=g.call(f,y,x)),[c||0,e,g]}function l(a,b){var c,d;return d=(b||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,""}),c||(c=v.Values.getUnitType(a)),[d,c]}function n(){var a={myParent:f.parentNode||c.body,position:v.getPropertyValue(f,"position"),fontSize:v.getPropertyValue(f,"fontSize")},d=a.position===I.lastPosition&&a.myParent===I.lastParent,e=a.fontSize===I.lastFontSize;I.lastParent=a.myParent,I.lastPosition=a.position,I.lastFontSize=a.fontSize;var h=100,i={};if(e&&d)i.emToPx=I.lastEmToPx,i.percentToPxWidth=I.lastPercentToPxWidth,i.percentToPxHeight=I.lastPercentToPxHeight;else{var j=g(f).isSVG?c.createElementNS("http://www.w3.org/2000/svg","rect"):c.createElement("div");t.init(j),a.myParent.appendChild(j),m.each(["overflow","overflowX","overflowY"],function(a,b){t.CSS.setPropertyValue(j,b,"hidden")}),t.CSS.setPropertyValue(j,"position",a.position),t.CSS.setPropertyValue(j,"fontSize",a.fontSize),t.CSS.setPropertyValue(j,"boxSizing","content-box"),m.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(a,b){t.CSS.setPropertyValue(j,b,h+"%")}),t.CSS.setPropertyValue(j,"paddingLeft",h+"em"),i.percentToPxWidth=I.lastPercentToPxWidth=(parseFloat(v.getPropertyValue(j,"width",null,!0))||1)/h,i.percentToPxHeight=I.lastPercentToPxHeight=(parseFloat(v.getPropertyValue(j,"height",null,!0))||1)/h,i.emToPx=I.lastEmToPx=(parseFloat(v.getPropertyValue(j,"paddingLeft"))||1)/h,a.myParent.removeChild(j)}return null===I.remToPx&&(I.remToPx=parseFloat(v.getPropertyValue(c.body,"fontSize"))||16),null===I.vwToPx&&(I.vwToPx=parseFloat(b.innerWidth)/100,I.vhToPx=parseFloat(b.innerHeight)/100),i.remToPx=I.remToPx,i.vwToPx=I.vwToPx,i.vhToPx=I.vhToPx,t.debug>=1&&console.log("Unit ratios: "+JSON.stringify(i),f),i}if(h.begin&&0===y)try{h.begin.call(o,o)}catch(r){setTimeout(function(){throw r},1)}if("scroll"===C){var u,w,z,A=/^x$/i.test(h.axis)?"Left":"Top",D=parseFloat(h.offset)||0;h.container?p.isWrapped(h.container)||p.isNode(h.container)?(h.container=h.container[0]||h.container,u=h.container["scroll"+A],z=u+m(f).position()[A.toLowerCase()]+D):h.container=null:(u=t.State.scrollAnchor[t.State["scrollProperty"+A]],w=t.State.scrollAnchor[t.State["scrollProperty"+("Left"===A?"Top":"Left")]],z=m(f).offset()[A.toLowerCase()]+D),i={scroll:{rootPropertyValue:!1,startValue:u,currentValue:u,endValue:z,unitType:"",easing:h.easing,scrollData:{container:h.container,direction:A,alternateValue:w}},element:f},t.debug&&console.log("tweensContainer (scroll): ",i.scroll,f)}else if("reverse"===C){if(!g(f).tweensContainer)return void m.dequeue(f,h.queue);"none"===g(f).opts.display&&(g(f).opts.display="auto"),"hidden"===g(f).opts.visibility&&(g(f).opts.visibility="visible"),g(f).opts.loop=!1,g(f).opts.begin=null,g(f).opts.complete=null,s.easing||delete h.easing,s.duration||delete h.duration,h=m.extend({},g(f).opts,h);var E=m.extend(!0,{},g(f).tweensContainer);for(var F in E)if("element"!==F){var G=E[F].startValue;E[F].startValue=E[F].currentValue=E[F].endValue,E[F].endValue=G,p.isEmptyObject(s)||(E[F].easing=h.easing),t.debug&&console.log("reverse tweensContainer ("+F+"): "+JSON.stringify(E[F]),f)}i=E}else if("start"===C){var E;g(f).tweensContainer&&g(f).isAnimating===!0&&(E=g(f).tweensContainer),m.each(q,function(b,c){if(RegExp("^"+v.Lists.colors.join("$|^")+"$").test(b)){var e=a(c,!0),f=e[0],g=e[1],h=e[2];if(v.RegEx.isHex.test(f)){for(var i=["Red","Green","Blue"],j=v.Values.hexToRgb(f),k=h?v.Values.hexToRgb(h):d,l=0;l<i.length;l++){var m=[j[l]];g&&m.push(g),k!==d&&m.push(k[l]),q[b+i[l]]=m}delete q[b]}}});for(var H in q){var K=a(q[H]),L=K[0],M=K[1],N=K[2];H=v.Names.camelCase(H);var O=v.Hooks.getRoot(H),P=!1;if(g(f).isSVG||"tween"===O||v.Names.prefixCheck(O)[1]!==!1||v.Normalizations.registered[O]!==d){(h.display!==d&&null!==h.display&&"none"!==h.display||h.visibility!==d&&"hidden"!==h.visibility)&&/opacity|filter/.test(H)&&!N&&0!==L&&(N=0),h._cacheValues&&E&&E[H]?(N===d&&(N=E[H].endValue+E[H].unitType),P=g(f).rootPropertyValueCache[O]):v.Hooks.registered[H]?N===d?(P=v.getPropertyValue(f,O),N=v.getPropertyValue(f,H,P)):P=v.Hooks.templates[O][1]:N===d&&(N=v.getPropertyValue(f,H));var Q,R,S,T=!1;if(Q=l(H,N),N=Q[0],S=Q[1],Q=l(H,L),L=Q[0].replace(/^([+-\/*])=/,function(a,b){return T=b,""}),R=Q[1],N=parseFloat(N)||0,L=parseFloat(L)||0,"%"===R&&(/^(fontSize|lineHeight)$/.test(H)?(L/=100,R="em"):/^scale/.test(H)?(L/=100,R=""):/(Red|Green|Blue)$/i.test(H)&&(L=L/100*255,R="")),/[\/*]/.test(T))R=S;else if(S!==R&&0!==N)if(0===L)R=S;else{e=e||n();var U=/margin|padding|left|right|width|text|word|letter/i.test(H)||/X$/.test(H)||"x"===H?"x":"y";switch(S){case"%":N*="x"===U?e.percentToPxWidth:e.percentToPxHeight;break;case"px":break;default:N*=e[S+"ToPx"]}switch(R){case"%":N*=1/("x"===U?e.percentToPxWidth:e.percentToPxHeight);break;case"px":break;default: -N*=1/e[R+"ToPx"]}}switch(T){case"+":L=N+L;break;case"-":L=N-L;break;case"*":L=N*L;break;case"/":L=N/L}i[H]={rootPropertyValue:P,startValue:N,currentValue:N,endValue:L,unitType:R,easing:M},t.debug&&console.log("tweensContainer ("+H+"): "+JSON.stringify(i[H]),f)}else t.debug&&console.log("Skipping ["+O+"] due to a lack of browser support.")}i.element=f}i.element&&(v.Values.addClass(f,"velocity-animating"),J.push(i),""===h.queue&&(g(f).tweensContainer=i,g(f).opts=h),g(f).isAnimating=!0,y===x-1?(t.State.calls.push([J,o,h,null,B.resolver]),t.State.isTicking===!1&&(t.State.isTicking=!0,k())):y++)}var e,f=this,h=m.extend({},t.defaults,s),i={};switch(g(f)===d&&t.init(f),parseFloat(h.delay)&&h.queue!==!1&&m.queue(f,h.queue,function(a){t.velocityQueueEntryFlag=!0,g(f).delayTimer={setTimeout:setTimeout(a,parseFloat(h.delay)),next:a}}),h.duration.toString().toLowerCase()){case"fast":h.duration=200;break;case"normal":h.duration=r;break;case"slow":h.duration=600;break;default:h.duration=parseFloat(h.duration)||1}t.mock!==!1&&(t.mock===!0?h.duration=h.delay=1:(h.duration*=parseFloat(t.mock)||1,h.delay*=parseFloat(t.mock)||1)),h.easing=j(h.easing,h.duration),h.begin&&!p.isFunction(h.begin)&&(h.begin=null),h.progress&&!p.isFunction(h.progress)&&(h.progress=null),h.complete&&!p.isFunction(h.complete)&&(h.complete=null),h.display!==d&&null!==h.display&&(h.display=h.display.toString().toLowerCase(),"auto"===h.display&&(h.display=t.CSS.Values.getDisplayType(f))),h.visibility!==d&&null!==h.visibility&&(h.visibility=h.visibility.toString().toLowerCase()),h.mobileHA=h.mobileHA&&t.State.isMobile&&!t.State.isGingerbread,h.queue===!1?h.delay?setTimeout(a,h.delay):a():m.queue(f,h.queue,function(b,c){return c===!0?(B.promise&&B.resolver(o),!0):(t.velocityQueueEntryFlag=!0,void a(b))}),""!==h.queue&&"fx"!==h.queue||"inprogress"===m.queue(f)[0]||m.dequeue(f)}var h,i,n,o,q,s,u=arguments[0]&&(arguments[0].p||m.isPlainObject(arguments[0].properties)&&!arguments[0].properties.names||p.isString(arguments[0].properties));if(p.isWrapped(this)?(h=!1,n=0,o=this,i=this):(h=!0,n=1,o=u?arguments[0].elements||arguments[0].e:arguments[0]),o=f(o)){u?(q=arguments[0].properties||arguments[0].p,s=arguments[0].options||arguments[0].o):(q=arguments[n],s=arguments[n+1]);var x=o.length,y=0;if(!/^(stop|finish)$/i.test(q)&&!m.isPlainObject(s)){var z=n+1;s={};for(var A=z;A<arguments.length;A++)p.isArray(arguments[A])||!/^(fast|normal|slow)$/i.test(arguments[A])&&!/^\d/.test(arguments[A])?p.isString(arguments[A])||p.isArray(arguments[A])?s.easing=arguments[A]:p.isFunction(arguments[A])&&(s.complete=arguments[A]):s.duration=arguments[A]}var B={promise:null,resolver:null,rejecter:null};h&&t.Promise&&(B.promise=new t.Promise(function(a,b){B.resolver=a,B.rejecter=b}));var C;switch(q){case"scroll":C="scroll";break;case"reverse":C="reverse";break;case"finish":case"stop":m.each(o,function(a,b){g(b)&&g(b).delayTimer&&(clearTimeout(g(b).delayTimer.setTimeout),g(b).delayTimer.next&&g(b).delayTimer.next(),delete g(b).delayTimer)});var D=[];return m.each(t.State.calls,function(a,b){b&&m.each(b[1],function(c,e){var f=s===d?"":s;return f===!0||b[2].queue===f||s===d&&b[2].queue===!1?void m.each(o,function(c,d){d===e&&((s===!0||p.isString(s))&&(m.each(m.queue(d,p.isString(s)?s:""),function(a,b){p.isFunction(b)&&b(null,!0)}),m.queue(d,p.isString(s)?s:"",[])),"stop"===q?(g(d)&&g(d).tweensContainer&&f!==!1&&m.each(g(d).tweensContainer,function(a,b){b.endValue=b.currentValue}),D.push(a)):"finish"===q&&(b[2].duration=1))}):!0})}),"stop"===q&&(m.each(D,function(a,b){l(b,!0)}),B.promise&&B.resolver(o)),a();default:if(!m.isPlainObject(q)||p.isEmptyObject(q)){if(p.isString(q)&&t.Redirects[q]){var E=m.extend({},s),F=E.duration,G=E.delay||0;return E.backwards===!0&&(o=m.extend(!0,[],o).reverse()),m.each(o,function(a,b){parseFloat(E.stagger)?E.delay=G+parseFloat(E.stagger)*a:p.isFunction(E.stagger)&&(E.delay=G+E.stagger.call(b,a,x)),E.drag&&(E.duration=parseFloat(F)||(/^(callout|transition)/.test(q)?1e3:r),E.duration=Math.max(E.duration*(E.backwards?1-a/x:(a+1)/x),.75*E.duration,200)),t.Redirects[q].call(b,b,E||{},a,x,o,B.promise?B:d)}),a()}var H="Velocity: First argument ("+q+") was not a property map, a known action, or a registered redirect. Aborting.";return B.promise?B.rejecter(new Error(H)):console.log(H),a()}C="start"}var I={lastParent:null,lastPosition:null,lastFontSize:null,lastPercentToPxWidth:null,lastPercentToPxHeight:null,lastEmToPx:null,remToPx:null,vwToPx:null,vhToPx:null},J=[];m.each(o,function(a,b){p.isNode(b)&&e.call(b)});var K,E=m.extend({},t.defaults,s);if(E.loop=parseInt(E.loop),K=2*E.loop-1,E.loop)for(var L=0;K>L;L++){var M={delay:E.delay,progress:E.progress};L===K-1&&(M.display=E.display,M.visibility=E.visibility,M.complete=E.complete),w(o,"reverse",M)}return a()}};t=m.extend(w,t),t.animate=w;var x=b.requestAnimationFrame||o;return t.State.isMobile||c.hidden===d||c.addEventListener("visibilitychange",function(){c.hidden?(x=function(a){return setTimeout(function(){a(!0)},16)},k()):x=b.requestAnimationFrame||o}),a.Velocity=t,a!==b&&(a.fn.velocity=w,a.fn.velocity.defaults=t.defaults),m.each(["Down","Up"],function(a,b){t.Redirects["slide"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j=i.begin,k=i.complete,l={height:"",marginTop:"",marginBottom:"",paddingTop:"",paddingBottom:""},n={};i.display===d&&(i.display="Down"===b?"inline"===t.CSS.Values.getDisplayType(a)?"inline-block":"block":"none"),i.begin=function(){j&&j.call(g,g);for(var c in l){n[c]=a.style[c];var d=t.CSS.getPropertyValue(a,c);l[c]="Down"===b?[d,0]:[0,d]}n.overflow=a.style.overflow,a.style.overflow="hidden"},i.complete=function(){for(var b in n)a.style[b]=n[b];k&&k.call(g,g),h&&h.resolver(g)},t(a,l,i)}}),m.each(["In","Out"],function(a,b){t.Redirects["fade"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j={opacity:"In"===b?1:0},k=i.complete;i.complete=e!==f-1?i.begin=null:function(){k&&k.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display="In"===b?"auto":"none"),t(this,j,i)}}),t}(window.jQuery||window.Zepto||window,window,document)}),!function(a,b,c,d){"use strict";function e(a,b,c){return setTimeout(k(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function h(a,b,c){for(var e=Object.keys(b),f=0;f<e.length;)(!c||c&&a[e[f]]===d)&&(a[e[f]]=b[e[f]]),f++;return a}function i(a,b){return h(a,b,!0)}function j(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&h(d,c)}function k(a,b){return function(){return a.apply(b,arguments)}}function l(a,b){return typeof a==ka?a.apply(b?b[0]||d:d,b):a}function m(a,b){return a===d?b:a}function n(a,b,c){g(r(b),function(b){a.addEventListener(b,c,!1)})}function o(a,b,c){g(r(b),function(b){a.removeEventListener(b,c,!1)})}function p(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function q(a,b){return a.indexOf(b)>-1}function r(a){return a.trim().split(/\s+/g)}function s(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function t(a){return Array.prototype.slice.call(a,0)}function u(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];s(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function v(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g<ia.length;){if(c=ia[g],e=c?c+f:b,e in a)return e;g++}return d}function w(){return oa++}function x(a){var b=a.ownerDocument;return b.defaultView||b.parentWindow}function y(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){l(a.options.enable,[a])&&c.handler(b)},this.init()}function z(a){var b,c=a.options.inputClass;return new(b=c?c:ra?N:sa?Q:qa?S:M)(a,A)}function A(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&ya&&0===d-e,g=b&(Aa|Ba)&&0===d-e;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,B(a,c),a.emit("hammer.input",c),a.recognize(c),a.session.prevInput=c}function B(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=E(b)),e>1&&!c.firstMultiple?c.firstMultiple=E(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=F(d);b.timeStamp=na(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=J(h,i),b.distance=I(h,i),C(c,b),b.offsetDirection=H(b.deltaX,b.deltaY),b.scale=g?L(g.pointers,d):1,b.rotation=g?K(g.pointers,d):0,D(c,b);var j=a.element;p(b.srcEvent.target,j)&&(j=b.srcEvent.target),b.target=j}function C(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};(b.eventType===ya||f.eventType===Aa)&&(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function D(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ba&&(i>xa||h.velocity===d)){var j=h.deltaX-b.deltaX,k=h.deltaY-b.deltaY,l=G(i,j,k);e=l.x,f=l.y,c=ma(l.x)>ma(l.y)?l.x:l.y,g=H(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function E(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:la(a.pointers[c].clientX),clientY:la(a.pointers[c].clientY)},c++;return{timeStamp:na(),pointers:b,center:F(b),deltaX:a.deltaX,deltaY:a.deltaY}}function F(a){var b=a.length;if(1===b)return{x:la(a[0].clientX),y:la(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:la(c/b),y:la(d/b)}}function G(a,b,c){return{x:b/a||0,y:c/a||0}}function H(a,b){return a===b?Ca:ma(a)>=ma(b)?a>0?Da:Ea:b>0?Fa:Ga}function I(a,b,c){c||(c=Ka);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function J(a,b,c){c||(c=Ka);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function K(a,b){return J(b[1],b[0],La)-J(a[1],a[0],La)}function L(a,b){return I(b[0],b[1],La)/I(a[0],a[1],La)}function M(){this.evEl=Na,this.evWin=Oa,this.allow=!0,this.pressed=!1,y.apply(this,arguments)}function N(){this.evEl=Ra,this.evWin=Sa,y.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function O(){this.evTarget=Ua,this.evWin=Va,this.started=!1,y.apply(this,arguments)}function P(a,b){var c=t(a.touches),d=t(a.changedTouches);return b&(Aa|Ba)&&(c=u(c.concat(d),"identifier",!0)),[c,d]}function Q(){this.evTarget=Xa,this.targetIds={},y.apply(this,arguments)}function R(a,b){var c=t(a.touches),d=this.targetIds;if(b&(ya|za)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=t(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return p(a.target,i)}),b===ya)for(e=0;e<f.length;)d[f[e].identifier]=!0,e++;for(e=0;e<g.length;)d[g[e].identifier]&&h.push(g[e]),b&(Aa|Ba)&&delete d[g[e].identifier],e++;return h.length?[u(f.concat(h),"identifier",!0),h]:void 0}function S(){y.apply(this,arguments);var a=k(this.handler,this);this.touch=new Q(this.manager,a),this.mouse=new M(this.manager,a)}function T(a,b){this.manager=a,this.set(b)}function U(a){if(q(a,bb))return bb;var b=q(a,cb),c=q(a,db);return b&&c?cb+" "+db:b||c?b?cb:db:q(a,ab)?ab:_a}function V(a){this.id=w(),this.manager=null,this.options=i(a||{},this.defaults),this.options.enable=m(this.options.enable,!0),this.state=eb,this.simultaneous={},this.requireFail=[]}function W(a){return a&jb?"cancel":a&hb?"end":a&gb?"move":a&fb?"start":""}function X(a){return a==Ga?"down":a==Fa?"up":a==Da?"left":a==Ea?"right":""}function Y(a,b){var c=b.manager;return c?c.get(a):a}function Z(){V.apply(this,arguments)}function $(){Z.apply(this,arguments),this.pX=null,this.pY=null}function _(){Z.apply(this,arguments)}function aa(){V.apply(this,arguments),this._timer=null,this._input=null}function ba(){Z.apply(this,arguments)}function ca(){Z.apply(this,arguments)}function da(){V.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ea(a,b){return b=b||{},b.recognizers=m(b.recognizers,ea.defaults.preset),new fa(a,b)}function fa(a,b){b=b||{},this.options=i(b,ea.defaults),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.element=a,this.input=z(this),this.touchAction=new T(this,this.options.touchAction),ga(this,!0),g(b.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ga(a,b){var c=a.element;g(a.options.cssProps,function(a,d){c.style[v(c.style,d)]=b?a:""})}function ha(a,c){var d=b.createEvent("Event");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var ia=["","webkit","moz","MS","ms","o"],ja=b.createElement("div"),ka="function",la=Math.round,ma=Math.abs,na=Date.now,oa=1,pa=/mobile|tablet|ip(ad|hone|od)|android/i,qa="ontouchstart"in a,ra=v(a,"PointerEvent")!==d,sa=qa&&pa.test(navigator.userAgent),ta="touch",ua="pen",va="mouse",wa="kinect",xa=25,ya=1,za=2,Aa=4,Ba=8,Ca=1,Da=2,Ea=4,Fa=8,Ga=16,Ha=Da|Ea,Ia=Fa|Ga,Ja=Ha|Ia,Ka=["x","y"],La=["clientX","clientY"];y.prototype={handler:function(){},init:function(){this.evEl&&n(this.element,this.evEl,this.domHandler),this.evTarget&&n(this.target,this.evTarget,this.domHandler),this.evWin&&n(x(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&o(this.element,this.evEl,this.domHandler),this.evTarget&&o(this.target,this.evTarget,this.domHandler),this.evWin&&o(x(this.element),this.evWin,this.domHandler)}};var Ma={mousedown:ya,mousemove:za,mouseup:Aa},Na="mousedown",Oa="mousemove mouseup";j(M,y,{handler:function(a){var b=Ma[a.type];b&ya&&0===a.button&&(this.pressed=!0),b&za&&1!==a.which&&(b=Aa),this.pressed&&this.allow&&(b&Aa&&(this.pressed=!1),this.callback(this.manager,b,{pointers:[a],changedPointers:[a],pointerType:va,srcEvent:a}))}});var Pa={pointerdown:ya,pointermove:za,pointerup:Aa,pointercancel:Ba,pointerout:Ba},Qa={2:ta,3:ua,4:va,5:wa},Ra="pointerdown",Sa="pointermove pointerup pointercancel";a.MSPointerEvent&&(Ra="MSPointerDown",Sa="MSPointerMove MSPointerUp MSPointerCancel"),j(N,y,{handler:function(a){var b=this.store,c=!1,d=a.type.toLowerCase().replace("ms",""),e=Pa[d],f=Qa[a.pointerType]||a.pointerType,g=f==ta,h=s(b,a.pointerId,"pointerId");e&ya&&(0===a.button||g)?0>h&&(b.push(a),h=b.length-1):e&(Aa|Ba)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Ta={touchstart:ya,touchmove:za,touchend:Aa,touchcancel:Ba},Ua="touchstart",Va="touchstart touchmove touchend touchcancel";j(O,y,{handler:function(a){var b=Ta[a.type];if(b===ya&&(this.started=!0),this.started){var c=P.call(this,a,b);b&(Aa|Ba)&&0===c[0].length-c[1].length&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:ta,srcEvent:a})}}});var Wa={touchstart:ya,touchmove:za,touchend:Aa,touchcancel:Ba},Xa="touchstart touchmove touchend touchcancel";j(Q,y,{handler:function(a){var b=Wa[a.type],c=R.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:ta,srcEvent:a})}}),j(S,y,{handler:function(a,b,c){var d=c.pointerType==ta,e=c.pointerType==va;if(d)this.mouse.allow=!1;else if(e&&!this.mouse.allow)return;b&(Aa|Ba)&&(this.mouse.allow=!0),this.callback(a,b,c)},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Ya=v(ja.style,"touchAction"),Za=Ya!==d,$a="compute",_a="auto",ab="manipulation",bb="none",cb="pan-x",db="pan-y";T.prototype={set:function(a){a==$a&&(a=this.compute()),Za&&(this.manager.element.style[Ya]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){l(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),U(a.join(" "))},preventDefaults:function(a){if(!Za){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=q(d,bb),f=q(d,db),g=q(d,cb);return e||f&&c&Ha||g&&c&Ia?this.preventSrc(b):void 0}},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var eb=1,fb=2,gb=4,hb=8,ib=hb,jb=16,kb=32;V.prototype={defaults:{},set:function(a){return h(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,"recognizeWith",this))return this;var b=this.simultaneous;return a=Y(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,"dropRecognizeWith",this)?this:(a=Y(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,"requireFailure",this))return this;var b=this.requireFail;return a=Y(a,this),-1===s(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,"dropRequireFailure",this))return this;a=Y(a,this);var b=s(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(c.options.event+(b?W(d):""),a)}var c=this,d=this.state;hb>d&&b(!0),b(),d>=hb&&b(!0)},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=kb)},canEmit:function(){for(var a=0;a<this.requireFail.length;){if(!(this.requireFail[a].state&(kb|eb)))return!1;a++}return!0},recognize:function(a){var b=h({},a);return l(this.options.enable,[this,b])?(this.state&(ib|jb|kb)&&(this.state=eb),this.state=this.process(b),void(this.state&(fb|gb|hb|jb)&&this.tryEmit(b))):(this.reset(),void(this.state=kb))},process:function(){},getTouchAction:function(){},reset:function(){}},j(Z,V,{defaults:{pointers:1},attrTest:function(a){var b=this.options.pointers;return 0===b||a.pointers.length===b},process:function(a){var b=this.state,c=a.eventType,d=b&(fb|gb),e=this.attrTest(a);return d&&(c&Ba||!e)?b|jb:d||e?c&Aa?b|hb:b&fb?b|gb:fb:kb}}),j($,Z,{defaults:{event:"pan",threshold:10,pointers:1,direction:Ja},getTouchAction:function(){var a=this.options.direction,b=[];return a&Ha&&b.push(db),a&Ia&&b.push(cb),b},directionTest:function(a){var b=this.options,c=!0,d=a.distance,e=a.direction,f=a.deltaX,g=a.deltaY;return e&b.direction||(b.direction&Ha?(e=0===f?Ca:0>f?Da:Ea,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ca:0>g?Fa:Ga,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return Z.prototype.attrTest.call(this,a)&&(this.state&fb||!(this.state&fb)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=X(a.direction);b&&this.manager.emit(this.options.event+b,a),this._super.emit.call(this,a)}}),j(_,Z,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[bb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&fb)},emit:function(a){if(this._super.emit.call(this,a),1!==a.scale){var b=a.scale<1?"in":"out";this.manager.emit(this.options.event+b,a)}}}),j(aa,V,{defaults:{event:"press",pointers:1,time:500,threshold:5},getTouchAction:function(){return[_a]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime>b.time;if(this._input=a,!d||!c||a.eventType&(Aa|Ba)&&!f)this.reset();else if(a.eventType&ya)this.reset(),this._timer=e(function(){this.state=ib,this.tryEmit()},b.time,this);else if(a.eventType&Aa)return ib;return kb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===ib&&(a&&a.eventType&Aa?this.manager.emit(this.options.event+"up",a):(this._input.timeStamp=na(),this.manager.emit(this.options.event,this._input)))}}),j(ba,Z,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[bb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&fb)}}),j(ca,Z,{defaults:{event:"swipe",threshold:10,velocity:.65,direction:Ha|Ia,pointers:1},getTouchAction:function(){return $.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Ha|Ia)?b=a.velocity:c&Ha?b=a.velocityX:c&Ia&&(b=a.velocityY),this._super.attrTest.call(this,a)&&c&a.direction&&a.distance>this.options.threshold&&ma(b)>this.options.velocity&&a.eventType&Aa},emit:function(a){var b=X(a.direction);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),j(da,V,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[ab]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance<b.threshold,f=a.deltaTime<b.time;if(this.reset(),a.eventType&ya&&0===this.count)return this.failTimeout();if(d&&f&&c){if(a.eventType!=Aa)return this.failTimeout();var g=this.pTime?a.timeStamp-this.pTime<b.interval:!0,h=!this.pCenter||I(this.pCenter,a.center)<b.posThreshold;this.pTime=a.timeStamp,this.pCenter=a.center,h&&g?this.count+=1:this.count=1,this._input=a;var i=this.count%b.taps;if(0===i)return this.hasRequireFailures()?(this._timer=e(function(){this.state=ib,this.tryEmit()},b.interval,this),fb):ib}return kb},failTimeout:function(){return this._timer=e(function(){this.state=kb},this.options.interval,this),kb},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==ib&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),ea.VERSION="2.0.4",ea.defaults={domEvents:!1,touchAction:$a,enable:!0,inputTarget:null,inputClass:null,preset:[[ba,{enable:!1}],[_,{enable:!1},["rotate"]],[ca,{direction:Ha}],[$,{direction:Ha},["swipe"]],[da],[da,{event:"doubletap",taps:2},["tap"]],[aa]],cssProps:{userSelect:"default",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};var lb=1,mb=2;fa.prototype={set:function(a){return h(this.options,a),a.touchAction&&this.touchAction.update(),a.inputTarget&&(this.input.destroy(),this.input.target=a.inputTarget,this.input.init()),this},stop:function(a){this.session.stopped=a?mb:lb},recognize:function(a){var b=this.session;if(!b.stopped){this.touchAction.preventDefaults(a);var c,d=this.recognizers,e=b.curRecognizer;(!e||e&&e.state&ib)&&(e=b.curRecognizer=null);for(var f=0;f<d.length;)c=d[f],b.stopped===mb||e&&c!=e&&!c.canRecognizeWith(e)?c.reset():c.recognize(a),!e&&c.state&(fb|gb|hb)&&(e=b.curRecognizer=c),f++}},get:function(a){if(a instanceof V)return a;for(var b=this.recognizers,c=0;c<b.length;c++)if(b[c].options.event==a)return b[c];return null},add:function(a){if(f(a,"add",this))return this;var b=this.get(a.options.event);return b&&this.remove(b),this.recognizers.push(a),a.manager=this,this.touchAction.update(),a},remove:function(a){if(f(a,"remove",this))return this;var b=this.recognizers;return a=this.get(a),b.splice(s(b,a),1),this.touchAction.update(),this},on:function(a,b){var c=this.handlers;return g(r(a),function(a){c[a]=c[a]||[],c[a].push(b)}),this},off:function(a,b){var c=this.handlers;return g(r(a),function(a){b?c[a].splice(s(c[a],b),1):delete c[a]}),this},emit:function(a,b){this.options.domEvents&&ha(a,b);var c=this.handlers[a]&&this.handlers[a].slice();if(c&&c.length){b.type=a,b.preventDefault=function(){b.srcEvent.preventDefault()};for(var d=0;d<c.length;)c[d](b),d++}},destroy:function(){this.element&&ga(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},h(ea,{INPUT_START:ya,INPUT_MOVE:za,INPUT_END:Aa,INPUT_CANCEL:Ba,STATE_POSSIBLE:eb,STATE_BEGAN:fb,STATE_CHANGED:gb,STATE_ENDED:hb,STATE_RECOGNIZED:ib,STATE_CANCELLED:jb,STATE_FAILED:kb,DIRECTION_NONE:Ca,DIRECTION_LEFT:Da,DIRECTION_RIGHT:Ea,DIRECTION_UP:Fa,DIRECTION_DOWN:Ga,DIRECTION_HORIZONTAL:Ha,DIRECTION_VERTICAL:Ia,DIRECTION_ALL:Ja,Manager:fa,Input:y,TouchAction:T,TouchInput:Q,MouseInput:M,PointerEventInput:N,TouchMouseInput:S,SingleTouchInput:O,Recognizer:V,AttrRecognizer:Z,Tap:da,Pan:$,Swipe:ca,Pinch:_,Rotate:ba,Press:aa,on:n,off:o,each:g,merge:i,extend:h,inherit:j,bindFn:k,prefixed:v}),typeof define==ka&&define.amd?define(function(){return ea}):"undefined"!=typeof module&&module.exports?module.exports=ea:a[c]=ea}(window,document,"Hammer"),function(a){"function"==typeof define&&define.amd?define(["jquery","hammerjs"],a):"object"==typeof exports?a(require("jquery"),require("hammerjs")):a(jQuery,Hammer)}(function(a,b){function c(c,d){var e=a(c);e.data("hammer")||e.data("hammer",new b(e[0],d))}a.fn.hammer=function(a){return this.each(function(){c(this,a)})},b.Manager.prototype.emit=function(b){return function(c,d){b.call(this,c,d),a(this.element).trigger({type:c,gesture:d})}}(b.Manager.prototype.emit)}),Materialize={},Materialize.guid=function(){function a(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return function(){return a()+a()+"-"+a()+"-"+a()+"-"+a()+"-"+a()+a()+a()}}(),Materialize.elementOrParentIsFixed=function(a){var b=$(a),c=b.add(b.parents()),d=!1;return c.each(function(){return"fixed"===$(this).css("position")?(d=!0,!1):void 0}),d};var Vel;Vel=$?$.Velocity:Velocity,function(a){a.fn.collapsible=function(b){var c={accordion:void 0};return b=a.extend(c,b),this.each(function(){function c(b){h=g.find("> li > .collapsible-header"),b.hasClass("active")?b.parent().addClass("active"):b.parent().removeClass("active"),b.parent().hasClass("active")?b.siblings(".collapsible-body").stop(!0,!1).slideDown({duration:350,easing:"easeOutQuart",queue:!1,complete:function(){a(this).css("height","")}}):b.siblings(".collapsible-body").stop(!0,!1).slideUp({duration:350,easing:"easeOutQuart",queue:!1,complete:function(){a(this).css("height","")}}),h.not(b).removeClass("active").parent().removeClass("active"),h.not(b).parent().children(".collapsible-body").stop(!0,!1).slideUp({duration:350,easing:"easeOutQuart",queue:!1,complete:function(){a(this).css("height","")}})}function d(b){b.hasClass("active")?b.parent().addClass("active"):b.parent().removeClass("active"),b.parent().hasClass("active")?b.siblings(".collapsible-body").stop(!0,!1).slideDown({duration:350,easing:"easeOutQuart",queue:!1,complete:function(){a(this).css("height","")}}):b.siblings(".collapsible-body").stop(!0,!1).slideUp({duration:350,easing:"easeOutQuart",queue:!1,complete:function(){a(this).css("height","")}})}function e(a){var b=f(a);return b.length>0}function f(a){return a.closest("li > .collapsible-header")}var g=a(this),h=a(this).find("> li > .collapsible-header"),i=g.data("collapsible");g.off("click.collapse",".collapsible-header"),h.off("click.collapse"),b.accordion||"accordion"==i||void 0==i?(h=g.find("> li > .collapsible-header"),h.on("click.collapse",function(b){var d=a(b.target);e(d)&&(d=f(d)),d.toggleClass("active"),c(d)}),c(h.filter(".active").first())):h.each(function(){a(this).on("click.collapse",function(b){var c=a(b.target);e(c)&&(c=f(c)),c.toggleClass("active"),d(c)}),a(this).hasClass("active")&&d(a(this))})})},a(document).ready(function(){a(".collapsible").collapsible()})}(jQuery),function(a){a.fn.scrollTo=function(b){return a(this).scrollTop(a(this).scrollTop()-a(this).offset().top+a(b).offset().top),this},a.fn.dropdown=function(b){var c={inDuration:300,outDuration:225,constrain_width:!0,hover:!1,gutter:0,belowOrigin:!1};this.each(function(){function d(){void 0!=g.data("induration")&&(h.inDuration=g.data("inDuration")),void 0!=g.data("outduration")&&(h.outDuration=g.data("outDuration")),void 0!=g.data("constrainwidth")&&(h.constrain_width=g.data("constrainwidth")),void 0!=g.data("hover")&&(h.hover=g.data("hover")),void 0!=g.data("gutter")&&(h.gutter=g.data("gutter")),void 0!=g.data("beloworigin")&&(h.belowOrigin=g.data("beloworigin"))}function e(){d(),i.addClass("active"),1==h.constrain_width&&i.css("width",g.outerWidth());var b=0;1==h.belowOrigin&&(b=g.height());var c=g.offset().left,e=0,f=h.gutter;c+i.innerWidth()>a(window).width()&&(e=g.innerWidth()-i.innerWidth(),f=-1*f),i.css({position:"absolute",top:g.position().top+b,left:g.position().left+e+f}),i.stop(!0,!0).css("opacity",0).slideDown({queue:!1,duration:h.inDuration,easing:"easeOutCubic",complete:function(){a(this).css("height","")}}).animate({opacity:1},{queue:!1,duration:h.inDuration,easing:"easeOutSine"})}function f(){i.fadeOut(h.outDuration),i.removeClass("active")}var g=a(this),h=a.extend({},c,b),i=a("#"+g.attr("data-activates"));if(d(),g.after(i),h.hover){var j=!1;g.unbind("click."+g.attr("id")),g.on("mouseenter",function(){j===!1&&(e(),j=!0)}),g.on("mouseleave",function(b){a(b.toElement).closest(".dropdown-content").is(i)||(i.stop(!0,!0),f(),j=!1)}),i.on("mouseleave",function(b){a(b.toElement).closest(".dropdown-button").is(g)||(i.stop(!0,!0),f(),j=!1)})}else g.unbind("click."+g.attr("id")),g.bind("click."+g.attr("id"),function(b){g[0]==b.currentTarget&&0===a(b.target).closest(".dropdown-content").length?(b.preventDefault(),e()):g.hasClass("active")&&(f(),a(document).unbind("click."+i.attr("id"))),i.hasClass("active")&&a(document).bind("click."+i.attr("id"),function(b){!i.is(b.target)&&!g.is(b.target)&&!g.find(b.target).length>0&&(f(),a(document).unbind("click."+i.attr("id")))})});g.on("open",e),g.on("close",f)})},a(document).ready(function(){a(".dropdown-button").dropdown()})}(jQuery),function(a){a.fn.extend({openModal:function(b){var c=this,d=a('<div id="lean-overlay"></div>');a("body").append(d);var e={opacity:.5,in_duration:350,out_duration:250,ready:void 0,complete:void 0,dismissible:!0};b=a.extend(e,b),b.dismissible&&(a("#lean-overlay").click(function(){a(c).closeModal(b)}),a(document).on("keyup.leanModal",function(d){27===d.keyCode&&a(c).closeModal(b)})),a(c).find(".modal-close").click(function(){a(c).closeModal(b)}),a("#lean-overlay").css({display:"block",opacity:0}),a(c).css({display:"block",opacity:0}),a("#lean-overlay").velocity({opacity:b.opacity},{duration:b.in_duration,queue:!1,ease:"easeOutCubic"}),a(c).hasClass("bottom-sheet")?a(c).velocity({bottom:"0",opacity:1},{duration:b.in_duration,queue:!1,ease:"easeOutCubic",complete:function(){"function"==typeof b.ready&&b.ready()}}):(a(c).css({top:"4%"}),a(c).velocity({top:"10%",opacity:1},{duration:b.in_duration,queue:!1,ease:"easeOutCubic",complete:function(){"function"==typeof b.ready&&b.ready()}}))}}),a.fn.extend({closeModal:function(b){var c={out_duration:250,complete:void 0},b=a.extend(c,b);a(".modal-close").off(),a(document).off("keyup.leanModal"),a("#lean-overlay").velocity({opacity:0},{duration:b.out_duration,queue:!1,ease:"easeOutQuart"}),a(this).hasClass("bottom-sheet")?a(this).velocity({bottom:"-100%",opacity:0},{duration:b.out_duration,queue:!1,ease:"easeOutCubic",complete:function(){a("#lean-overlay").css({display:"none"}),"function"==typeof b.complete&&b.complete(),a("#lean-overlay").remove()}}):a(this).fadeOut(b.out_duration,function(){a(this).css({top:0}),a("#lean-overlay").css({display:"none"}),"function"==typeof b.complete&&b.complete(),a("#lean-overlay").remove()})}}),a.fn.extend({leanModal:function(b){return this.each(function(){a(this).click(function(c){var d=a(this).attr("href")||"#"+a(this).data("target");a(d).openModal(b),c.preventDefault()})})}})}(jQuery),function(a){a.fn.materialbox=function(){return this.each(function(){function b(){d=!1;var b=g.parent(".material-placeholder"),e=(window.innerWidth,window.innerHeight,g.data("width")),h=g.data("height");g.velocity("stop",!0),a("#materialbox-overlay").velocity("stop",!0),a(".materialbox-caption").velocity("stop",!0),a("#materialbox-overlay").velocity({opacity:0},{duration:f,queue:!1,easing:"easeOutQuad",complete:function(){c=!1,a(this).remove()}}),g.velocity({width:e,height:h,left:0,top:0},{duration:f,queue:!1,easing:"easeOutQuad"}),a(".materialbox-caption").velocity({opacity:0},{duration:f,queue:!1,easing:"easeOutQuad",complete:function(){b.css({height:"",width:"",position:"",top:"",left:""}),g.css({height:"",top:"",left:"",width:"","max-width":"",position:"","z-index":""}),g.removeClass("active"),d=!0,a(this).remove()}})}if(!a(this).hasClass("intialized")){a(this).addClass("intialized"); - -var c=!1,d=!0,e=275,f=200,g=a(this),h=a("<div></div>").addClass("material-placeholder");g.wrap(h),g.on("click",function(){var f=g.parent(".material-placeholder"),h=window.innerWidth,i=window.innerHeight,j=g.width(),k=g.height();if(d===!1)return b(),!1;if(c&&d===!0)return b(),!1;d=!1,g.addClass("active"),c=!0,f.css({width:f[0].getBoundingClientRect().width,height:f[0].getBoundingClientRect().height,position:"relative",top:0,left:0}),g.css({position:"absolute","z-index":1e3}).data("width",j).data("height",k);var l=a('<div id="materialbox-overlay"></div>').css({opacity:0}).click(function(){d===!0&&b()});if(a("body").append(l),l.velocity({opacity:1},{duration:e,queue:!1,easing:"easeOutQuad"}),""!==g.data("caption")){var m=a('<div class="materialbox-caption"></div>');m.text(g.data("caption")),a("body").append(m),m.css({display:"inline"}),m.velocity({opacity:1},{duration:e,queue:!1,easing:"easeOutQuad"})}var n=0,o=j/h,p=k/i,q=0,r=0;o>p?(n=k/j,q=.9*h,r=.9*h*n):(n=j/k,q=.9*i*n,r=.9*i),g.hasClass("responsive-img")?g.velocity({"max-width":q,width:j},{duration:0,queue:!1,complete:function(){g.css({left:0,top:0}).velocity({height:r,width:q,left:a(document).scrollLeft()+h/2-g.parent(".material-placeholder").offset().left-q/2,top:a(document).scrollTop()+i/2-g.parent(".material-placeholder").offset().top-r/2},{duration:e,queue:!1,easing:"easeOutQuad",complete:function(){d=!0}})}}):g.css("left",0).css("top",0).velocity({height:r,width:q,left:a(document).scrollLeft()+h/2-g.parent(".material-placeholder").offset().left-q/2,top:a(document).scrollTop()+i/2-g.parent(".material-placeholder").offset().top-r/2},{duration:e,queue:!1,easing:"easeOutQuad",complete:function(){d=!0}})}),a(window).scroll(function(){c&&b()}),a(document).keyup(function(a){27===a.keyCode&&d===!0&&c&&b()})}})},a(document).ready(function(){a(".materialboxed").materialbox()})}(jQuery),function(a){a.fn.parallax=function(){var b=a(window).width();return this.each(function(){function c(c){var e;e=601>b?d.height()>0?d.height():d.children("img").height():d.height()>0?d.height():500;var f=d.children("img").first(),g=f.height(),h=g-e,i=d.offset().top+e,j=d.offset().top,k=a(window).scrollTop(),l=window.innerHeight,m=k+l,n=(m-j)/(e+l),o=Math.round(h*n);c&&f.css("display","block"),i>k&&k+l>j&&f.css("transform","translate3D(-50%,"+o+"px, 0)")}var d=a(this);d.addClass("parallax"),d.children("img").one("load",function(){c(!0)}).each(function(){this.complete&&a(this).load()}),a(window).scroll(function(){b=a(window).width(),c(!1)}),a(window).resize(function(){b=a(window).width(),c(!1)})})}}(jQuery),function(a){var b={init:function(){return this.each(function(){{var b=a(this);a(window).width()}b.width("100%");var c=a(this).children("li").length;b.children("li").each(function(){a(this).width(100/c+"%")});var d,e,f=b.find("li.tab a"),g=b.width(),h=b.find("li").first().outerWidth(),i=0;d=a(f.filter('[href="'+location.hash+'"]')),0===d.length&&(d=a(this).find("li.tab a.active").first()),0===d.length&&(d=a(this).find("li.tab a").first()),d.addClass("active"),i=f.index(d),0>i&&(i=0),e=a(d[0].hash),b.append('<div class="indicator"></div>');var j=b.find(".indicator");b.is(":visible")&&(j.css({right:g-(i+1)*h}),j.css({left:i*h})),a(window).resize(function(){g=b.width(),h=b.find("li").first().outerWidth(),0>i&&(i=0),0!==h&&0!==g&&(j.css({right:g-(i+1)*h}),j.css({left:i*h}))}),f.not(d).each(function(){a(this.hash).hide()}),b.on("click","a",function(c){g=b.width(),h=b.find("li").first().outerWidth(),d.removeClass("active"),e.hide(),d=a(this),e=a(this.hash),f=b.find("li.tab a"),d.addClass("active");var k=i;i=f.index(a(this)),0>i&&(i=0),e.show(),i-k>=0?(j.velocity({right:g-(i+1)*h},{duration:300,queue:!1,easing:"easeOutQuad"}),j.velocity({left:i*h},{duration:300,queue:!1,easing:"easeOutQuad",delay:90})):(j.velocity({left:i*h},{duration:300,queue:!1,easing:"easeOutQuad"}),j.velocity({right:g-(i+1)*h},{duration:300,queue:!1,easing:"easeOutQuad",delay:90})),c.preventDefault()})})},select_tab:function(a){this.find('a[href="#'+a+'"]').trigger("click")}};a.fn.tabs=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?void a.error("Method "+c+" does not exist on jQuery.tooltip"):b.init.apply(this,arguments)},a(document).ready(function(){a("ul.tabs").tabs()})}(jQuery),function(a){a.fn.tooltip=function(b){var c=null,d=!1,e=null,f=5,g={delay:350};return b=a.extend(g,b),a(".material-tooltip").remove(),this.each(function(){var g=a(this),h=a("<span></span>").text(g.attr("data-tooltip")),i=a("<div></div>");i.addClass("material-tooltip").append(h),i.appendTo(a("body"));var j=a("<div></div>").addClass("backdrop");j.appendTo(i),j.css({top:0,left:0}),a(this).off("mouseenter mouseleave"),a(this).on({mouseenter:function(){var a=g.data("delay");a=void 0==a||""==a?b.delay:a,c=0,e=setInterval(function(){if(c+=10,c>=a&&0==d){d=!0,i.css({display:"block",left:"0px",top:"0px"}),i.children("span").text(g.attr("data-tooltip"));var b=g.outerWidth(),e=g.outerHeight(),h=g.attr("data-position"),k=i.outerHeight(),l=i.outerWidth(),m="0px",n="0px",o=8;"top"===h?(i.css({top:g.offset().top-k-f,left:g.offset().left+b/2-l/2}),m="-10px",j.css({borderRadius:"14px 14px 0 0",transformOrigin:"50% 90%",marginTop:k,marginLeft:l/2-j.width()/2})):"left"===h?(i.css({top:g.offset().top+e/2-k/2,left:g.offset().left-l-f}),n="-10px",j.css({width:"14px",height:"14px",borderRadius:"14px 0 0 14px",transformOrigin:"95% 50%",marginTop:k/2,marginLeft:l})):"right"===h?(i.css({top:g.offset().top+e/2-k/2,left:g.offset().left+b+f}),n="+10px",j.css({width:"14px",height:"14px",borderRadius:"0 14px 14px 0",transformOrigin:"5% 50%",marginTop:k/2,marginLeft:"0px"})):(i.css({top:g.offset().top+g.outerHeight()+f,left:g.offset().left+b/2-l/2}),m="+10px",j.css({marginLeft:l/2-j.width()/2})),o=l/8,8>o&&(o=8),("right"===h||"left"===h)&&(o=l/10,6>o&&(o=6)),i.velocity({opacity:1,marginTop:m,marginLeft:n},{duration:350,queue:!1}),j.css({display:"block"}).velocity({opacity:1},{duration:55,delay:0,queue:!1}).velocity({scale:o},{duration:300,delay:0,queue:!1,easing:"easeInOutQuad"})}},10)},mouseleave:function(){clearInterval(e),c=0,i.velocity({opacity:0,marginTop:0,marginLeft:0},{duration:225,queue:!1,delay:275}),j.velocity({opacity:0,scale:1},{duration:225,delay:275,queue:!1,complete:function(){j.css("display","none"),i.css("display","none"),d=!1}})}})})},a(document).ready(function(){a(".tooltipped").tooltip()})}(jQuery),function(a){"use strict";function b(a){return null!==a&&a===a.window}function c(a){return b(a)?a:9===a.nodeType&&a.defaultView}function d(a){var b,d,e={top:0,left:0},f=a&&a.ownerDocument;return b=f.documentElement,"undefined"!=typeof a.getBoundingClientRect&&(e=a.getBoundingClientRect()),d=c(f),{top:e.top+d.pageYOffset-b.clientTop,left:e.left+d.pageXOffset-b.clientLeft}}function e(a){var b="";for(var c in a)a.hasOwnProperty(c)&&(b+=c+":"+a[c]+";");return b}function f(a){if(k.allowEvent(a)===!1)return null;for(var b=null,c=a.target||a.srcElement;null!==c.parentElement;){if(!(c instanceof SVGElement||-1===c.className.indexOf("waves-effect"))){b=c;break}if(c.classList.contains("waves-effect")){b=c;break}c=c.parentElement}return b}function g(b){var c=f(b);null!==c&&(j.show(b,c),"ontouchstart"in a&&(c.addEventListener("touchend",j.hide,!1),c.addEventListener("touchcancel",j.hide,!1)),c.addEventListener("mouseup",j.hide,!1),c.addEventListener("mouseleave",j.hide,!1))}var h=h||{},i=document.querySelectorAll.bind(document),j={duration:750,show:function(a,b){if(2===a.button)return!1;var c=b||this,f=document.createElement("div");f.className="waves-ripple",c.appendChild(f);var g=d(c),h=a.pageY-g.top,i=a.pageX-g.left,k="scale("+c.clientWidth/100*10+")";"touches"in a&&(h=a.touches[0].pageY-g.top,i=a.touches[0].pageX-g.left),f.setAttribute("data-hold",Date.now()),f.setAttribute("data-scale",k),f.setAttribute("data-x",i),f.setAttribute("data-y",h);var l={top:h+"px",left:i+"px"};f.className=f.className+" waves-notransition",f.setAttribute("style",e(l)),f.className=f.className.replace("waves-notransition",""),l["-webkit-transform"]=k,l["-moz-transform"]=k,l["-ms-transform"]=k,l["-o-transform"]=k,l.transform=k,l.opacity="1",l["-webkit-transition-duration"]=j.duration+"ms",l["-moz-transition-duration"]=j.duration+"ms",l["-o-transition-duration"]=j.duration+"ms",l["transition-duration"]=j.duration+"ms",l["-webkit-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",l["-moz-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",l["-o-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",l["transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f.setAttribute("style",e(l))},hide:function(a){k.touchup(a);var b=this,c=(1.4*b.clientWidth,null),d=b.getElementsByClassName("waves-ripple");if(!(d.length>0))return!1;c=d[d.length-1];var f=c.getAttribute("data-x"),g=c.getAttribute("data-y"),h=c.getAttribute("data-scale"),i=Date.now()-Number(c.getAttribute("data-hold")),l=350-i;0>l&&(l=0),setTimeout(function(){var a={top:g+"px",left:f+"px",opacity:"0","-webkit-transition-duration":j.duration+"ms","-moz-transition-duration":j.duration+"ms","-o-transition-duration":j.duration+"ms","transition-duration":j.duration+"ms","-webkit-transform":h,"-moz-transform":h,"-ms-transform":h,"-o-transform":h,transform:h};c.setAttribute("style",e(a)),setTimeout(function(){try{b.removeChild(c)}catch(a){return!1}},j.duration)},l)},wrapInput:function(a){for(var b=0;b<a.length;b++){var c=a[b];if("input"===c.tagName.toLowerCase()){var d=c.parentNode;if("i"===d.tagName.toLowerCase()&&-1!==d.className.indexOf("waves-effect"))continue;var e=document.createElement("i");e.className=c.className+" waves-input-wrapper";var f=c.getAttribute("style");f||(f=""),e.setAttribute("style",f),c.className="waves-button-input",c.removeAttribute("style"),d.replaceChild(e,c),e.appendChild(c)}}}},k={touches:0,allowEvent:function(a){var b=!0;return"touchstart"===a.type?k.touches+=1:"touchend"===a.type||"touchcancel"===a.type?setTimeout(function(){k.touches>0&&(k.touches-=1)},500):"mousedown"===a.type&&k.touches>0&&(b=!1),b},touchup:function(a){k.allowEvent(a)}};h.displayEffect=function(b){b=b||{},"duration"in b&&(j.duration=b.duration),j.wrapInput(i(".waves-effect")),"ontouchstart"in a&&document.body.addEventListener("touchstart",g,!1),document.body.addEventListener("mousedown",g,!1)},h.attach=function(b){"input"===b.tagName.toLowerCase()&&(j.wrapInput([b]),b=b.parentElement),"ontouchstart"in a&&b.addEventListener("touchstart",g,!1),b.addEventListener("mousedown",g,!1)},a.Waves=h,document.addEventListener("DOMContentLoaded",function(){h.displayEffect()},!1)}(window),Materialize.toast=function(a,b,c,d){function e(a){var b=document.createElement("div");if(b.classList.add("toast"),c)for(var e=c.split(" "),f=0,g=e.length;g>f;f++)b.classList.add(e[f]);b.innerHTML=a;var h=new Hammer(b,{prevent_default:!1});return h.on("pan",function(a){var c=a.deltaX,d=80;b.classList.contains("panning")||b.classList.add("panning");var e=1-Math.abs(c/d);0>e&&(e=0),Vel(b,{left:c,opacity:e},{duration:50,queue:!1,easing:"easeOutQuad"})}),h.on("panend",function(a){var c=a.deltaX,e=80;Math.abs(c)>e?Vel(b,{marginTop:"-40px"},{duration:375,easing:"easeOutExpo",queue:!1,complete:function(){"function"==typeof d&&d(),b.parentNode.removeChild(b)}}):(b.classList.remove("panning"),Vel(b,{left:0,opacity:1},{duration:300,easing:"easeOutExpo",queue:!1}))}),b}c=c||"";var f=document.getElementById("toast-container");if(null===f){var f=document.createElement("div");f.id="toast-container",document.body.appendChild(f)}var g=e(a);f.appendChild(g),g.style.top="35px",g.style.opacity=0,Vel(g,{top:"0px",opacity:1},{duration:300,easing:"easeOutCubic",queue:!1});var h=b,i=setInterval(function(){null===g.parentNode&&window.clearInterval(i),g.classList.contains("panning")||(h-=20),0>=h&&(Vel(g,{opacity:0,marginTop:"-40px"},{duration:375,easing:"easeOutExpo",queue:!1,complete:function(){"function"==typeof d&&d(),this[0].parentNode.removeChild(this[0])}}),window.clearInterval(i))},20)},function(a){var b={init:function(b){var c={menuWidth:240,edge:"left",closeOnClick:!1};b=a.extend(c,b),a(this).each(function(){function c(c){f=!1,g=!1,a("#sidenav-overlay").velocity({opacity:0},{duration:200,queue:!1,easing:"easeOutQuad",complete:function(){a(this).remove()}}),"left"===b.edge?(a(".drag-target").css({width:"",right:"",left:"0"}),e.velocity({left:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:"easeOutCubic",complete:function(){1==c&&(e.removeAttr("style"),e.css("width",b.menuWidth))}})):(a(".drag-target").css({width:"",right:"0",left:""}),e.velocity({right:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:"easeOutCubic",complete:function(){1==c&&(e.removeAttr("style"),e.css("width",b.menuWidth))}}))}var d=a(this),e=a("#"+d.attr("data-activates"));240!=b.menuWidth&&e.css("width",b.menuWidth),a("body").append(a('<div class="drag-target"></div>')),"left"==b.edge?(e.css("left",-1*(b.menuWidth+10)),a(".drag-target").css({left:0})):(e.addClass("right-aligned").css("right",-1*(b.menuWidth+10)).css("left",""),a(".drag-target").css({right:0})),e.hasClass("fixed")&&a(window).width()>992&&e.css("left",0),e.hasClass("fixed")&&a(window).resize(function(){window.innerWidth>992?0!=a("#sidenav-overlay").css("opacity")&&g?c(!0):(e.removeAttr("style"),e.css("width",b.menuWidth)):g===!1&&("left"===b.edge?e.css("left",-1*(b.menuWidth+10)):e.css("right",-1*(b.menuWidth+10)))}),1==b.closeOnClick&&e.on("click.itemclick","a:not(.collapsible-header)",function(){c()});var f=!1,g=!1;a(".drag-target").on("click",function(){c()}),a(".drag-target").hammer({prevent_default:!1}).bind("pan",function(d){if("touch"==d.gesture.pointerType){{var f=(d.gesture.direction,d.gesture.center.x);d.gesture.center.y,d.gesture.velocityX}if(0===a("#sidenav-overlay").length){var h=a('<div id="sidenav-overlay"></div>');h.css("opacity",0).click(function(){c()}),a("body").append(h)}if("left"===b.edge&&(f>b.menuWidth?f=b.menuWidth:0>f&&(f=0)),"left"===b.edge)f<b.menuWidth/2?g=!1:f>=b.menuWidth/2&&(g=!0),e.css("left",f-b.menuWidth);else{f<a(window).width()-b.menuWidth/2?g=!0:f>=a(window).width()-b.menuWidth/2&&(g=!1);var i=-1*(f-b.menuWidth/2);i>0&&(i=0),e.css("right",i)}if("left"===b.edge){var j=f/b.menuWidth;a("#sidenav-overlay").velocity({opacity:j},{duration:50,queue:!1,easing:"easeOutQuad"})}else{var j=Math.abs((f-a(window).width())/b.menuWidth);a("#sidenav-overlay").velocity({opacity:j},{duration:50,queue:!1,easing:"easeOutQuad"})}}}).bind("panend",function(c){if("touch"==c.gesture.pointerType){var d=c.gesture.velocityX;f=!1,"left"===b.edge?g&&.3>=d||-.5>d?(e.velocity({left:0},{duration:300,queue:!1,easing:"easeOutQuad"}),a("#sidenav-overlay").velocity({opacity:1},{duration:50,queue:!1,easing:"easeOutQuad"}),a(".drag-target").css({width:"50%",right:0,left:""})):(!g||d>.3)&&(e.velocity({left:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:"easeOutQuad"}),a("#sidenav-overlay").velocity({opacity:0},{duration:200,queue:!1,easing:"easeOutQuad",complete:function(){a(this).remove()}}),a(".drag-target").css({width:"10px",right:"",left:0})):g&&d>=-.3||d>.5?(e.velocity({right:0},{duration:300,queue:!1,easing:"easeOutQuad"}),a("#sidenav-overlay").velocity({opacity:1},{duration:50,queue:!1,easing:"easeOutQuad"}),a(".drag-target").css({width:"50%",right:"",left:0})):(!g||-.3>d)&&(e.velocity({right:-1*(b.menuWidth+10)},{duration:200,queue:!1,easing:"easeOutQuad"}),a("#sidenav-overlay").velocity({opacity:0},{duration:200,queue:!1,easing:"easeOutQuad",complete:function(){a(this).remove()}}),a(".drag-target").css({width:"10px",right:0,left:""}))}}),d.click(function(){if(1==g)g=!1,f=!1,c();else{"left"===b.edge?(a(".drag-target").css({width:"50%",right:0,left:""}),e.velocity({left:0},{duration:300,queue:!1,easing:"easeOutQuad"})):(a(".drag-target").css({width:"50%",right:"",left:0}),e.velocity({right:0},{duration:300,queue:!1,easing:"easeOutQuad"}),e.css("left",""));var d=a('<div id="sidenav-overlay"></div>');d.css("opacity",0).click(function(){g=!1,f=!1,c(),d.velocity({opacity:0},{duration:300,queue:!1,easing:"easeOutQuad",complete:function(){a(this).remove()}})}),a("body").append(d),d.velocity({opacity:1},{duration:300,queue:!1,easing:"easeOutQuad",complete:function(){g=!0,f=!1}})}return!1})})},show:function(){this.trigger("click")},hide:function(){a("#sidenav-overlay").trigger("click")}};a.fn.sideNav=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?void a.error("Method "+c+" does not exist on jQuery.tooltip"):b.init.apply(this,arguments)}}(jQuery),function(a){function b(b,c,d,e){var f=a();return a.each(g,function(a,g){if(g.height()>0){var h=g.offset().top,i=g.offset().left,j=i+g.width(),k=h+g.height(),l=!(i>c||e>j||h>d||b>k);l&&f.push(g)}}),f}function c(){++j;var c=f.scrollTop(),d=f.scrollLeft(),e=d+f.width(),g=c+f.height(),i=b(c+k.top+200,e+k.right,g+k.bottom,d+k.left);a.each(i,function(a,b){var c=b.data("scrollSpy:ticks");"number"!=typeof c&&b.triggerHandler("scrollSpy:enter"),b.data("scrollSpy:ticks",j)}),a.each(h,function(a,b){var c=b.data("scrollSpy:ticks");"number"==typeof c&&c!==j&&(b.triggerHandler("scrollSpy:exit"),b.data("scrollSpy:ticks",null))}),h=i}function d(){f.trigger("scrollSpy:winSize")}function e(a,b,c){var d,e,f,g=null,h=0;c||(c={});var i=function(){h=c.leading===!1?0:l(),g=null,f=a.apply(d,e),d=e=null};return function(){var j=l();h||c.leading!==!1||(h=j);var k=b-(j-h);return d=this,e=arguments,0>=k?(clearTimeout(g),g=null,h=j,f=a.apply(d,e),d=e=null):g||c.trailing===!1||(g=setTimeout(i,k)),f}}var f=a(window),g=[],h=[],i=!1,j=0,k={top:0,right:0,bottom:0,left:0},l=Date.now||function(){return(new Date).getTime()};a.scrollSpy=function(b,d){var h=[];b=a(b),b.each(function(b,c){g.push(a(c)),a(c).data("scrollSpy:id",b),a("a[href=#"+a(c).attr("id")+"]").click(function(b){b.preventDefault();var c=a(this.hash).offset().top+1;a("html, body").animate({scrollTop:c-200},{duration:400,queue:!1,easing:"easeOutCubic"})})}),d=d||{throttle:100},k.top=d.offsetTop||0,k.right=d.offsetRight||0,k.bottom=d.offsetBottom||0,k.left=d.offsetLeft||0;var j=e(c,d.throttle||100),l=function(){a(document).ready(j)};return i||(f.on("scroll",l),f.on("resize",l),i=!0),setTimeout(l,0),b.on("scrollSpy:enter",function(){h=a.grep(h,function(a){return 0!=a.height()});var b=a(this);h[0]?(a("a[href=#"+h[0].attr("id")+"]").removeClass("active"),b.data("scrollSpy:id")<h[0].data("scrollSpy:id")?h.unshift(a(this)):h.push(a(this))):h.push(a(this)),a("a[href=#"+h[0].attr("id")+"]").addClass("active")}),b.on("scrollSpy:exit",function(){if(h=a.grep(h,function(a){return 0!=a.height()}),h[0]){a("a[href=#"+h[0].attr("id")+"]").removeClass("active");var b=a(this);h=a.grep(h,function(a){return a.attr("id")!=b.attr("id")}),h[0]&&a("a[href=#"+h[0].attr("id")+"]").addClass("active")}}),b},a.winSizeSpy=function(b){return a.winSizeSpy=function(){return f},b=b||{throttle:100},f.on("resize",e(d,b.throttle||100))},a.fn.scrollSpy=function(b){return a.scrollSpy(a(this),b)}}(jQuery),function(a){a(document).ready(function(){function b(b){d.text(b.val()+"\n");var c=d.html().replace(/\n/g,"<br>");d.html(c),b.is(":visible")?d.css("width",b.width()):d.css("width",a(window).width()/2),b.css("height",d.height())}Materialize.updateTextFields=function(){var b="input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea";a(b).each(function(b,c){a(c).val().length>0||void 0!==a(this).attr("placeholder")?a(this).siblings("label, i").addClass("active"):a(this).siblings("label, i").removeClass("active")})};var c="input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], textarea";a("input[autofocus]").siblings("label, i").addClass("active"),a(document).on("change",c,function(){(0!==a(this).val().length||void 0!==a(this).attr("placeholder"))&&a(this).siblings("label, i").addClass("active"),validate_field(a(this))}),a(document).ready(function(){Materialize.updateTextFields()}),a(document).on("reset",function(b){a(b.target).is("form")&&(a(this).find(c).removeClass("valid").removeClass("invalid"),a(this).find(c).siblings("label, i").removeClass("active"),a(this).find("select.initialized").each(function(){var b=a(this).find("option[selected]").text();a(this).siblings("input.select-dropdown").val(b)}))}),a(document).on("focus",c,function(){a(this).siblings("label, i").addClass("active")}),a(document).on("blur",c,function(){0===a(this).val().length&&void 0===a(this).attr("placeholder")&&a(this).siblings("label, i").removeClass("active"),validate_field(a(this))}),validate_field=function(a){0===a.val().length?a.hasClass("validate")&&(a.removeClass("valid"),a.removeClass("invalid")):a.hasClass("validate")&&(a.is(":valid")?(a.removeClass("invalid"),a.addClass("valid")):(a.removeClass("valid"),a.addClass("invalid")))};var d=a(".hiddendiv").first();d.length||(d=a('<div class="hiddendiv common"></div>'),a("body").append(d));var e=".materialize-textarea";a(e).each(function(){var c=a(this);c.val().length&&b(c)}),a("body").on("keyup keydown",e,function(){b(a(this))}),a(".file-field").each(function(){var b=a(this).find("input.file-path");a(this).find('input[type="file"]').change(function(){b.val(a(this)[0].files[0].name),b.trigger("change")})});var f="input[type=range]",g=!1;a(f).each(function(){var b=a('<span class="thumb"><span class="value"></span></span>');a(this).after(b)});var h=".range-field";a(document).on("mousedown",h,function(b){var c=a(this).children(".thumb");c.length<=0&&(c=a('<span class="thumb"><span class="value"></span></span>'),a(this).append(c)),g=!0,a(this).addClass("active"),c.hasClass("active")||c.velocity({height:"30px",width:"30px",top:"-20px",marginLeft:"-15px"},{duration:300,easing:"easeOutExpo"});var d=b.pageX-a(this).offset().left,e=a(this).outerWidth();0>d?d=0:d>e&&(d=e),c.addClass("active").css("left",d),c.find(".value").html(a(this).children("input[type=range]").val())}),a(document).on("mouseup",h,function(){g=!1,a(this).removeClass("active")}),a(document).on("mousemove",h,function(b){var c=a(this).children(".thumb");if(g){c.hasClass("active")||c.velocity({height:"30px",width:"30px",top:"-20px",marginLeft:"-15px"},{duration:300,easing:"easeOutExpo"});var d=b.pageX-a(this).offset().left,e=a(this).outerWidth();0>d?d=0:d>e&&(d=e),c.addClass("active").css("left",d),c.find(".value").html(a(this).children("input[type=range]").val())}}),a(document).on("mouseout",h,function(){if(!g){var b=a(this).children(".thumb");b.hasClass("active")&&b.velocity({height:"0",width:"0",top:"10px",marginLeft:"-6px"},{duration:100}),b.removeClass("active")}})}),a.fn.material_select=function(b){a(this).each(function(){if($select=a(this),!$select.hasClass("browser-default")){var c=$select.data("select-id");if(c&&($select.parent().find("i").remove(),$select.parent().find("input").remove(),$select.unwrap(),a("ul#select-options-"+c).remove()),"destroy"===b)return void $select.data("select-id",null).removeClass("initialized");var d=Materialize.guid();$select.data("select-id",d);var e=a('<div class="select-wrapper"></div>');e.addClass($select.attr("class"));var f=a('<ul id="select-options-'+d+'" class="dropdown-content select-dropdown"></ul>'),g=$select.children("option");if(void 0!==$select.find("option:selected"))var h=$select.find("option:selected");else var h=f.first();g.each(function(){f.append(a('<li class="'+(a(this).is(":disabled")?"disabled":"")+'"><span>'+a(this).html()+"</span></li>"))}),f.find("li").each(function(c){var d=$select;a(this).click(function(){a(this).hasClass("disabled")||(d.find("option").eq(c).prop("selected",!0),d.trigger("change"),d.siblings("input.select-dropdown").val(a(this).text()),"undefined"!=typeof b&&b())})}),$select.wrap(e);var i=a('<i class="mdi-navigation-arrow-drop-down"></i>');$select.is(":disabled")&&i.addClass("disabled");var j=a('<input type="text" class="select-dropdown" readonly="true" '+($select.is(":disabled")?"disabled":"")+' data-activates="select-options-'+d+'" value="'+h.html()+'"/>');$select.before(j),j.before(i),a("body").append(f),$select.is(":disabled")||j.dropdown({hover:!1}),$select.attr("tabindex")&&a(j[0]).attr("tabindex",$select.attr("tabindex")),$select.addClass("initialized"),j.on("focus",function(){a(this).trigger("open"),h=a(this).val(),selectedOption=f.find("li").filter(function(){return a(this).text().toLowerCase()===h.toLowerCase()})[0],activateOption(f,selectedOption)}),j.on("blur",function(){a(this).trigger("close")}),activateOption=function(b,c){b.find("li.active").removeClass("active"),a(c).addClass("active"),b.scrollTo(c)},filterQuery=[],onKeyDown=function(b){return 9==b.which?void j.trigger("close"):40!=b.which||f.is(":visible")?void((13!=b.which||f.is(":visible"))&&(b.preventDefault(),letter=String.fromCharCode(b.which).toLowerCase(),letter&&(filterQuery.push(letter),string=filterQuery.join(""),newOption=f.find("li").filter(function(){return 0===a(this).text().toLowerCase().indexOf(string)})[0],newOption&&activateOption(f,newOption)),13==b.which&&(activeOption=f.find("li.active:not(.disabled)")[0],activeOption&&(a(activeOption).trigger("click"),j.trigger("close"))),40==b.which&&(newOption=f.find("li.active").next("li:not(.disabled)")[0],newOption&&activateOption(f,newOption)),27==b.which&&j.trigger("close"),38==b.which&&(newOption=f.find("li.active").prev("li:not(.disabled)")[0],newOption&&activateOption(f,newOption)),setTimeout(function(){filterQuery=[]},1e3))):void j.trigger("open")},j.on("keydown",onKeyDown)}})}}(jQuery),function(a){a.fn.slider=function(b){var c={indicators:!0,height:400,transition:500,interval:6e3};return b=a.extend(c,b),this.each(function(){function c(a,b){a.hasClass("center-align")?a.velocity({opacity:0,translateY:-100},{duration:b,queue:!1}):a.hasClass("right-align")?a.velocity({opacity:0,translateX:100},{duration:b,queue:!1}):a.hasClass("left-align")&&a.velocity({opacity:0,translateX:-100},{duration:b,queue:!1})}function d(a){a>=h.length?a=0:0>a&&(a=h.length-1),i=g.find(".active").index(),i!=a&&(e=h.eq(i),$caption=e.find(".caption"),e.removeClass("active"),e.velocity({opacity:0},{duration:b.transition,queue:!1,easing:"easeOutQuad",complete:function(){h.not(".active").velocity({opacity:0,translateX:0,translateY:0},{duration:0,queue:!1})}}),c($caption,b.transition),b.indicators&&j.eq(i).removeClass("active"),h.eq(a).velocity({opacity:1},{duration:b.transition,queue:!1,easing:"easeOutQuad"}),h.eq(a).find(".caption").velocity({opacity:1,translateX:0,translateY:0},{duration:b.transition,delay:b.transition,queue:!1,easing:"easeOutQuad"}),h.eq(a).addClass("active"),b.indicators&&j.eq(a).addClass("active"))}var e,f=a(this),g=f.find("ul.slides").first(),h=g.find("li"),i=g.find(".active").index();if(-1!=i&&(e=h.eq(i)),400!=b.height&&(f.height(b.height+40),g.height(b.height)),h.find(".caption").each(function(){c(a(this),0)}),h.find("img").each(function(){a(this).css("background-image","url("+a(this).attr("src")+")"),a(this).attr("src","data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==")}),b.indicators){var j=a('<ul class="indicators"></ul>');h.each(function(){var c=a('<li class="indicator-item"></li>');c.click(function(){var c=g.parent(),e=c.find(a(this)).index();d(e),clearInterval($interval),$interval=setInterval(function(){i=g.find(".active").index(),h.length==i+1?i=0:i+=1,d(i)},b.transition+b.interval)}),j.append(c)}),f.append(j),j=f.find("ul.indicators").find("li.indicator-item")}e?e.show():(h.first().addClass("active").velocity({opacity:1},{duration:b.transition,queue:!1,easing:"easeOutQuad"}),i=0,e=h.eq(i),b.indicators&&j.eq(i).addClass("active")),e.find("img").each(function(){e.find(".caption").velocity({opacity:1,translateX:0,translateY:0},{duration:b.transition,queue:!1,easing:"easeOutQuad"})}),$interval=setInterval(function(){i=g.find(".active").index(),d(i+1)},b.transition+b.interval);var k=!1,l=!1,m=!1;f.hammer({prevent_default:!1}).bind("pan",function(a){if("touch"===a.gesture.pointerType){clearInterval($interval);var b=a.gesture.direction,c=a.gesture.deltaX,d=a.gesture.velocityX;$curr_slide=g.find(".active"),$curr_slide.velocity({translateX:c},{duration:50,queue:!1,easing:"easeOutQuad"}),4===b&&(c>f.innerWidth()/2||-.65>d)?m=!0:2===b&&(c<-1*f.innerWidth()/2||d>.65)&&(l=!0);var e;l&&(e=$curr_slide.next(),0===e.length&&(e=h.first()),e.velocity({opacity:1},{duration:300,queue:!1,easing:"easeOutQuad"})),m&&(e=$curr_slide.prev(),0===e.length&&(e=h.last()),e.velocity({opacity:1},{duration:300,queue:!1,easing:"easeOutQuad"}))}}).bind("panend",function(a){"touch"===a.gesture.pointerType&&($curr_slide=g.find(".active"),k=!1,curr_index=g.find(".active").index(),m||l?l?(d(curr_index+1),$curr_slide.velocity({translateX:-1*f.innerWidth()},{duration:300,queue:!1,easing:"easeOutQuad",complete:function(){$curr_slide.velocity({opacity:0,translateX:0},{duration:0,queue:!1})}})):m&&(d(curr_index-1),$curr_slide.velocity({translateX:f.innerWidth()},{duration:300,queue:!1,easing:"easeOutQuad",complete:function(){$curr_slide.velocity({opacity:0,translateX:0},{duration:0,queue:!1})}})):$curr_slide.velocity({translateX:0},{duration:300,queue:!1,easing:"easeOutQuad"}),l=!1,m=!1,clearInterval($interval),$interval=setInterval(function(){i=g.find(".active").index(),h.length==i+1?i=0:i+=1,d(i)},b.transition+b.interval))})})}}(jQuery),function(a){a(document).ready(function(){a(document).on("click.card",".card",function(b){a(this).find(".card-reveal").length&&(a(b.target).is(a(".card-reveal .card-title"))||a(b.target).is(a(".card-reveal .card-title i"))?a(this).find(".card-reveal").velocity({translateY:0},{duration:225,queue:!1,easing:"easeInOutQuad",complete:function(){a(this).css({display:"none"})}}):(a(b.target).is(a(".card .activator"))||a(b.target).is(a(".card .activator i")))&&a(this).find(".card-reveal").css({display:"block"}).velocity("stop",!1).velocity({translateY:"-100%"},{duration:300,queue:!1,easing:"easeInOutQuad"}))})})}(jQuery),function(a){a(document).ready(function(){a.fn.pushpin=function(b){var c={top:0,bottom:1/0,offset:0};return b=a.extend(c,b),$index=0,this.each(function(){function c(a){a.removeClass("pin-top"),a.removeClass("pinned"),a.removeClass("pin-bottom")}function d(d,e){d.each(function(){b.top<=e&&b.bottom>=e&&!a(this).hasClass("pinned")&&(c(a(this)),a(this).css("top",b.offset),a(this).addClass("pinned")),e<b.top&&!a(this).hasClass("pin-top")&&(c(a(this)),a(this).css("top",0),a(this).addClass("pin-top")),e>b.bottom&&!a(this).hasClass("pin-bottom")&&(c(a(this)),a(this).addClass("pin-bottom"),a(this).css("top",b.bottom-g))})}var e=Materialize.guid(),f=a(this),g=a(this).offset().top;d(f,a(window).scrollTop()),a(window).on("scroll."+e,function(){var c=a(window).scrollTop()+b.offset;d(f,c)})})}})}(jQuery),function(a){a(document).ready(function(){a.fn.reverse=[].reverse,a(document).on("mouseenter.fixedActionBtn",".fixed-action-btn",function(){var b=a(this);b.find("ul .btn-floating").velocity({scaleY:".4",scaleX:".4",translateY:"40px"},{duration:0});var c=0;b.find("ul .btn-floating").reverse().each(function(){a(this).velocity({opacity:"1",scaleX:"1",scaleY:"1",translateY:"0"},{duration:80,delay:c}),c+=40})}),a(document).on("mouseleave.fixedActionBtn",".fixed-action-btn",function(){var b=a(this);b.find("ul .btn-floating").velocity("stop",!0),b.find("ul .btn-floating").velocity({opacity:"0",scaleX:".4",scaleY:".4",translateY:"40px"},{duration:80})})})}(jQuery),function(a){Materialize.fadeInImage=function(b){var c=a(b);c.css({opacity:0}),a(c).velocity({opacity:1},{duration:650,queue:!1,easing:"easeOutSine"}),a(c).velocity({opacity:1},{duration:1300,queue:!1,easing:"swing",step:function(b,c){c.start=100;var d=b/100,e=150-(100-b)/1.75;100>e&&(e=100),b>=0&&a(this).css({"-webkit-filter":"grayscale("+d+")brightness("+e+"%)",filter:"grayscale("+d+")brightness("+e+"%)"})}})},Materialize.showStaggeredList=function(b){var c=0;a(b).find("li").velocity({translateX:"-100px" -},{duration:0}),a(b).find("li").each(function(){a(this).velocity({opacity:"1",translateX:"0"},{duration:800,delay:c,easing:[60,10]}),c+=120})},a(document).ready(function(){var b=!1,c=!1;a(".dismissable").each(function(){a(this).hammer({prevent_default:!1}).bind("pan",function(d){if("touch"===d.gesture.pointerType){var e=a(this),f=d.gesture.direction,g=d.gesture.deltaX,h=d.gesture.velocityX;e.velocity({translateX:g},{duration:50,queue:!1,easing:"easeOutQuad"}),4===f&&(g>e.innerWidth()/2||-.75>h)?b=!0:2===f&&(g<-1*e.innerWidth()/2||h>.75)&&(c=!0)}}).bind("panend",function(d){if("touch"===d.gesture.pointerType){var e=a(this);if(b||c){var f;f=b?e.innerWidth():-1*e.innerWidth(),e.velocity({translateX:f},{duration:100,queue:!1,easing:"easeOutQuad",complete:function(){e.css("border","none"),e.velocity({height:0,padding:0},{duration:200,queue:!1,easing:"easeOutQuad",complete:function(){e.remove()}})}})}else e.velocity({translateX:0},{duration:100,queue:!1,easing:"easeOutQuad"});b=!1,c=!1}})})})}(jQuery),function(){Materialize.scrollFire=function(a){var b=!1;window.addEventListener("scroll",function(){b=!0}),setInterval(function(){if(b){b=!1;for(var c=window.pageYOffset+window.innerHeight,d=0;d<a.length;d++){var e=a[d],f=e.selector,g=e.offset,h=e.callback,i=document.querySelector(f);if(null!==i){var j=i.getBoundingClientRect().top+document.body.scrollTop;if(c>j+g&&1!=e.done){var k=new Function(h);k(),e.done=!0}}}}},100)}}(jQuery),function(a){"function"==typeof define&&define.amd?define("picker",["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):this.Picker=a(jQuery)}(function(a){function b(f,g,i,l){function m(){return b._.node("div",b._.node("div",b._.node("div",b._.node("div",y.component.nodes(t.open),v.box),v.wrap),v.frame),v.holder)}function n(){w.data(g,y).addClass(v.input).attr("tabindex",-1).val(w.data("value")?y.get("select",u.format):f.value),u.editable||w.on("focus."+t.id+" click."+t.id,function(a){a.preventDefault(),y.$root[0].focus()}).on("keydown."+t.id,q),e(f,{haspopup:!0,expanded:!1,readonly:!1,owns:f.id+"_root"})}function o(){y.$root.on({keydown:q,focusin:function(a){y.$root.removeClass(v.focused),a.stopPropagation()},"mousedown click":function(b){var c=b.target;c!=y.$root.children()[0]&&(b.stopPropagation(),"mousedown"!=b.type||a(c).is("input, select, textarea, button, option")||(b.preventDefault(),y.$root[0].focus()))}}).on({focus:function(){w.addClass(v.target)},blur:function(){w.removeClass(v.target)}}).on("focus.toOpen",r).on("click","[data-pick], [data-nav], [data-clear], [data-close]",function(){var b=a(this),c=b.data(),d=b.hasClass(v.navDisabled)||b.hasClass(v.disabled),e=h();e=e&&(e.type||e.href),(d||e&&!a.contains(y.$root[0],e))&&y.$root[0].focus(),!d&&c.nav?y.set("highlight",y.component.item.highlight,{nav:c.nav}):!d&&"pick"in c?y.set("select",c.pick):c.clear?y.clear().close(!0):c.close&&y.close(!0)}),e(y.$root[0],"hidden",!0)}function p(){var b;u.hiddenName===!0?(b=f.name,f.name=""):(b=["string"==typeof u.hiddenPrefix?u.hiddenPrefix:"","string"==typeof u.hiddenSuffix?u.hiddenSuffix:"_submit"],b=b[0]+f.name+b[1]),y._hidden=a('<input type=hidden name="'+b+'"'+(w.data("value")||f.value?' value="'+y.get("select",u.formatSubmit)+'"':"")+">")[0],w.on("change."+t.id,function(){y._hidden.value=f.value?y.get("select",u.formatSubmit):""}),u.container?a(u.container).append(y._hidden):w.after(y._hidden)}function q(a){var b=a.keyCode,c=/^(8|46)$/.test(b);return 27==b?(y.close(),!1):void((32==b||c||!t.open&&y.component.key[b])&&(a.preventDefault(),a.stopPropagation(),c?y.clear().close():y.open()))}function r(a){a.stopPropagation(),"focus"==a.type&&y.$root.addClass(v.focused),y.open()}if(!f)return b;var s=!1,t={id:f.id||"P"+Math.abs(~~(Math.random()*new Date))},u=i?a.extend(!0,{},i.defaults,l):l||{},v=a.extend({},b.klasses(),u.klass),w=a(f),x=function(){return this.start()},y=x.prototype={constructor:x,$node:w,start:function(){return t&&t.start?y:(t.methods={},t.start=!0,t.open=!1,t.type=f.type,f.autofocus=f==h(),f.readOnly=!u.editable,f.id=f.id||t.id,"text"!=f.type&&(f.type="text"),y.component=new i(y,u),y.$root=a(b._.node("div",m(),v.picker,'id="'+f.id+'_root" tabindex="0"')),o(),u.formatSubmit&&p(),n(),u.container?a(u.container).append(y.$root):w.after(y.$root),y.on({start:y.component.onStart,render:y.component.onRender,stop:y.component.onStop,open:y.component.onOpen,close:y.component.onClose,set:y.component.onSet}).on({start:u.onStart,render:u.onRender,stop:u.onStop,open:u.onOpen,close:u.onClose,set:u.onSet}),s=c(y.$root.children()[0]),f.autofocus&&y.open(),y.trigger("start").trigger("render"))},render:function(a){return a?y.$root.html(m()):y.$root.find("."+v.box).html(y.component.nodes(t.open)),y.trigger("render")},stop:function(){return t.start?(y.close(),y._hidden&&y._hidden.parentNode.removeChild(y._hidden),y.$root.remove(),w.removeClass(v.input).removeData(g),setTimeout(function(){w.off("."+t.id)},0),f.type=t.type,f.readOnly=!1,y.trigger("stop"),t.methods={},t.start=!1,y):y},open:function(c){return t.open?y:(w.addClass(v.active),e(f,"expanded",!0),setTimeout(function(){y.$root.addClass(v.opened),e(y.$root[0],"hidden",!1)},0),c!==!1&&(t.open=!0,s&&k.css("overflow","hidden").css("padding-right","+="+d()),y.$root[0].focus(),j.on("click."+t.id+" focusin."+t.id,function(a){var b=a.target;b!=f&&b!=document&&3!=a.which&&y.close(b===y.$root.children()[0])}).on("keydown."+t.id,function(c){var d=c.keyCode,e=y.component.key[d],f=c.target;27==d?y.close(!0):f!=y.$root[0]||!e&&13!=d?a.contains(y.$root[0],f)&&13==d&&(c.preventDefault(),f.click()):(c.preventDefault(),e?b._.trigger(y.component.key.go,y,[b._.trigger(e)]):y.$root.find("."+v.highlighted).hasClass(v.disabled)||y.set("select",y.component.item.highlight).close())})),y.trigger("open"))},close:function(a){return a&&(y.$root.off("focus.toOpen")[0].focus(),setTimeout(function(){y.$root.on("focus.toOpen",r)},0)),w.removeClass(v.active),e(f,"expanded",!1),setTimeout(function(){y.$root.removeClass(v.opened+" "+v.focused),e(y.$root[0],"hidden",!0)},0),t.open?(t.open=!1,s&&k.css("overflow","").css("padding-right","-="+d()),j.off("."+t.id),y.trigger("close")):y},clear:function(a){return y.set("clear",null,a)},set:function(b,c,d){var e,f,g=a.isPlainObject(b),h=g?b:{};if(d=g&&a.isPlainObject(c)?c:d||{},b){g||(h[b]=c);for(e in h)f=h[e],e in y.component.item&&(void 0===f&&(f=null),y.component.set(e,f,d)),("select"==e||"clear"==e)&&w.val("clear"==e?"":y.get(e,u.format)).trigger("change");y.render()}return d.muted?y:y.trigger("set",h)},get:function(a,c){if(a=a||"value",null!=t[a])return t[a];if("valueSubmit"==a){if(y._hidden)return y._hidden.value;a="value"}if("value"==a)return f.value;if(a in y.component.item){if("string"==typeof c){var d=y.component.get(a);return d?b._.trigger(y.component.formats.toString,y.component,[c,d]):""}return y.component.get(a)}},on:function(b,c,d){var e,f,g=a.isPlainObject(b),h=g?b:{};if(b){g||(h[b]=c);for(e in h)f=h[e],d&&(e="_"+e),t.methods[e]=t.methods[e]||[],t.methods[e].push(f)}return y},off:function(){var a,b,c=arguments;for(a=0,namesCount=c.length;a<namesCount;a+=1)b=c[a],b in t.methods&&delete t.methods[b];return y},trigger:function(a,c){var d=function(a){var d=t.methods[a];d&&d.map(function(a){b._.trigger(a,y,[c])})};return d("_"+a),d(a),y}};return new x}function c(a){var b,c="position";return a.currentStyle?b=a.currentStyle[c]:window.getComputedStyle&&(b=getComputedStyle(a)[c]),"fixed"==b}function d(){if(k.height()<=i.height())return 0;var b=a('<div style="visibility:hidden;width:100px" />').appendTo("body"),c=b[0].offsetWidth;b.css("overflow","scroll");var d=a('<div style="width:100%" />').appendTo(b),e=d[0].offsetWidth;return b.remove(),c-e}function e(b,c,d){if(a.isPlainObject(c))for(var e in c)f(b,e,c[e]);else f(b,c,d)}function f(a,b,c){a.setAttribute(("role"==b?"":"aria-")+b,c)}function g(b,c){a.isPlainObject(b)||(b={attribute:c}),c="";for(var d in b){var e=("role"==d?"":"aria-")+d,f=b[d];c+=null==f?"":e+'="'+b[d]+'"'}return c}function h(){try{return document.activeElement}catch(a){}}var i=a(window),j=a(document),k=a(document.documentElement);return b.klasses=function(a){return a=a||"picker",{picker:a,opened:a+"--opened",focused:a+"--focused",input:a+"__input",active:a+"__input--active",target:a+"__input--target",holder:a+"__holder",frame:a+"__frame",wrap:a+"__wrap",box:a+"__box"}},b._={group:function(a){for(var c,d="",e=b._.trigger(a.min,a);e<=b._.trigger(a.max,a,[e]);e+=a.i)c=b._.trigger(a.item,a,[e]),d+=b._.node(a.node,c[0],c[1],c[2]);return d},node:function(b,c,d,e){return c?(c=a.isArray(c)?c.join(""):c,d=d?' class="'+d+'"':"",e=e?" "+e:"","<"+b+d+e+">"+c+"</"+b+">"):""},lead:function(a){return(10>a?"0":"")+a},trigger:function(a,b,c){return"function"==typeof a?a.apply(b,c||[]):a},digits:function(a){return/\d/.test(a[1])?2:1},isDate:function(a){return{}.toString.call(a).indexOf("Date")>-1&&this.isInteger(a.getDate())},isInteger:function(a){return{}.toString.call(a).indexOf("Number")>-1&&a%1===0},ariaAttr:g},b.extend=function(c,d){a.fn[c]=function(e,f){var g=this.data(c);return"picker"==e?g:g&&"string"==typeof e?b._.trigger(g[e],g,[f]):this.each(function(){var f=a(this);f.data(c)||new b(this,c,d,e)})},a.fn[c].defaults=d.defaults},b}),function(a){"function"==typeof define&&define.amd?define(["picker","jquery"],a):"object"==typeof exports?module.exports=a(require("./picker.js"),require("jquery")):a(Picker,jQuery)}(function(a,b){function c(a,b){var c=this,d=a.$node[0],e=d.value,f=a.$node.data("value"),g=f||e,h=f?b.formatSubmit:b.format,i=function(){return d.currentStyle?"rtl"==d.currentStyle.direction:"rtl"==getComputedStyle(a.$root[0]).direction};c.settings=b,c.$node=a.$node,c.queue={min:"measure create",max:"measure create",now:"now create",select:"parse create validate",highlight:"parse navigate create validate",view:"parse create validate viewset",disable:"deactivate",enable:"activate"},c.item={},c.item.clear=null,c.item.disable=(b.disable||[]).slice(0),c.item.enable=-function(a){return a[0]===!0?a.shift():-1}(c.item.disable),c.set("min",b.min).set("max",b.max).set("now"),g?c.set("select",g,{format:h}):c.set("select",null).set("highlight",c.item.now),c.key={40:7,38:-7,39:function(){return i()?-1:1},37:function(){return i()?1:-1},go:function(a){var b=c.item.highlight,d=new Date(b.year,b.month,b.date+a);c.set("highlight",d,{interval:a}),this.render()}},a.on("render",function(){a.$root.find("."+b.klass.selectMonth).on("change",function(){var c=this.value;c&&(a.set("highlight",[a.get("view").year,c,a.get("highlight").date]),a.$root.find("."+b.klass.selectMonth).trigger("focus"))}),a.$root.find("."+b.klass.selectYear).on("change",function(){var c=this.value;c&&(a.set("highlight",[c,a.get("view").month,a.get("highlight").date]),a.$root.find("."+b.klass.selectYear).trigger("focus"))})},1).on("open",function(){var d="";c.disabled(c.get("now"))&&(d=":not(."+b.klass.buttonToday+")"),a.$root.find("button"+d+", select").attr("disabled",!1)},1).on("close",function(){a.$root.find("button, select").attr("disabled",!0)},1)}var d=7,e=6,f=a._;c.prototype.set=function(a,b,c){var d=this,e=d.item;return null===b?("clear"==a&&(a="select"),e[a]=b,d):(e["enable"==a?"disable":"flip"==a?"enable":a]=d.queue[a].split(" ").map(function(e){return b=d[e](a,b,c)}).pop(),"select"==a?d.set("highlight",e.select,c):"highlight"==a?d.set("view",e.highlight,c):a.match(/^(flip|min|max|disable|enable)$/)&&(e.select&&d.disabled(e.select)&&d.set("select",e.select,c),e.highlight&&d.disabled(e.highlight)&&d.set("highlight",e.highlight,c)),d)},c.prototype.get=function(a){return this.item[a]},c.prototype.create=function(a,c,d){var e,g=this;return c=void 0===c?a:c,c==-(1/0)||c==1/0?e=c:b.isPlainObject(c)&&f.isInteger(c.pick)?c=c.obj:b.isArray(c)?(c=new Date(c[0],c[1],c[2]),c=f.isDate(c)?c:g.create().obj):c=f.isInteger(c)||f.isDate(c)?g.normalize(new Date(c),d):g.now(a,c,d),{year:e||c.getFullYear(),month:e||c.getMonth(),date:e||c.getDate(),day:e||c.getDay(),obj:e||c,pick:e||c.getTime()}},c.prototype.createRange=function(a,c){var d=this,e=function(a){return a===!0||b.isArray(a)||f.isDate(a)?d.create(a):a};return f.isInteger(a)||(a=e(a)),f.isInteger(c)||(c=e(c)),f.isInteger(a)&&b.isPlainObject(c)?a=[c.year,c.month,c.date+a]:f.isInteger(c)&&b.isPlainObject(a)&&(c=[a.year,a.month,a.date+c]),{from:e(a),to:e(c)}},c.prototype.withinRange=function(a,b){return a=this.createRange(a.from,a.to),b.pick>=a.from.pick&&b.pick<=a.to.pick},c.prototype.overlapRanges=function(a,b){var c=this;return a=c.createRange(a.from,a.to),b=c.createRange(b.from,b.to),c.withinRange(a,b.from)||c.withinRange(a,b.to)||c.withinRange(b,a.from)||c.withinRange(b,a.to)},c.prototype.now=function(a,b,c){return b=new Date,c&&c.rel&&b.setDate(b.getDate()+c.rel),this.normalize(b,c)},c.prototype.navigate=function(a,c,d){var e,f,g,h,i=b.isArray(c),j=b.isPlainObject(c),k=this.item.view;if(i||j){for(j?(f=c.year,g=c.month,h=c.date):(f=+c[0],g=+c[1],h=+c[2]),d&&d.nav&&k&&k.month!==g&&(f=k.year,g=k.month),e=new Date(f,g+(d&&d.nav?d.nav:0),1),f=e.getFullYear(),g=e.getMonth();new Date(f,g,h).getMonth()!==g;)h-=1;c=[f,g,h]}return c},c.prototype.normalize=function(a){return a.setHours(0,0,0,0),a},c.prototype.measure=function(a,b){var c=this;return b?"string"==typeof b?b=c.parse(a,b):f.isInteger(b)&&(b=c.now(a,b,{rel:b})):b="min"==a?-(1/0):1/0,b},c.prototype.viewset=function(a,b){return this.create([b.year,b.month,1])},c.prototype.validate=function(a,c,d){var e,g,h,i,j=this,k=c,l=d&&d.interval?d.interval:1,m=-1===j.item.enable,n=j.item.min,o=j.item.max,p=m&&j.item.disable.filter(function(a){if(b.isArray(a)){var d=j.create(a).pick;d<c.pick?e=!0:d>c.pick&&(g=!0)}return f.isInteger(a)}).length;if((!d||!d.nav)&&(!m&&j.disabled(c)||m&&j.disabled(c)&&(p||e||g)||!m&&(c.pick<=n.pick||c.pick>=o.pick)))for(m&&!p&&(!g&&l>0||!e&&0>l)&&(l*=-1);j.disabled(c)&&(Math.abs(l)>1&&(c.month<k.month||c.month>k.month)&&(c=k,l=l>0?1:-1),c.pick<=n.pick?(h=!0,l=1,c=j.create([n.year,n.month,n.date+(c.pick===n.pick?0:-1)])):c.pick>=o.pick&&(i=!0,l=-1,c=j.create([o.year,o.month,o.date+(c.pick===o.pick?0:1)])),!h||!i);)c=j.create([c.year,c.month,c.date+l]);return c},c.prototype.disabled=function(a){var c=this,d=c.item.disable.filter(function(d){return f.isInteger(d)?a.day===(c.settings.firstDay?d:d-1)%7:b.isArray(d)||f.isDate(d)?a.pick===c.create(d).pick:b.isPlainObject(d)?c.withinRange(d,a):void 0});return d=d.length&&!d.filter(function(a){return b.isArray(a)&&"inverted"==a[3]||b.isPlainObject(a)&&a.inverted}).length,-1===c.item.enable?!d:d||a.pick<c.item.min.pick||a.pick>c.item.max.pick},c.prototype.parse=function(a,b,c){var d=this,e={};return b&&"string"==typeof b?(c&&c.format||(c=c||{},c.format=d.settings.format),d.formats.toArray(c.format).map(function(a){var c=d.formats[a],g=c?f.trigger(c,d,[b,e]):a.replace(/^!/,"").length;c&&(e[a]=b.substr(0,g)),b=b.substr(g)}),[e.yyyy||e.yy,+(e.mm||e.m)-1,e.dd||e.d]):b},c.prototype.formats=function(){function a(a,b,c){var d=a.match(/\w+/)[0];return c.mm||c.m||(c.m=b.indexOf(d)+1),d.length}function b(a){return a.match(/\w+/)[0].length}return{d:function(a,b){return a?f.digits(a):b.date},dd:function(a,b){return a?2:f.lead(b.date)},ddd:function(a,c){return a?b(a):this.settings.weekdaysShort[c.day]},dddd:function(a,c){return a?b(a):this.settings.weekdaysFull[c.day]},m:function(a,b){return a?f.digits(a):b.month+1},mm:function(a,b){return a?2:f.lead(b.month+1)},mmm:function(b,c){var d=this.settings.monthsShort;return b?a(b,d,c):d[c.month]},mmmm:function(b,c){var d=this.settings.monthsFull;return b?a(b,d,c):d[c.month]},yy:function(a,b){return a?2:(""+b.year).slice(2)},yyyy:function(a,b){return a?4:b.year},toArray:function(a){return a.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g)},toString:function(a,b){var c=this;return c.formats.toArray(a).map(function(a){return f.trigger(c.formats[a],c,[0,b])||a.replace(/^!/,"")}).join("")}}}(),c.prototype.isDateExact=function(a,c){var d=this;return f.isInteger(a)&&f.isInteger(c)||"boolean"==typeof a&&"boolean"==typeof c?a===c:(f.isDate(a)||b.isArray(a))&&(f.isDate(c)||b.isArray(c))?d.create(a).pick===d.create(c).pick:b.isPlainObject(a)&&b.isPlainObject(c)?d.isDateExact(a.from,c.from)&&d.isDateExact(a.to,c.to):!1},c.prototype.isDateOverlap=function(a,c){var d=this,e=d.settings.firstDay?1:0;return f.isInteger(a)&&(f.isDate(c)||b.isArray(c))?(a=a%7+e,a===d.create(c).day+1):f.isInteger(c)&&(f.isDate(a)||b.isArray(a))?(c=c%7+e,c===d.create(a).day+1):b.isPlainObject(a)&&b.isPlainObject(c)?d.overlapRanges(a,c):!1},c.prototype.flipEnable=function(a){var b=this.item;b.enable=a||(-1==b.enable?1:-1)},c.prototype.deactivate=function(a,c){var d=this,e=d.item.disable.slice(0);return"flip"==c?d.flipEnable():c===!1?(d.flipEnable(1),e=[]):c===!0?(d.flipEnable(-1),e=[]):c.map(function(a){for(var c,g=0;g<e.length;g+=1)if(d.isDateExact(a,e[g])){c=!0;break}c||(f.isInteger(a)||f.isDate(a)||b.isArray(a)||b.isPlainObject(a)&&a.from&&a.to)&&e.push(a)}),e},c.prototype.activate=function(a,c){var d=this,e=d.item.disable,g=e.length;return"flip"==c?d.flipEnable():c===!0?(d.flipEnable(1),e=[]):c===!1?(d.flipEnable(-1),e=[]):c.map(function(a){var c,h,i,j;for(i=0;g>i;i+=1){if(h=e[i],d.isDateExact(h,a)){c=e[i]=null,j=!0;break}if(d.isDateOverlap(h,a)){b.isPlainObject(a)?(a.inverted=!0,c=a):b.isArray(a)?(c=a,c[3]||c.push("inverted")):f.isDate(a)&&(c=[a.getFullYear(),a.getMonth(),a.getDate(),"inverted"]);break}}if(c)for(i=0;g>i;i+=1)if(d.isDateExact(e[i],a)){e[i]=null;break}if(j)for(i=0;g>i;i+=1)if(d.isDateOverlap(e[i],a)){e[i]=null;break}c&&e.push(c)}),e.filter(function(a){return null!=a})},c.prototype.nodes=function(a){var b=this,c=b.settings,g=b.item,h=g.now,i=g.select,j=g.highlight,k=g.view,l=g.disable,m=g.min,n=g.max,o=function(a,b){return c.firstDay&&(a.push(a.shift()),b.push(b.shift())),f.node("thead",f.node("tr",f.group({min:0,max:d-1,i:1,node:"th",item:function(d){return[a[d],c.klass.weekdays,'scope=col title="'+b[d]+'"']}})))}((c.showWeekdaysFull?c.weekdaysFull:c.weekdaysLetter).slice(0),c.weekdaysFull.slice(0)),p=function(a){return f.node("div"," ",c.klass["nav"+(a?"Next":"Prev")]+(a&&k.year>=n.year&&k.month>=n.month||!a&&k.year<=m.year&&k.month<=m.month?" "+c.klass.navDisabled:""),"data-nav="+(a||-1)+" "+f.ariaAttr({role:"button",controls:b.$node[0].id+"_table"})+' title="'+(a?c.labelMonthNext:c.labelMonthPrev)+'"')},q=function(d){var e=c.showMonthsShort?c.monthsShort:c.monthsFull;return"short_months"==d&&(e=c.monthsShort),c.selectMonths&&void 0==d?f.node("select",f.group({min:0,max:11,i:1,node:"option",item:function(a){return[e[a],0,"value="+a+(k.month==a?" selected":"")+(k.year==m.year&&a<m.month||k.year==n.year&&a>n.month?" disabled":"")]}}),c.klass.selectMonth+" browser-default",(a?"":"disabled")+" "+f.ariaAttr({controls:b.$node[0].id+"_table"})+' title="'+c.labelMonthSelect+'"'):"short_months"==d?null!=i?f.node("div",e[i.month]):f.node("div",e[k.month]):f.node("div",e[k.month],c.klass.month)},r=function(d){var e=k.year,g=c.selectYears===!0?5:~~(c.selectYears/2);if(g){var h=m.year,i=n.year,j=e-g,l=e+g;if(h>j&&(l+=h-j,j=h),l>i){var o=j-h,p=l-i;j-=o>p?p:o,l=i}if(c.selectYears&&void 0==d)return f.node("select",f.group({min:j,max:l,i:1,node:"option",item:function(a){return[a,0,"value="+a+(e==a?" selected":"")]}}),c.klass.selectYear+" browser-default",(a?"":"disabled")+" "+f.ariaAttr({controls:b.$node[0].id+"_table"})+' title="'+c.labelYearSelect+'"')}return"raw"==d?f.node("div",e):f.node("div",e,c.klass.year)};return createDayLabel=function(){return null!=i?f.node("div",i.date):f.node("div",h.date)},createWeekdayLabel=function(){var a;a=null!=i?i.day:h.day;var b=c.weekdaysFull[a];return b},f.node("div",f.node("div",createWeekdayLabel(),"picker__weekday-display")+f.node("div",q("short_months"),c.klass.month_display)+f.node("div",createDayLabel(),c.klass.day_display)+f.node("div",r("raw"),c.klass.year_display),c.klass.date_display)+f.node("div",f.node("div",(c.selectYears?q()+r():q()+r())+p()+p(1),c.klass.header)+f.node("table",o+f.node("tbody",f.group({min:0,max:e-1,i:1,node:"tr",item:function(a){var e=c.firstDay&&0===b.create([k.year,k.month,1]).day?-7:0;return[f.group({min:d*a-k.day+e+1,max:function(){return this.min+d-1},i:1,node:"td",item:function(a){a=b.create([k.year,k.month,a+(c.firstDay?1:0)]);var d=i&&i.pick==a.pick,e=j&&j.pick==a.pick,g=l&&b.disabled(a)||a.pick<m.pick||a.pick>n.pick,o=f.trigger(b.formats.toString,b,[c.format,a]);return[f.node("div",a.date,function(b){return b.push(k.month==a.month?c.klass.infocus:c.klass.outfocus),h.pick==a.pick&&b.push(c.klass.now),d&&b.push(c.klass.selected),e&&b.push(c.klass.highlighted),g&&b.push(c.klass.disabled),b.join(" ")}([c.klass.day]),"data-pick="+a.pick+" "+f.ariaAttr({role:"gridcell",label:o,selected:d&&b.$node.val()===o?!0:null,activedescendant:e?!0:null,disabled:g?!0:null})),"",f.ariaAttr({role:"presentation"})]}})]}})),c.klass.table,'id="'+b.$node[0].id+'_table" '+f.ariaAttr({role:"grid",controls:b.$node[0].id,readonly:!0})),c.klass.calendar_container)+f.node("div",f.node("button",c.today,"btn-flat picker__today","type=button data-pick="+h.pick+(a&&!b.disabled(h)?"":" disabled")+" "+f.ariaAttr({controls:b.$node[0].id}))+f.node("button",c.clear,"btn-flat picker__clear","type=button data-clear=1"+(a?"":" disabled")+" "+f.ariaAttr({controls:b.$node[0].id}))+f.node("button",c.close,"btn-flat picker__close","type=button data-close=true "+(a?"":" disabled")+" "+f.ariaAttr({controls:b.$node[0].id})),c.klass.footer)},c.defaults=function(a){return{labelMonthNext:"Next month",labelMonthPrev:"Previous month",labelMonthSelect:"Select a month",labelYearSelect:"Select a year",monthsFull:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdaysFull:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],weekdaysLetter:["S","M","T","W","T","F","S"],today:"Today",clear:"Clear",close:"Close",format:"d mmmm, yyyy",klass:{table:a+"table",header:a+"header",date_display:a+"date-display",day_display:a+"day-display",month_display:a+"month-display",year_display:a+"year-display",calendar_container:a+"calendar-container",navPrev:a+"nav--prev",navNext:a+"nav--next",navDisabled:a+"nav--disabled",month:a+"month",year:a+"year",selectMonth:a+"select--month",selectYear:a+"select--year",weekdays:a+"weekday",day:a+"day",disabled:a+"day--disabled",selected:a+"day--selected",highlighted:a+"day--highlighted",now:a+"day--today",infocus:a+"day--infocus",outfocus:a+"day--outfocus",footer:a+"footer",buttonClear:a+"button--clear",buttonToday:a+"button--today",buttonClose:a+"button--close"}}}(a.klasses().picker+"__"),a.extend("pickadate",c)}),function(a){function b(){var b=+a(this).attr("length"),c=+a(this).val().length,d=b>=c;a(this).parent().find('span[class="character-counter"]').html(c+"/"+b),e(d,a(this))}function c(b){$counterElement=a("<span/>").addClass("character-counter").css("float","right").css("font-size","12px").css("height",1),b.parent().append($counterElement)}function d(){a(this).parent().find('span[class="character-counter"]').html("")}function e(a,b){inputHasInvalidClass=b.hasClass("invalid"),a&&inputHasInvalidClass?b.removeClass("invalid"):a||inputHasInvalidClass||(b.removeClass("valid"),b.addClass("invalid"))}a.fn.characterCounter=function(){return this.each(function(){itHasLengthAttribute=void 0!=a(this).attr("length"),itHasLengthAttribute&&(a(this).on("input",b),a(this).on("focus",b),a(this).on("blur",d),c(a(this)))})},a(document).ready(function(){a("input, textarea").characterCounter()})}(jQuery);
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/package.json b/StoneIsland/plugins/phonegap-plugin-push/package.json deleted file mode 100755 index cccd8c87..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "phonegap-plugin-push", - "description": "Register and receive push notifications.", - "version": "1.4.4", - "homepage": "http://github.com/phonegap/phonegap-plugin-push#readme", - "repository": { - "type": "git", - "url": "git://github.com/phonegap/phonegap-plugin-push.git" - }, - "bugs": { - "url": "https://github.com/phonegap/phonegap-plugin-push/issues" - }, - "cordova": { - "id": "phonegap-plugin-push", - "platforms": [ - "ios", - "android", - "windows8", - "windows", - "wp8", - "browser" - ] - }, - "keywords": [ - "ecosystem:cordova", - "ecosystem:phonegap", - "cordova-ios", - "cordova-android", - "cordova-windows8", - "cordova-windows", - "cordova-wp8", - "cordova-browser" - ], - "engines": [ - { - "name": "cordova", - "version": ">=3.0.0" - } - ], - "author": "Adobe PhoneGap Team", - "license": "APL", - "scripts": { - "test": "jasmine-node --color spec" - }, - "devDependencies": { - "jasmine-node": "1.14.5" - } -} diff --git a/StoneIsland/plugins/phonegap-plugin-push/plugin.xml b/StoneIsland/plugins/phonegap-plugin-push/plugin.xml deleted file mode 100755 index 58cebca3..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/plugin.xml +++ /dev/null @@ -1,127 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0" - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:amazon="http://schemas.android.com/apk/lib/com.amazon.device.ads" - xmlns:rim="http://www.blackberry.com/ns/widgets" - id="phonegap-plugin-push" - version="1.4.4"> - - <name>PushPlugin</name> - <author>Bob Easterday</author> - - <description> - This plugin allows your application to receive push notifications on Android, iOS, WP8 and Windows8 devices. - Android uses Google Cloud Messaging. - iOS uses Apple APNS Notifications. - WP8 uses Microsoft MPNS Notifications. - Windows8 uses Microsoft WNS Notifications. - </description> - - <license>MIT</license> - - <js-module src="www/push.js" name="PushNotification"> - <clobbers target="PushNotification" /> - </js-module> - - <engines> - <engine name="cordova" version=">=3.0.0" /> - </engines> - - <!-- android --> - <platform name="android"> - - <config-file target="res/xml/config.xml" parent="/*"> - <feature name="PushNotification" > - <param name="android-package" value="com.adobe.phonegap.push.PushPlugin"/> - </feature> - </config-file> - - <config-file target="AndroidManifest.xml" parent="/manifest"> - <uses-permission android:name="android.permission.INTERNET" /> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - <uses-permission android:name="android.permission.WAKE_LOCK" /> - <uses-permission android:name="android.permission.VIBRATE"/> - <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> - <permission android:name="$PACKAGE_NAME.permission.C2D_MESSAGE" android:protectionLevel="signature" /> - <uses-permission android:name="$PACKAGE_NAME.permission.C2D_MESSAGE" /> - </config-file> - - <config-file target="AndroidManifest.xml" parent="/manifest/application"> - <activity android:name="com.adobe.phonegap.push.PushHandlerActivity" android:exported="true"/> - - <receiver - android:name="com.google.android.gms.gcm.GcmReceiver" - android:exported="true" - android:permission="com.google.android.c2dm.permission.SEND" > - <intent-filter> - <action android:name="com.google.android.c2dm.intent.RECEIVE" /> - <category android:name="$PACKAGE_NAME" /> - </intent-filter> - </receiver> - <service - android:name="com.adobe.phonegap.push.GCMIntentService" - android:exported="false" > - <intent-filter> - <action android:name="com.google.android.c2dm.intent.RECEIVE" /> - </intent-filter> - </service> - <service - android:name="com.adobe.phonegap.push.PushInstanceIDListenerService" - android:exported="false"> - <intent-filter> - <action android:name="com.google.android.gms.iid.InstanceID"/> - </intent-filter> - </service> - <service - android:name="com.adobe.phonegap.push.RegistrationIntentService" - android:exported="false"> - </service> - </config-file> - - <framework src="push.gradle" custom="true" type="gradleReference" /> - <framework src="com.android.support:support-v13:23+" /> - <framework src="com.google.android.gms:play-services-gcm:+" /> - - <source-file src="src/android/com/adobe/phonegap/push/GCMIntentService.java" target-dir="src/com/adobe/phonegap/push/" /> - <source-file src="src/android/com/adobe/phonegap/push/PushConstants.java" target-dir="src/com/adobe/phonegap/push/" /> - <source-file src="src/android/com/adobe/phonegap/push/PushHandlerActivity.java" target-dir="src/com/adobe/phonegap/push/" /> - <source-file src="src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java" target-dir="src/com/adobe/phonegap/push/" /> - <source-file src="src/android/com/adobe/phonegap/push/PushPlugin.java" target-dir="src/com/adobe/phonegap/push/" /> - <source-file src="src/android/com/adobe/phonegap/push/RegistrationIntentService.java" target-dir="src/com/adobe/phonegap/push/" /> - - </platform> - - <!-- ios --> - <platform name="ios"> - - <config-file target="config.xml" parent="/*"> - <feature name="PushNotification"> - <param name="ios-package" value="PushPlugin"/> - </feature> - </config-file> - - <config-file target="*-Info.plist" parent="UIBackgroundModes"> - <array> - <string>remote-notification</string> - </array> - </config-file> - - <source-file src="src/ios/AppDelegate+notification.m" /> - <source-file src="src/ios/PushPlugin.m" /> - - <header-file src="src/ios/AppDelegate+notification.h" /> - <header-file src="src/ios/PushPlugin.h" /> - - </platform> - - <!-- windows --> - <platform name="windows"> - <js-module src="src/windows/PushPluginProxy.js" name="PushPlugin"> - <merges target="" /> - </js-module> - <config-file target="config.xml" parent="/*"> - <preference name="WindowsToastCapable" value="true" /> - </config-file> - </platform> - -</plugin> diff --git a/StoneIsland/plugins/phonegap-plugin-push/push.gradle b/StoneIsland/plugins/phonegap-plugin-push/push.gradle deleted file mode 100755 index d61b60f5..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/push.gradle +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.regex.Pattern - -def doExtractStringFromManifest(name) { - def manifestFile = file(android.sourceSets.main.manifest.srcFile) - def pattern = Pattern.compile(name + "=\"(.*?)\"") - def matcher = pattern.matcher(manifestFile.getText()) - matcher.find() - return matcher.group(1) -} - -android { - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - } - } - - defaultConfig { - applicationId = doExtractStringFromManifest("package") - } -}
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/spec/helper/cordova.js b/StoneIsland/plugins/phonegap-plugin-push/spec/helper/cordova.js deleted file mode 100755 index 02bdee5f..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/spec/helper/cordova.js +++ /dev/null @@ -1,83 +0,0 @@ -/* global cordova:true */ - -/*! - * Module dependencies. - */ - -/** - * cordova.js for node. - * - * Think of this as cordova-node, which would be simliar to cordova-android - * or cordova-browser. The purpose of this module is to enable testing - * of a plugin's JavaScript interface. - * - * When this module is first required, it will insert a global cordova - * instance, which can hijack cordova-specific commands within the pluin's - * implementation. - * - * Remember to require this module before the plugin that you want to test. - * - * Example: - * - * var cordova = require('./helper/cordova'), - * myPlugin = require('../www/myPlugin'); - */ - -module.exports = global.cordova = cordova = { - - /** - * cordova.require Mock. - * - * Hijacks all cordova.requires. By default, it returns an empty function. - * You can define your own implementation of each required module before - * or after it has been required. - * - * See `cordova.required` to learn how to add your own module implemtnation. - */ - - require: function(moduleId) { - // define a default function if it doesn't exist - if (!cordova.required[moduleId]) { - cordova.required[moduleId] = function() {}; - } - // create a new module mapping between the module Id and cordova.required. - return new ModuleMap(moduleId); - }, - - /** - * Cordova module implementations. - * - * A key-value hash, where the key is the module such as 'cordova/exec' - * and the value is the function or object returned. - * - * For example: - * - * var exec = require('cordova/exec'); - * - * Will map to: - * - * cordova.required['cordova/exec']; - */ - - required: { - // populated at runtime - } -}; - -/** - * Module Mapper. - * - * Returns a function that when executed will lookup the implementation - * in cordova.required[id]. - * - * @param {String} moduleId is the module name/path, such as 'cordova/exec' - * @return {Function}. - */ - -function ModuleMap(moduleId) { - return function() { - // lookup and execute the module's mock implementation, passing - // in any parameters that were provided. - return cordova.required[moduleId].apply(this, arguments); - }; -} diff --git a/StoneIsland/plugins/phonegap-plugin-push/spec/index.spec.js b/StoneIsland/plugins/phonegap-plugin-push/spec/index.spec.js deleted file mode 100755 index cf0647ef..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/spec/index.spec.js +++ /dev/null @@ -1,210 +0,0 @@ -/*! - * Module dependencies. - */ - -var cordova = require('./helper/cordova'), - PushNotification = require('../www/push'), - execSpy, - execWin, - options; - -/*! - * Specification. - */ - -describe('phonegap-plugin-push', function () { - beforeEach(function () { - options = {android: {}, ios: {}, windows: {}}; - execWin = jasmine.createSpy(); - execSpy = spyOn(cordova.required, 'cordova/exec').andCallFake(execWin); - }); - - describe('PushNotification', function () { - it("should exist", function () { - expect(PushNotification).toBeDefined(); - expect(typeof PushNotification == 'object').toBe(true); - }); - - it("should contain a init function", function () { - expect(PushNotification.init).toBeDefined(); - expect(typeof PushNotification.init == 'function').toBe(true); - }); - - it("should contain a unregister function", function () { - var push = PushNotification.init({}); - expect(push.unregister).toBeDefined(); - expect(typeof push.unregister == 'function').toBe(true); - }); - - it("should contain a getApplicationIconBadgeNumber function", function () { - var push = PushNotification.init({}); - expect(push.getApplicationIconBadgeNumber).toBeDefined(); - expect(typeof push.getApplicationIconBadgeNumber == 'function').toBe(true); - }); - - it("should contain a setApplicationIconBadgeNumber function", function () { - var push = PushNotification.init({}); - expect(push.setApplicationIconBadgeNumber).toBeDefined(); - expect(typeof push.setApplicationIconBadgeNumber == 'function').toBe(true); - }); - }); - - describe('PushNotification instance', function () { - describe('cordova.exec', function () { - it('should call cordova.exec on next process tick', function (done) { - PushNotification.init(options); - setTimeout(function () { - expect(execSpy).toHaveBeenCalledWith( - jasmine.any(Function), - jasmine.any(Function), - 'PushNotification', - 'init', - jasmine.any(Object) - ); - done(); - }, 100); - }); - }); - - describe('on "registration" event', function () { - it('should be emitted with an argument', function (done) { - execSpy.andCallFake(function (win, fail, service, id, args) { - win({'registrationId': 1}); - }); - var push = PushNotification.init(options); - push.on('registration', function (data) { - expect(data.registrationId).toEqual(1); - done(); - }); - }); - }); - - describe('on "notification" event', function () { - beforeEach(function () { - execSpy.andCallFake(function (win, fail, service, id, args) { - win({ - message: 'Message', - title: 'Title', - count: 1, - sound: 'beep', - image: 'Image', - additionalData: {} - }); - }); - }); - - it('should be emitted on success', function (done) { - var push = PushNotification.init(options); - push.on('notification', function (data) { - done(); - }); - }); - - it('should provide the data.message argument', function (done) { - var push = PushNotification.init(options); - push.on('notification', function (data) { - expect(data.message).toEqual('Message'); - done(); - }); - }); - - it('should provide the data.title argument', function (done) { - var push = PushNotification.init(options); - push.on('notification', function (data) { - expect(data.title).toEqual('Title'); - done(); - }); - }); - - it('should provide the data.count argument', function (done) { - var push = PushNotification.init(options); - push.on('notification', function (data) { - expect(data.count).toEqual(1); - done(); - }); - }); - - it('should provide the data.sound argument', function (done) { - var push = PushNotification.init(options); - push.on('notification', function (data) { - expect(data.sound).toEqual('beep'); - done(); - }); - }); - - it('should provide the data.image argument', function (done) { - var push = PushNotification.init(options); - push.on('notification', function (data) { - expect(data.image).toEqual('Image'); - done(); - }); - }); - - it('should provide the data.additionalData argument', function (done) { - var push = PushNotification.init(options); - push.on('notification', function (data) { - expect(data.additionalData).toEqual({}); - done(); - }); - }); - }); - - describe('on "error" event', function () { - it('should be emitted with an Error', function (done) { - execSpy.andCallFake(function (win, fail, service, id, args) { - fail('something went wrong'); - }); - var push = PushNotification.init(options); - push.on('error', function (e) { - expect(e).toEqual(jasmine.any(Error)); - expect(e.message).toEqual('something went wrong'); - done(); - }); - }); - }); - - describe('off "notification" event', function () { - it('should exist and be registered a callback handle', function (done) { - var push = PushNotification.init(options), - eventHandler = function () { - }; - - push.on('notification', eventHandler); - - push.off('notification', eventHandler); - - expect(push._handlers.notification.indexOf(eventHandler)).toEqual(-1); - done(); - }); - }); - - describe('off "registration" event', function () { - it('should exist and be registered a callback handle', function (done) { - var push = PushNotification.init(options), - eventHandler = function () { - }; - - push.on('registration', eventHandler); - - push.off('registration', eventHandler); - - expect(push._handlers.registration.indexOf(eventHandler)).toEqual(-1); - done(); - }); - }); - - describe('off "error" event', function () { - it('should exist and be registered a callback handle', function (done) { - var push = PushNotification.init(options), - eventHandler = function () { - }; - - push.on('error', eventHandler); - push.off('error', eventHandler); - - expect(push._handlers.error.indexOf(eventHandler)).toEqual(-1); - done(); - }); - }); - }); -}); diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/GCMIntentService.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/GCMIntentService.java deleted file mode 100755 index 24daa6a5..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/GCMIntentService.java +++ /dev/null @@ -1,603 +0,0 @@ -package com.adobe.phonegap.push; - -import android.annotation.SuppressLint; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.AssetManager; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.net.Uri; -import android.os.Bundle; -import android.support.v4.app.NotificationCompat; -import android.text.Html; -import android.util.Log; - -import com.google.android.gms.gcm.GcmListenerService; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -@SuppressLint("NewApi") -public class GCMIntentService extends GcmListenerService implements PushConstants { - - private static final String LOG_TAG = "PushPlugin_GCMIntentService"; - private static HashMap<Integer, ArrayList<String>> messageMap = new HashMap<Integer, ArrayList<String>>(); - - public void setNotification(int notId, String message){ - ArrayList<String> messageList = messageMap.get(notId); - if(messageList == null) { - messageList = new ArrayList<String>(); - messageMap.put(notId, messageList); - } - - if(message.isEmpty()){ - messageList.clear(); - }else{ - messageList.add(message); - } - } - - @Override - public void onMessageReceived(String from, Bundle extras) { - Log.d(LOG_TAG, "onMessage - from: " + from); - - if (extras != null) { - - SharedPreferences prefs = getApplicationContext().getSharedPreferences(PushPlugin.COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE); - boolean forceShow = prefs.getBoolean(FORCE_SHOW, false); - - extras = normalizeExtras(extras); - - // if we are in the foreground and forceShow is `false` only send data - if (!forceShow && PushPlugin.isInForeground()) { - Log.d(LOG_TAG, "foreground"); - extras.putBoolean(FOREGROUND, true); - PushPlugin.sendExtras(extras); - } - // if we are in the foreground and forceShow is `true`, force show the notification if the data has at least a message or title - else if (forceShow && PushPlugin.isInForeground()) { - Log.d(LOG_TAG, "foreground force"); - extras.putBoolean(FOREGROUND, true); - - showNotificationIfPossible(getApplicationContext(), extras); - } - // if we are not in the foreground always send notification if the data has at least a message or title - else { - Log.d(LOG_TAG, "background"); - extras.putBoolean(FOREGROUND, false); - - showNotificationIfPossible(getApplicationContext(), extras); - } - } - } - - /* - * Change a values key in the extras bundle - */ - private void replaceKey(String oldKey, String newKey, Bundle extras, Bundle newExtras) { - Object value = extras.get(oldKey); - if ( value != null ) { - if (value instanceof String) { - newExtras.putString(newKey, (String) value); - } else if (value instanceof Boolean) { - newExtras.putBoolean(newKey, (Boolean) value); - } else if (value instanceof Number) { - newExtras.putDouble(newKey, ((Number) value).doubleValue()); - } else { - newExtras.putString(newKey, String.valueOf(value)); - } - } - } - - /* - * Replace alternate keys with our canonical value - */ - private String normalizeKey(String key) { - if (key.equals(BODY) || key.equals(ALERT) || key.equals(GCM_NOTIFICATION_BODY)) { - return MESSAGE; - } else if (key.equals(MSGCNT) || key.equals(BADGE)) { - return COUNT; - } else if (key.equals(SOUNDNAME)) { - return SOUND; - } else if (key.startsWith(GCM_NOTIFICATION)) { - return key.substring(GCM_NOTIFICATION.length()+1, key.length()); - } else if (key.startsWith(GCM_N)) { - return key.substring(GCM_N.length()+1, key.length()); - } else if (key.startsWith(UA_PREFIX)) { - key = key.substring(UA_PREFIX.length()+1, key.length()); - return key.toLowerCase(); - } else { - return key; - } - } - - /* - * Parse bundle into normalized keys. - */ - private Bundle normalizeExtras(Bundle extras) { - Log.d(LOG_TAG, "normalize extras"); - Iterator<String> it = extras.keySet().iterator(); - Bundle newExtras = new Bundle(); - - while (it.hasNext()) { - String key = it.next(); - - Log.d(LOG_TAG, "key = " + key); - - // If normalizeKeythe key is "data" or "message" and the value is a json object extract - // This is to support parse.com and other services. Issue #147 and pull #218 - if (key.equals(PARSE_COM_DATA) || key.equals(MESSAGE)) { - Object json = extras.get(key); - // Make sure data is json object stringified - if ( json instanceof String && ((String) json).startsWith("{") ) { - Log.d(LOG_TAG, "extracting nested message data from key = " + key); - try { - // If object contains message keys promote each value to the root of the bundle - JSONObject data = new JSONObject((String) json); - if ( data.has(ALERT) || data.has(MESSAGE) || data.has(BODY) || data.has(TITLE) ) { - Iterator<String> jsonIter = data.keys(); - while (jsonIter.hasNext()) { - String jsonKey = jsonIter.next(); - - Log.d(LOG_TAG, "key = data/" + jsonKey); - - String value = data.getString(jsonKey); - jsonKey = normalizeKey(jsonKey); - newExtras.putString(jsonKey, value); - } - } - } catch( JSONException e) { - Log.e(LOG_TAG, "normalizeExtras: JSON exception"); - } - } - } else if (key.equals(("notification"))) { - Bundle value = extras.getBundle(key); - Iterator<String> iterator = value.keySet().iterator(); - while (iterator.hasNext()) { - String notifkey = iterator.next(); - - Log.d(LOG_TAG, "notifkey = " + notifkey); - String newKey = normalizeKey(notifkey); - Log.d(LOG_TAG, "replace key " + notifkey + " with " + newKey); - - newExtras.putString(newKey, value.getString(notifkey)); - } - continue; - } - - String newKey = normalizeKey(key); - Log.d(LOG_TAG, "replace key " + key + " with " + newKey); - replaceKey(key, newKey, extras, newExtras); - - } // while - - return newExtras; - } - - private void showNotificationIfPossible (Context context, Bundle extras) { - - // Send a notification if there is a message or title, otherwise just send data - String message = extras.getString(MESSAGE); - String title = extras.getString(TITLE); - - Log.d(LOG_TAG, "message =[" + message + "]"); - Log.d(LOG_TAG, "title =[" + title + "]"); - - if ((message != null && message.length() != 0) || - (title != null && title.length() != 0)) { - - Log.d(LOG_TAG, "create notification"); - - createNotification(context, extras); - } else { - Log.d(LOG_TAG, "send notification event"); - PushPlugin.sendExtras(extras); - } - } - - public void createNotification(Context context, Bundle extras) { - NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - String appName = getAppName(this); - String packageName = context.getPackageName(); - Resources resources = context.getResources(); - - int notId = parseInt(NOT_ID, extras); - Intent notificationIntent = new Intent(this, PushHandlerActivity.class); - notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); - notificationIntent.putExtra(PUSH_BUNDLE, extras); - notificationIntent.putExtra(NOT_ID, notId); - - int requestCode = new Random().nextInt(); - PendingIntent contentIntent = PendingIntent.getActivity(this, requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationCompat.Builder mBuilder = - new NotificationCompat.Builder(context) - .setWhen(System.currentTimeMillis()) - .setContentTitle(extras.getString(TITLE)) - .setTicker(extras.getString(TITLE)) - .setContentIntent(contentIntent) - .setAutoCancel(true); - - SharedPreferences prefs = context.getSharedPreferences(PushPlugin.COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE); - String localIcon = prefs.getString(ICON, null); - String localIconColor = prefs.getString(ICON_COLOR, null); - boolean soundOption = prefs.getBoolean(SOUND, true); - boolean vibrateOption = prefs.getBoolean(VIBRATE, true); - Log.d(LOG_TAG, "stored icon=" + localIcon); - Log.d(LOG_TAG, "stored iconColor=" + localIconColor); - Log.d(LOG_TAG, "stored sound=" + soundOption); - Log.d(LOG_TAG, "stored vibrate=" + vibrateOption); - - /* - * Notification Vibration - */ - - setNotificationVibration(extras, vibrateOption, mBuilder); - - /* - * Notification Icon Color - * - * Sets the small-icon background color of the notification. - * To use, add the `iconColor` key to plugin android options - * - */ - setNotificationIconColor(extras.getString("color"), mBuilder, localIconColor); - - /* - * Notification Icon - * - * Sets the small-icon of the notification. - * - * - checks the plugin options for `icon` key - * - if none, uses the application icon - * - * The icon value must be a string that maps to a drawable resource. - * If no resource is found, falls - * - */ - setNotificationSmallIcon(context, extras, packageName, resources, mBuilder, localIcon); - - /* - * Notification Large-Icon - * - * Sets the large-icon of the notification - * - * - checks the gcm data for the `image` key - * - checks to see if remote image, loads it. - * - checks to see if assets image, Loads It. - * - checks to see if resource image, LOADS IT! - * - if none, we don't set the large icon - * - */ - setNotificationLargeIcon(extras, packageName, resources, mBuilder); - - /* - * Notification Sound - */ - if (soundOption) { - setNotificationSound(context, extras, mBuilder); - } - - /* - * LED Notification - */ - setNotificationLedColor(extras, mBuilder); - - /* - * Priority Notification - */ - setNotificationPriority(extras, mBuilder); - - /* - * Notification message - */ - setNotificationMessage(notId, extras, mBuilder); - - /* - * Notification count - */ - setNotificationCount(extras, mBuilder); - - /* - * Notification add actions - */ - createActions(extras, mBuilder, resources, packageName); - - mNotificationManager.notify(appName, notId, mBuilder.build()); - } - - private void createActions(Bundle extras, NotificationCompat.Builder mBuilder, Resources resources, String packageName) { - Log.d(LOG_TAG, "create actions"); - String actions = extras.getString(ACTIONS); - if (actions != null) { - try { - JSONArray actionsArray = new JSONArray(actions); - for (int i=0; i < actionsArray.length(); i++) { - Log.d(LOG_TAG, "adding action"); - JSONObject action = actionsArray.getJSONObject(i); - Log.d(LOG_TAG, "adding callback = " + action.getString(CALLBACK)); - Intent intent = new Intent(this, PushHandlerActivity.class); - intent.putExtra(CALLBACK, action.getString(CALLBACK)); - intent.putExtra(PUSH_BUNDLE, extras); - PendingIntent pIntent = PendingIntent.getActivity(this, i, intent, PendingIntent.FLAG_UPDATE_CURRENT); - - mBuilder.addAction(resources.getIdentifier(action.getString(ICON), DRAWABLE, packageName), - action.getString(TITLE), pIntent); - } - } catch(JSONException e) { - // nope - } - } - } - - private void setNotificationCount(Bundle extras, NotificationCompat.Builder mBuilder) { - String msgcnt = extras.getString(MSGCNT); - if (msgcnt == null) { - msgcnt = extras.getString(BADGE); - } - if (msgcnt != null) { - mBuilder.setNumber(Integer.parseInt(msgcnt)); - } - } - - private void setNotificationVibration(Bundle extras, Boolean vibrateOption, NotificationCompat.Builder mBuilder) { - String vibrationPattern = extras.getString(VIBRATION_PATTERN); - if (vibrationPattern != null) { - String[] items = vibrationPattern.replaceAll("\\[", "").replaceAll("\\]", "").split(","); - long[] results = new long[items.length]; - for (int i = 0; i < items.length; i++) { - try { - results[i] = Long.parseLong(items[i]); - } catch (NumberFormatException nfe) {} - } - mBuilder.setVibrate(results); - } else { - if (vibrateOption) { - mBuilder.setDefaults(Notification.DEFAULT_VIBRATE); - } - } - } - - private void setNotificationMessage(int notId, Bundle extras, NotificationCompat.Builder mBuilder) { - String message = extras.getString(MESSAGE); - - String style = extras.getString(STYLE, STYLE_TEXT); - if(STYLE_INBOX.equals(style)) { - setNotification(notId, message); - - mBuilder.setContentText(message); - - ArrayList<String> messageList = messageMap.get(notId); - Integer sizeList = messageList.size(); - if (sizeList > 1) { - String sizeListMessage = sizeList.toString(); - String stacking = sizeList + " more"; - if (extras.getString(SUMMARY_TEXT) != null) { - stacking = extras.getString(SUMMARY_TEXT); - stacking = stacking.replace("%n%", sizeListMessage); - } - NotificationCompat.InboxStyle notificationInbox = new NotificationCompat.InboxStyle() - .setBigContentTitle(extras.getString(TITLE)) - .setSummaryText(stacking); - - for (int i = messageList.size() - 1; i >= 0; i--) { - notificationInbox.addLine(Html.fromHtml(messageList.get(i))); - } - - mBuilder.setStyle(notificationInbox); - } else { - NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle(); - if (message != null) { - bigText.bigText(message); - bigText.setBigContentTitle(extras.getString(TITLE)); - mBuilder.setStyle(bigText); - } - } - } else if (STYLE_PICTURE.equals(style)) { - setNotification(notId, ""); - - NotificationCompat.BigPictureStyle bigPicture = new NotificationCompat.BigPictureStyle(); - bigPicture.bigPicture(getBitmapFromURL(extras.getString(PICTURE))); - bigPicture.setBigContentTitle(extras.getString(TITLE)); - bigPicture.setSummaryText(extras.getString(SUMMARY_TEXT)); - - mBuilder.setContentTitle(extras.getString(TITLE)); - mBuilder.setContentText(message); - - mBuilder.setStyle(bigPicture); - } else { - setNotification(notId, ""); - - NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle(); - - if (message != null) { - mBuilder.setContentText(Html.fromHtml(message)); - - bigText.bigText(message); - bigText.setBigContentTitle(extras.getString(TITLE)); - - String summaryText = extras.getString(SUMMARY_TEXT); - if (summaryText != null) { - bigText.setSummaryText(summaryText); - } - - mBuilder.setStyle(bigText); - } - /* - else { - mBuilder.setContentText("<missing message content>"); - } - */ - } - } - - private void setNotificationSound(Context context, Bundle extras, NotificationCompat.Builder mBuilder) { - String soundname = extras.getString(SOUNDNAME); - if (soundname == null) { - soundname = extras.getString(SOUND); - } - if (soundname != null && !soundname.contentEquals(SOUND_DEFAULT)) { - Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE - + "://" + context.getPackageName() + "/raw/" + soundname); - Log.d(LOG_TAG, sound.toString()); - mBuilder.setSound(sound); - } else { - mBuilder.setSound(android.provider.Settings.System.DEFAULT_NOTIFICATION_URI); - } - } - - private void setNotificationLedColor(Bundle extras, NotificationCompat.Builder mBuilder) { - String ledColor = extras.getString(LED_COLOR); - if (ledColor != null) { - // Converts parse Int Array from ledColor - String[] items = ledColor.replaceAll("\\[", "").replaceAll("\\]", "").split(","); - int[] results = new int[items.length]; - for (int i = 0; i < items.length; i++) { - try { - results[i] = Integer.parseInt(items[i]); - } catch (NumberFormatException nfe) {} - } - if (results.length == 4) { - mBuilder.setLights(Color.argb(results[0], results[1], results[2], results[3]), 500, 500); - } else { - Log.e(LOG_TAG, "ledColor parameter must be an array of length == 4 (ARGB)"); - } - } - } - - private void setNotificationPriority(Bundle extras, NotificationCompat.Builder mBuilder) { - String priorityStr = extras.getString(PRIORITY); - if (priorityStr != null) { - try { - Integer priority = Integer.parseInt(priorityStr); - if (priority >= NotificationCompat.PRIORITY_MIN && priority <= NotificationCompat.PRIORITY_MAX) { - mBuilder.setPriority(priority); - } else { - Log.e(LOG_TAG, "Priority parameter must be between -2 and 2"); - } - } catch (NumberFormatException e) { - e.printStackTrace(); - } - } - } - - private void setNotificationLargeIcon(Bundle extras, String packageName, Resources resources, NotificationCompat.Builder mBuilder) { - String gcmLargeIcon = extras.getString(IMAGE); // from gcm - if (gcmLargeIcon != null) { - if (gcmLargeIcon.startsWith("http://") || gcmLargeIcon.startsWith("https://")) { - mBuilder.setLargeIcon(getBitmapFromURL(gcmLargeIcon)); - Log.d(LOG_TAG, "using remote large-icon from gcm"); - } else { - AssetManager assetManager = getAssets(); - InputStream istr; - try { - istr = assetManager.open(gcmLargeIcon); - Bitmap bitmap = BitmapFactory.decodeStream(istr); - mBuilder.setLargeIcon(bitmap); - Log.d(LOG_TAG, "using assets large-icon from gcm"); - } catch (IOException e) { - int largeIconId = 0; - largeIconId = resources.getIdentifier(gcmLargeIcon, DRAWABLE, packageName); - if (largeIconId != 0) { - Bitmap largeIconBitmap = BitmapFactory.decodeResource(resources, largeIconId); - mBuilder.setLargeIcon(largeIconBitmap); - Log.d(LOG_TAG, "using resources large-icon from gcm"); - } else { - Log.d(LOG_TAG, "Not setting large icon"); - } - } - } - } - } - - private void setNotificationSmallIcon(Context context, Bundle extras, String packageName, Resources resources, NotificationCompat.Builder mBuilder, String localIcon) { - int iconId = 0; - String icon = extras.getString(ICON); - if (icon != null) { - iconId = resources.getIdentifier(icon, DRAWABLE, packageName); - Log.d(LOG_TAG, "using icon from plugin options"); - } - else if (localIcon != null) { - iconId = resources.getIdentifier(localIcon, DRAWABLE, packageName); - Log.d(LOG_TAG, "using icon from plugin options"); - } - if (iconId == 0) { - Log.d(LOG_TAG, "no icon resource found - using application icon"); - iconId = context.getApplicationInfo().icon; - } - mBuilder.setSmallIcon(iconId); - } - - private void setNotificationIconColor(String color, NotificationCompat.Builder mBuilder, String localIconColor) { - int iconColor = 0; - if (color != null) { - try { - iconColor = Color.parseColor(color); - } catch (IllegalArgumentException e) { - Log.e(LOG_TAG, "couldn't parse color from android options"); - } - } - else if (localIconColor != null) { - try { - iconColor = Color.parseColor(localIconColor); - } catch (IllegalArgumentException e) { - Log.e(LOG_TAG, "couldn't parse color from android options"); - } - } - if (iconColor != 0) { - mBuilder.setColor(iconColor); - } - } - - public Bitmap getBitmapFromURL(String strURL) { - try { - URL url = new URL(strURL); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setDoInput(true); - connection.connect(); - InputStream input = connection.getInputStream(); - return BitmapFactory.decodeStream(input); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - } - - private static String getAppName(Context context) { - CharSequence appName = context.getPackageManager().getApplicationLabel(context.getApplicationInfo()); - return (String)appName; - } - - private int parseInt(String value, Bundle extras) { - int retval = 0; - - try { - retval = Integer.parseInt(extras.getString(value)); - } - catch(NumberFormatException e) { - Log.e(LOG_TAG, "Number format exception - Error parsing " + value + ": " + e.getMessage()); - } - catch(Exception e) { - Log.e(LOG_TAG, "Number format exception - Error parsing " + value + ": " + e.getMessage()); - } - - return retval; - } -} diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java deleted file mode 100755 index aeb49c9b..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.adobe.phonegap.push; - -public interface PushConstants { - public static final String COM_ADOBE_PHONEGAP_PUSH = "com.adobe.phonegap.push"; - public static final String REGISTRATION_ID = "registrationId"; - public static final String FOREGROUND = "foreground"; - public static final String TITLE = "title"; - public static final String NOT_ID = "notId"; - public static final String PUSH_BUNDLE = "pushBundle"; - public static final String ICON = "icon"; - public static final String ICON_COLOR = "iconColor"; - public static final String SOUND = "sound"; - public static final String SOUND_DEFAULT = "default"; - public static final String VIBRATE = "vibrate"; - public static final String ACTIONS = "actions"; - public static final String CALLBACK = "callback"; - public static final String DRAWABLE = "drawable"; - public static final String MSGCNT = "msgcnt"; - public static final String VIBRATION_PATTERN = "vibrationPattern"; - public static final String STYLE = "style"; - public static final String SUMMARY_TEXT = "summaryText"; - public static final String PICTURE = "picture"; - public static final String GCM_N = "gcm.n."; - public static final String GCM_NOTIFICATION = "gcm.notification"; - public static final String GCM_NOTIFICATION_BODY = "gcm.notification.body"; - public static final String UA_PREFIX = "com.urbanairship.push"; - public static final String PARSE_COM_DATA = "data"; - public static final String ALERT = "alert"; - public static final String MESSAGE = "message"; - public static final String BODY = "body"; - public static final String SOUNDNAME = "soundname"; - public static final String LED_COLOR = "ledColor"; - public static final String PRIORITY = "priority"; - public static final String IMAGE = "image"; - public static final String STYLE_INBOX = "inbox"; - public static final String STYLE_PICTURE = "picture"; - public static final String STYLE_TEXT = "text"; - public static final String BADGE = "badge"; - public static final String INITIALIZE = "init"; - public static final String UNREGISTER = "unregister"; - public static final String EXIT = "exit"; - public static final String FINISH = "finish"; - public static final String ANDROID = "android"; - public static final String SENDER_ID = "senderID"; - public static final String CLEAR_NOTIFICATIONS = "clearNotifications"; - public static final String COLDSTART = "coldstart"; - public static final String ADDITIONAL_DATA = "additionalData"; - public static final String COUNT = "count"; - public static final String FROM = "from"; - public static final String COLLAPSE_KEY = "collapse_key"; - public static final String FORCE_SHOW = "forceShow"; - public static final String GCM = "GCM"; -} diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java deleted file mode 100755 index dd9fbd36..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.adobe.phonegap.push; - -import android.app.Activity; -import android.app.NotificationManager; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.util.Log; - -public class PushHandlerActivity extends Activity implements PushConstants { - private static String LOG_TAG = "PushPlugin_PushHandlerActivity"; - - /* - * this activity will be started if the user touches a notification that we own. - * We send it's data off to the push plugin for processing. - * If needed, we boot up the main activity to kickstart the application. - * @see android.app.Activity#onCreate(android.os.Bundle) - */ - @Override - public void onCreate(Bundle savedInstanceState) { - GCMIntentService gcm = new GCMIntentService(); - gcm.setNotification(getIntent().getIntExtra(NOT_ID, 0), ""); - super.onCreate(savedInstanceState); - Log.v(LOG_TAG, "onCreate"); - - boolean isPushPluginActive = PushPlugin.isActive(); - processPushBundle(isPushPluginActive); - - finish(); - - if (!isPushPluginActive) { - forceMainActivityReload(); - } - } - - /** - * Takes the pushBundle extras from the intent, - * and sends it through to the PushPlugin for processing. - */ - private void processPushBundle(boolean isPushPluginActive) { - Bundle extras = getIntent().getExtras(); - - if (extras != null) { - Bundle originalExtras = extras.getBundle(PUSH_BUNDLE); - - originalExtras.putBoolean(FOREGROUND, false); - originalExtras.putBoolean(COLDSTART, !isPushPluginActive); - originalExtras.putString(CALLBACK, extras.getString("callback")); - - PushPlugin.sendExtras(originalExtras); - } - } - - /** - * Forces the main activity to re-launch if it's unloaded. - */ - private void forceMainActivityReload() { - PackageManager pm = getPackageManager(); - Intent launchIntent = pm.getLaunchIntentForPackage(getApplicationContext().getPackageName()); - startActivity(launchIntent); - } - - @Override - protected void onResume() { - super.onResume(); - final NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancelAll(); - } -}
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java deleted file mode 100755 index eaa39a48..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.adobe.phonegap.push; - -import android.content.Intent; -import android.content.Context; -import android.content.SharedPreferences; -import android.util.Log; - -import com.google.android.gms.iid.InstanceID; -import com.google.android.gms.iid.InstanceIDListenerService; - -import org.json.JSONException; - -import java.io.IOException; - -public class PushInstanceIDListenerService extends InstanceIDListenerService implements PushConstants { - public static final String LOG_TAG = "PushPlugin_PushInstanceIDListenerService"; - - @Override - public void onTokenRefresh() { - SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE); - String senderID = sharedPref.getString(SENDER_ID, ""); - if (!"".equals(senderID)) { - Intent intent = new Intent(this, RegistrationIntentService.class); - startService(intent); - } - } -} diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java deleted file mode 100755 index 41a91819..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java +++ /dev/null @@ -1,294 +0,0 @@ -package com.adobe.phonegap.push; - -import android.app.NotificationManager; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.util.Log; - -import com.google.android.gms.iid.InstanceID; - -import org.apache.cordova.CallbackContext; -import org.apache.cordova.CordovaInterface; -import org.apache.cordova.CordovaPlugin; -import org.apache.cordova.CordovaWebView; -import org.apache.cordova.PluginResult; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; - -public class PushPlugin extends CordovaPlugin implements PushConstants { - - public static final String LOG_TAG = "PushPlugin"; - - private static CallbackContext pushContext; - private static CordovaWebView gWebView; - private static Bundle gCachedExtras = null; - private static boolean gForeground = false; - - /** - * Gets the application context from cordova's main activity. - * @return the application context - */ - private Context getApplicationContext() { - return this.cordova.getActivity().getApplicationContext(); - } - - @Override - public boolean execute(final String action, final JSONArray data, final CallbackContext callbackContext) { - Log.v(LOG_TAG, "execute: action=" + action); - gWebView = this.webView; - - if (INITIALIZE.equals(action)) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - pushContext = callbackContext; - JSONObject jo = null; - - Log.v(LOG_TAG, "execute: data=" + data.toString()); - SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE); - String token = null; - String senderID = null; - - try { - jo = data.getJSONObject(0).getJSONObject(ANDROID); - - Log.v(LOG_TAG, "execute: jo=" + jo.toString()); - - senderID = jo.getString(SENDER_ID); - - Log.v(LOG_TAG, "execute: senderID=" + senderID); - - String savedSenderID = sharedPref.getString(SENDER_ID, ""); - String savedRegID = sharedPref.getString(REGISTRATION_ID, ""); - - // first time run get new token - if ("".equals(savedRegID)) { - token = InstanceID.getInstance(getApplicationContext()).getToken(senderID, GCM); - } - // new sender ID, re-register - else if (!savedSenderID.equals(senderID)) { - token = InstanceID.getInstance(getApplicationContext()).getToken(senderID, GCM); - } - // use the saved one - else { - token = sharedPref.getString(REGISTRATION_ID, ""); - } - - if (!"".equals(token)) { - JSONObject json = new JSONObject().put(REGISTRATION_ID, token); - - Log.v(LOG_TAG, "onRegistered: " + json.toString()); - - PushPlugin.sendEvent( json ); - } else { - callbackContext.error("Empty registration ID received from GCM"); - return; - } - } catch (JSONException e) { - Log.e(LOG_TAG, "execute: Got JSON Exception " + e.getMessage()); - callbackContext.error(e.getMessage()); - } catch (IOException e) { - Log.e(LOG_TAG, "execute: Got JSON Exception " + e.getMessage()); - callbackContext.error(e.getMessage()); - } - - if (jo != null) { - SharedPreferences.Editor editor = sharedPref.edit(); - try { - editor.putString(ICON, jo.getString(ICON)); - } catch (JSONException e) { - Log.d(LOG_TAG, "no icon option"); - } - try { - editor.putString(ICON_COLOR, jo.getString(ICON_COLOR)); - } catch (JSONException e) { - Log.d(LOG_TAG, "no iconColor option"); - } - editor.putBoolean(SOUND, jo.optBoolean(SOUND, true)); - editor.putBoolean(VIBRATE, jo.optBoolean(VIBRATE, true)); - editor.putBoolean(CLEAR_NOTIFICATIONS, jo.optBoolean(CLEAR_NOTIFICATIONS, true)); - editor.putBoolean(FORCE_SHOW, jo.optBoolean(FORCE_SHOW, false)); - editor.putString(SENDER_ID, senderID); - editor.putString(REGISTRATION_ID, token); - editor.commit(); - } - - if (gCachedExtras != null) { - Log.v(LOG_TAG, "sending cached extras"); - sendExtras(gCachedExtras); - gCachedExtras = null; - } - } - }); - } else if (UNREGISTER.equals(action)) { - cordova.getThreadPool().execute(new Runnable() { - public void run() { - try { - InstanceID.getInstance(getApplicationContext()).deleteInstanceID(); - Log.v(LOG_TAG, "UNREGISTER"); - - // Remove shared prefs - SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = sharedPref.edit(); - editor.remove(SOUND); - editor.remove(VIBRATE); - editor.remove(CLEAR_NOTIFICATIONS); - editor.remove(FORCE_SHOW); - editor.remove(SENDER_ID); - editor.remove(REGISTRATION_ID); - editor.commit(); - - callbackContext.success(); - } catch (IOException e) { - Log.e(LOG_TAG, "execute: Got JSON Exception " + e.getMessage()); - callbackContext.error(e.getMessage()); - } - } - }); - } else if (FINISH.equals(action)) { - callbackContext.success(); - } else { - Log.e(LOG_TAG, "Invalid action : " + action); - callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.INVALID_ACTION)); - return false; - } - - return true; - } - - public static void sendEvent(JSONObject _json) { - PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, _json); - pluginResult.setKeepCallback(true); - if (pushContext != null) { - pushContext.sendPluginResult(pluginResult); - } - } - - public static void sendError(String message) { - PluginResult pluginResult = new PluginResult(PluginResult.Status.ERROR, message); - pluginResult.setKeepCallback(true); - if (pushContext != null) { - pushContext.sendPluginResult(pluginResult); - } - } - - /* - * Sends the pushbundle extras to the client application. - * If the client application isn't currently active, it is cached for later processing. - */ - public static void sendExtras(Bundle extras) { - if (extras != null) { - if (gWebView != null) { - sendEvent(convertBundleToJson(extras)); - } else { - Log.v(LOG_TAG, "sendExtras: caching extras to send at a later time."); - gCachedExtras = extras; - } - } - } - - @Override - public void initialize(CordovaInterface cordova, CordovaWebView webView) { - super.initialize(cordova, webView); - gForeground = true; - } - - @Override - public void onPause(boolean multitasking) { - super.onPause(multitasking); - gForeground = false; - - SharedPreferences prefs = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE); - if (prefs.getBoolean(CLEAR_NOTIFICATIONS, true)) { - final NotificationManager notificationManager = (NotificationManager) cordova.getActivity().getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancelAll(); - } - } - - @Override - public void onResume(boolean multitasking) { - super.onResume(multitasking); - gForeground = true; - } - - @Override - public void onDestroy() { - super.onDestroy(); - gForeground = false; - gWebView = null; - } - - /* - * serializes a bundle to JSON. - */ - private static JSONObject convertBundleToJson(Bundle extras) { - Log.d(LOG_TAG, "convert extras to json"); - try { - JSONObject json = new JSONObject(); - JSONObject additionalData = new JSONObject(); - - // Add any keys that need to be in top level json to this set - HashSet<String> jsonKeySet = new HashSet(); - Collections.addAll(jsonKeySet, TITLE,MESSAGE,COUNT,SOUND,IMAGE); - - Iterator<String> it = extras.keySet().iterator(); - while (it.hasNext()) { - String key = it.next(); - Object value = extras.get(key); - - Log.d(LOG_TAG, "key = " + key); - - if (jsonKeySet.contains(key)) { - json.put(key, value); - } - else if (key.equals(COLDSTART)) { - additionalData.put(key, extras.getBoolean(COLDSTART)); - } - else if (key.equals(FOREGROUND)) { - additionalData.put(key, extras.getBoolean(FOREGROUND)); - } - else if ( value instanceof String ) { - String strValue = (String)value; - try { - // Try to figure out if the value is another JSON object - if (strValue.startsWith("{")) { - additionalData.put(key, new JSONObject(strValue)); - } - // Try to figure out if the value is another JSON array - else if (strValue.startsWith("[")) { - additionalData.put(key, new JSONArray(strValue)); - } - else { - additionalData.put(key, value); - } - } catch (Exception e) { - additionalData.put(key, value); - } - } - } // while - - json.put(ADDITIONAL_DATA, additionalData); - Log.v(LOG_TAG, "extrasToJSON: " + json.toString()); - - return json; - } - catch( JSONException e) { - Log.e(LOG_TAG, "extrasToJSON: JSON exception"); - } - return null; - } - - public static boolean isInForeground() { - return gForeground; - } - - public static boolean isActive() { - return gWebView != null; - } -}
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/RegistrationIntentService.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/RegistrationIntentService.java deleted file mode 100755 index c4489fc1..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/RegistrationIntentService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.adobe.phonegap.push; - -import android.content.Context; - -import android.app.IntentService; -import android.content.Intent; -import android.content.SharedPreferences; -import android.util.Log; - -import com.google.android.gms.gcm.GoogleCloudMessaging; -import com.google.android.gms.iid.InstanceID; - -import java.io.IOException; - -public class RegistrationIntentService extends IntentService implements PushConstants { - public static final String LOG_TAG = "PushPlugin_RegistrationIntentService"; - - public RegistrationIntentService() { - super(LOG_TAG); - } - - @Override - protected void onHandleIntent(Intent intent) { - SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE); - - try { - InstanceID instanceID = InstanceID.getInstance(this); - String senderID = sharedPreferences.getString(SENDER_ID, ""); - String token = instanceID.getToken(senderID, - GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); - Log.i(LOG_TAG, "new GCM Registration Token: " + token); - - // save new token - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(REGISTRATION_ID, token); - editor.commit(); - - } catch (Exception e) { - Log.d(LOG_TAG, "Failed to complete token refresh", e); - } - } -}
\ No newline at end of file diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.h b/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.h deleted file mode 100755 index be79903e..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// AppDelegate+notification.h -// pushtest -// -// Created by Robert Easterday on 10/26/12. -// -// - -#import "AppDelegate.h" - -@interface AppDelegate (notification) -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken; -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error; -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo; -- (void)applicationDidBecomeActive:(UIApplication *)application; -- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler; -- (id) getCommandInstance:(NSString*)className; - -@property (nonatomic, retain) NSDictionary *launchNotification; - -@end diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m b/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m deleted file mode 100755 index 8b4ed161..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m +++ /dev/null @@ -1,167 +0,0 @@ -// -// AppDelegate+notification.m -// pushtest -// -// Created by Robert Easterday on 10/26/12. -// -// - -#import "AppDelegate+notification.h" -#import "PushPlugin.h" -#import <objc/runtime.h> - -static char launchNotificationKey; - -@implementation AppDelegate (notification) - -- (id) getCommandInstance:(NSString*)className -{ - return [self.viewController getCommandInstance:className]; -} - -// its dangerous to override a method from within a category. -// Instead we will use method swizzling. we set this up in the load call. -+ (void)load -{ - Method original, swizzled; - - original = class_getInstanceMethod(self, @selector(init)); - swizzled = class_getInstanceMethod(self, @selector(swizzled_init)); - method_exchangeImplementations(original, swizzled); -} - -- (AppDelegate *)swizzled_init -{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(createNotificationChecker:) - name:@"UIApplicationDidFinishLaunchingNotification" object:nil]; - - // This actually calls the original init method over in AppDelegate. Equivilent to calling super - // on an overrided method, this is not recursive, although it appears that way. neat huh? - return [self swizzled_init]; -} - -// This code will be called immediately after application:didFinishLaunchingWithOptions:. We need -// to process notifications in cold-start situations -- (void)createNotificationChecker:(NSNotification *)notification -{ - if (notification) - { - NSDictionary *launchOptions = [notification userInfo]; - if (launchOptions) - self.launchNotification = [launchOptions objectForKey: @"UIApplicationLaunchOptionsRemoteNotificationKey"]; - } -} - -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - [pushHandler didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; -} - -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - [pushHandler didFailToRegisterForRemoteNotificationsWithError:error]; -} - -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { - NSLog(@"didReceiveNotification with fetchCompletionHandler"); - - // app is in the foreground so call notification callback - if (application.applicationState == UIApplicationStateActive) { - NSLog(@"app active"); - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - pushHandler.notificationMessage = userInfo; - pushHandler.isInline = YES; - [pushHandler notificationReceived]; - - completionHandler(UIBackgroundFetchResultNewData); - } - // app is in background or in stand by - else { - NSLog(@"app in-active"); - - // do some convoluted logic to find out if this should be a silent push. - long silent = 0; - id aps = [userInfo objectForKey:@"aps"]; - id contentAvailable = [aps objectForKey:@"content-available"]; - if ([contentAvailable isKindOfClass:[NSString class]] && [contentAvailable isEqualToString:@"1"]) { - silent = 1; - } else if ([contentAvailable isKindOfClass:[NSNumber class]]) { - silent = [contentAvailable integerValue]; - } - - if (silent == 1) { - NSLog(@"this should be a silent push"); - void (^safeHandler)(UIBackgroundFetchResult) = ^(UIBackgroundFetchResult result){ - dispatch_async(dispatch_get_main_queue(), ^{ - completionHandler(result); - }); - }; - - NSMutableDictionary* params = [NSMutableDictionary dictionaryWithCapacity:2]; - [params setObject:safeHandler forKey:@"handler"]; - - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - pushHandler.notificationMessage = userInfo; - pushHandler.isInline = NO; - pushHandler.handlerObj = params; - [pushHandler notificationReceived]; - } else { - NSLog(@"just put it in the shade"); - //save it for later - self.launchNotification = userInfo; - - completionHandler(UIBackgroundFetchResultNewData); - } - } -} - -- (void)applicationDidBecomeActive:(UIApplication *)application { - - NSLog(@"active"); - - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - if (pushHandler.clearBadge) { - NSLog(@"PushPlugin clearing badge"); - //zero badge - application.applicationIconBadgeNumber = 0; - } else { - NSLog(@"PushPlugin skip clear badge"); - } - - if (self.launchNotification) { - pushHandler.isInline = NO; - pushHandler.notificationMessage = self.launchNotification; - self.launchNotification = nil; - [pushHandler performSelectorOnMainThread:@selector(notificationReceived) withObject:pushHandler waitUntilDone:NO]; - } -} - -//For interactive notification only -- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler -{ - //handle the actions - if ([identifier isEqualToString:@"declineAction"]){ - } - else if ([identifier isEqualToString:@"answerAction"]){ - } -} - - -// The accessors use an Associative Reference since you can't define a iVar in a category -// http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocAssociativeReferences.html -- (NSMutableArray *)launchNotification -{ - return objc_getAssociatedObject(self, &launchNotificationKey); -} - -- (void)setLaunchNotification:(NSDictionary *)aDictionary -{ - objc_setAssociatedObject(self, &launchNotificationKey, aDictionary, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (void)dealloc -{ - self.launchNotification = nil; // clear the association and release the object -} - -@end diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h b/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h deleted file mode 100755 index 5b88398e..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - Copyright 2009-2011 Urban Airship Inc. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binaryform must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided withthe distribution. - - THIS SOFTWARE IS PROVIDED BY THE URBAN AIRSHIP INC``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - EVENT SHALL URBAN AIRSHIP INC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import <Foundation/Foundation.h> -#import <Cordova/CDV.h> -#import <Cordova/CDVPlugin.h> - -@interface PushPlugin : CDVPlugin -{ - NSDictionary *notificationMessage; - BOOL isInline; - NSString *notificationCallbackId; - NSString *callback; - BOOL clearBadge; - - NSDictionary *handlerObj; - void (^completionHandler)(UIBackgroundFetchResult); - - BOOL ready; -} - -@property (nonatomic, copy) NSString *callbackId; -@property (nonatomic, copy) NSString *notificationCallbackId; -@property (nonatomic, copy) NSString *callback; - -@property (nonatomic, strong) NSDictionary *notificationMessage; -@property BOOL isInline; -@property BOOL clearBadge; -@property (nonatomic, strong) NSDictionary *handlerObj; - -- (void)init:(CDVInvokedUrlCommand*)command; -- (void)unregister:(CDVInvokedUrlCommand*)command; - -- (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken; -- (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error; - -- (void)setNotificationMessage:(NSDictionary *)notification; -- (void)notificationReceived; - -@end diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m b/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m deleted file mode 100755 index 40f494d1..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m +++ /dev/null @@ -1,347 +0,0 @@ -/* - Copyright 2009-2011 Urban Airship Inc. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binaryform must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided withthe distribution. - - THIS SOFTWARE IS PROVIDED BY THE URBAN AIRSHIP INC``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - EVENT SHALL URBAN AIRSHIP INC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import "PushPlugin.h" - -@implementation PushPlugin - -@synthesize notificationMessage; -@synthesize isInline; - -@synthesize callbackId; -@synthesize notificationCallbackId; -@synthesize callback; -@synthesize clearBadge; -@synthesize handlerObj; - -- (void)unregister:(CDVInvokedUrlCommand*)command; -{ - self.callbackId = command.callbackId; - - [[UIApplication sharedApplication] unregisterForRemoteNotifications]; - [self successWithMessage:@"unregistered"]; -} - -- (void)init:(CDVInvokedUrlCommand*)command; -{ - [self.commandDelegate runInBackground:^ { - - NSLog(@"Push Plugin register called"); - self.callbackId = command.callbackId; - - NSMutableDictionary* options = [command.arguments objectAtIndex:0]; - NSMutableDictionary* iosOptions = [options objectForKey:@"ios"]; - -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - UIUserNotificationType UserNotificationTypes = UIUserNotificationTypeNone; -#endif - UIRemoteNotificationType notificationTypes = UIRemoteNotificationTypeNone; - - id badgeArg = [iosOptions objectForKey:@"badge"]; - id soundArg = [iosOptions objectForKey:@"sound"]; - id alertArg = [iosOptions objectForKey:@"alert"]; - id clearBadgeArg = [iosOptions objectForKey:@"clearBadge"]; - - if (([badgeArg isKindOfClass:[NSString class]] && [badgeArg isEqualToString:@"true"]) || [badgeArg boolValue]) - { - notificationTypes |= UIRemoteNotificationTypeBadge; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - UserNotificationTypes |= UIUserNotificationTypeBadge; -#endif - } - - if (([soundArg isKindOfClass:[NSString class]] && [soundArg isEqualToString:@"true"]) || [soundArg boolValue]) - { - notificationTypes |= UIRemoteNotificationTypeSound; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - UserNotificationTypes |= UIUserNotificationTypeSound; -#endif - } - - if (([alertArg isKindOfClass:[NSString class]] && [alertArg isEqualToString:@"true"]) || [alertArg boolValue]) - { - notificationTypes |= UIRemoteNotificationTypeAlert; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - UserNotificationTypes |= UIUserNotificationTypeAlert; -#endif - } - - notificationTypes |= UIRemoteNotificationTypeNewsstandContentAvailability; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - UserNotificationTypes |= UIUserNotificationActivationModeBackground; -#endif - - if (clearBadgeArg == nil || ([clearBadgeArg isKindOfClass:[NSString class]] && [clearBadgeArg isEqualToString:@"false"]) || ![clearBadgeArg boolValue]) { - NSLog(@"PushPlugin.register: setting badge to false"); - clearBadge = NO; - } else { - NSLog(@"PushPlugin.register: setting badge to true"); - clearBadge = YES; - [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; - } - NSLog(@"PushPlugin.register: clear badge is set to %d", clearBadge); - - if (notificationTypes == UIRemoteNotificationTypeNone) - NSLog(@"PushPlugin.register: Push notification type is set to none"); - - isInline = NO; - -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - if ([[UIApplication sharedApplication]respondsToSelector:@selector(registerUserNotificationSettings:)]) { - UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UserNotificationTypes categories:nil]; - [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; - [[UIApplication sharedApplication] registerForRemoteNotifications]; - } else { - [[UIApplication sharedApplication] registerForRemoteNotificationTypes: - (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; - } -#else - [[UIApplication sharedApplication] registerForRemoteNotificationTypes: - (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; -#endif - - if (notificationMessage) // if there is a pending startup notification - [self notificationReceived]; // go ahead and process it - - }]; -} - -- (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - if (self.callbackId == nil) { - NSLog(@"Unexpected call to didRegisterForRemoteNotificationsWithDeviceToken, ignoring: %@", deviceToken); - return; - } - NSLog(@"Push Plugin register success: %@", deviceToken); - - NSMutableDictionary *results = [NSMutableDictionary dictionary]; - NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"withString:@""] - stringByReplacingOccurrencesOfString:@">" withString:@""] - stringByReplacingOccurrencesOfString: @" " withString: @""]; - [results setValue:token forKey:@"deviceToken"]; - -#if !TARGET_IPHONE_SIMULATOR - // Get Bundle Info for Remote Registration (handy if you have more than one app) - [results setValue:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"] forKey:@"appName"]; - [results setValue:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] forKey:@"appVersion"]; - - // Check what Notifications the user has turned on. We registered for all three, but they may have manually disabled some or all of them. -#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) - - NSUInteger rntypes; - if (!SYSTEM_VERSION_LESS_THAN(@"8.0")) { - rntypes = [[[UIApplication sharedApplication] currentUserNotificationSettings] types]; - } else { - rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; - } - - // Set the defaults to disabled unless we find otherwise... - NSString *pushBadge = @"disabled"; - NSString *pushAlert = @"disabled"; - NSString *pushSound = @"disabled"; - - // Check what Registered Types are turned on. This is a bit tricky since if two are enabled, and one is off, it will return a number 2... not telling you which - // one is actually disabled. So we are literally checking to see if rnTypes matches what is turned on, instead of by number. The "tricky" part is that the - // single notification types will only match if they are the ONLY one enabled. Likewise, when we are checking for a pair of notifications, it will only be - // true if those two notifications are on. This is why the code is written this way - if(rntypes & UIRemoteNotificationTypeBadge){ - pushBadge = @"enabled"; - } - if(rntypes & UIRemoteNotificationTypeAlert) { - pushAlert = @"enabled"; - } - if(rntypes & UIRemoteNotificationTypeSound) { - pushSound = @"enabled"; - } - - [results setValue:pushBadge forKey:@"pushBadge"]; - [results setValue:pushAlert forKey:@"pushAlert"]; - [results setValue:pushSound forKey:@"pushSound"]; - - // Get the users Device Model, Display Name, Token & Version Number - UIDevice *dev = [UIDevice currentDevice]; - [results setValue:dev.name forKey:@"deviceName"]; - [results setValue:dev.model forKey:@"deviceModel"]; - [results setValue:dev.systemVersion forKey:@"deviceSystemVersion"]; - - // Send result to trigger 'registration' event but keep callback - NSMutableDictionary* message = [NSMutableDictionary dictionaryWithCapacity:1]; - [message setObject:token forKey:@"registrationId"]; - CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:message]; - [pluginResult setKeepCallbackAsBool:YES]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId]; -#endif -} - -- (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error -{ - if (self.callbackId == nil) { - NSLog(@"Unexpected call to didFailToRegisterForRemoteNotificationsWithError, ignoring: %@", error); - return; - } - NSLog(@"Push Plugin register failed"); - [self failWithMessage:@"" withError:error]; -} - -- (void)notificationReceived { - NSLog(@"Notification received"); - - if (notificationMessage && self.callbackId != nil) - { - NSMutableDictionary* message = [NSMutableDictionary dictionaryWithCapacity:4]; - NSMutableDictionary* additionalData = [NSMutableDictionary dictionaryWithCapacity:4]; - - - for (id key in notificationMessage) { - if ([key isEqualToString:@"aps"]) { - id aps = [notificationMessage objectForKey:@"aps"]; - - for(id key in aps) { - NSLog(@"Push Plugin key: %@", key); - id value = [aps objectForKey:key]; - - if ([key isEqualToString:@"alert"]) { - if ([value isKindOfClass:[NSDictionary class]]) { - for (id messageKey in value) { - id messageValue = [value objectForKey:messageKey]; - if ([messageKey isEqualToString:@"body"]) { - [message setObject:messageValue forKey:@"message"]; - } else if ([messageKey isEqualToString:@"title"]) { - [message setObject:messageValue forKey:@"title"]; - } else { - [additionalData setObject:messageValue forKey:messageKey]; - } - } - } - else { - [message setObject:value forKey:@"message"]; - } - } else if ([key isEqualToString:@"title"]) { - [message setObject:value forKey:@"title"]; - } else if ([key isEqualToString:@"badge"]) { - [message setObject:value forKey:@"count"]; - } else if ([key isEqualToString:@"sound"]) { - [message setObject:value forKey:@"sound"]; - } else if ([key isEqualToString:@"image"]) { - [message setObject:value forKey:@"image"]; - } else { - [additionalData setObject:value forKey:key]; - } - } - } else { - [additionalData setObject:[notificationMessage objectForKey:key] forKey:key]; - } - } - - if (isInline) { - [additionalData setObject:[NSNumber numberWithBool:YES] forKey:@"foreground"]; - } else { - [additionalData setObject:[NSNumber numberWithBool:NO] forKey:@"foreground"]; - } - - [message setObject:additionalData forKey:@"additionalData"]; - - // send notification message - CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:message]; - [pluginResult setKeepCallbackAsBool:YES]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId]; - - self.notificationMessage = nil; - } -} - -- (void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command -{ - NSMutableDictionary* options = [command.arguments objectAtIndex:0]; - int badge = [[options objectForKey:@"badge"] intValue] ?: 0; - - [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badge]; - - NSString* message = [NSString stringWithFormat:@"app badge count set to %d", badge]; - CDVPluginResult *commandResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message]; - [self.commandDelegate sendPluginResult:commandResult callbackId:command.callbackId]; -} - -- (void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command -{ - NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber; - - CDVPluginResult *commandResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(int)badge]; - [self.commandDelegate sendPluginResult:commandResult callbackId:command.callbackId]; -} - --(void)successWithMessage:(NSString *)message -{ - if (self.callbackId != nil) - { - CDVPluginResult *commandResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message]; - [self.commandDelegate sendPluginResult:commandResult callbackId:self.callbackId]; - } -} - --(void)failWithMessage:(NSString *)message withError:(NSError *)error -{ - NSString *errorMessage = (error) ? [NSString stringWithFormat:@"%@ - %@", message, [error localizedDescription]] : message; - CDVPluginResult *commandResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:errorMessage]; - - [self.commandDelegate sendPluginResult:commandResult callbackId:self.callbackId]; -} - --(void) finish:(CDVInvokedUrlCommand*)command -{ - NSLog(@"Push Plugin finish called"); - - [self.commandDelegate runInBackground:^ { - UIApplication *app = [UIApplication sharedApplication]; - float finishTimer = (app.backgroundTimeRemaining > 20.0) ? 20.0 : app.backgroundTimeRemaining; - - [NSTimer scheduledTimerWithTimeInterval:finishTimer - target:self - selector:@selector(stopBackgroundTask:) - userInfo:nil - repeats:NO]; - - CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; - }]; -} - --(void)stopBackgroundTask:(NSTimer*)timer -{ - UIApplication *app = [UIApplication sharedApplication]; - - NSLog(@"Push Plugin stopBackgroundTask called"); - - if (handlerObj) { - NSLog(@"Push Plugin handlerObj"); - completionHandler = [handlerObj[@"handler"] copy]; - if (completionHandler) { - NSLog(@"Push Plugin: stopBackgroundTask (remaining t: %f)", app.backgroundTimeRemaining); - completionHandler(UIBackgroundFetchResultNewData); - completionHandler = nil; - } - } -} - -@end diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js b/StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js deleted file mode 100755 index ca8087b2..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js +++ /dev/null @@ -1,86 +0,0 @@ -var myApp = {}; -var pushNotifications = Windows.Networking.PushNotifications; - -var createNotificationJSON = function (e) { - var result = { message: '' }; //Added to identify callback as notification type in the API in case where notification has no message - var notificationPayload; - - switch (e.notificationType) { - case pushNotifications.PushNotificationType.toast: - case pushNotifications.PushNotificationType.tile: - if (e.notificationType === pushNotifications.PushNotificationType.toast) { - notificationPayload = e.toastNotification.content; - } - else { - notificationPayload = e.tileNotification.content; - } - var texts = notificationPayload.getElementsByTagName("text"); - if (texts.length > 1) { - result.title = texts[0].innerText; - result.message = texts[1].innerText; - } - else if(texts.length === 1) { - result.message = texts[0].innerText; - } - var images = notificationPayload.getElementsByTagName("image"); - if (images.length > 0) { - result.image = images[0].getAttribute("src"); - } - var soundFile = notificationPayload.getElementsByTagName("audio"); - if (soundFile.length > 0) { - result.sound = soundFile[0].getAttribute("src"); - } - break; - - case pushNotifications.PushNotificationType.badge: - notificationPayload = e.badgeNotification.content; - result.count = notificationPayload.getElementsByTagName("badge")[0].getAttribute("value"); - break; - - case pushNotifications.PushNotificationType.raw: - result.message = e.rawNotification.content; - break; - } - - result.additionalData = {}; - result.additionalData.pushNotificationReceivedEventArgs = e; - return result; -} - -module.exports = { - init: function (onSuccess, onFail, args) { - - var onNotificationReceived = function (e) { - var result = createNotificationJSON(e); - onSuccess(result, { keepCallback: true }); - } - - try { - pushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync().done( - function (channel) { - var result = {}; - result.registrationId = channel.uri; - myApp.channel = channel; - channel.addEventListener("pushnotificationreceived", onNotificationReceived); - myApp.notificationEvent = onNotificationReceived; - onSuccess(result, { keepCallback: true }); - }, function (error) { - onFail(error); - }); - } catch (ex) { - onFail(ex); - } - }, - unregister: function (onSuccess, onFail, args) { - try { - myApp.channel.removeEventListener("pushnotificationreceived", myApp.notificationEvent); - myApp.channel.close(); - onSuccess(); - } catch(ex) { - onFail(ex); - } - } -}; -require("cordova/exec/proxy").add("PushNotification", module.exports); - - diff --git a/StoneIsland/plugins/phonegap-plugin-push/www/push.js b/StoneIsland/plugins/phonegap-plugin-push/www/push.js deleted file mode 100755 index 043532b9..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/www/push.js +++ /dev/null @@ -1,230 +0,0 @@ -/* global cordova:false */ - -/*! - * Module dependencies. - */ - -var exec = cordova.require('cordova/exec'); - -/** - * PushNotification constructor. - * - * @param {Object} options to initiate Push Notifications. - * @return {PushNotification} instance that can be monitored and cancelled. - */ - -var PushNotification = function(options) { - this._handlers = { - 'registration': [], - 'notification': [], - 'error': [] - }; - - // require options parameter - if (typeof options === 'undefined') { - throw new Error('The options argument is required.'); - } - - // store the options to this object instance - this.options = options; - - // triggered on registration and notification - var that = this; - var success = function(result) { - if (result && typeof result.registrationId !== 'undefined') { - that.emit('registration', result); - } else if (result && typeof result.callback !== 'undefined') { - var executeFunctionByName = function(functionName, context /*, args */) { - var args = Array.prototype.slice.call(arguments, 2); - var namespaces = functionName.split("."); - var func = namespaces.pop(); - for (var i = 0; i < namespaces.length; i++) { - context = context[namespaces[i]]; - } - return context[func].apply(context, args); - } - - executeFunctionByName(result.callback, window, result); - } else if (result) { - that.emit('notification', result); - } - }; - - // triggered on error - var fail = function(msg) { - var e = (typeof msg === 'string') ? new Error(msg) : msg; - that.emit('error', e); - }; - - // wait at least one process tick to allow event subscriptions - setTimeout(function() { - exec(success, fail, 'PushNotification', 'init', [options]); - }, 10); -}; - -/** - * Unregister from push notifications - */ - -PushNotification.prototype.unregister = function(successCallback, errorCallback, options) { - if (errorCallback == null) { errorCallback = function() {}} - - if (typeof errorCallback != "function") { - console.log("PushNotification.unregister failure: failure parameter not a function"); - return - } - - if (typeof successCallback != "function") { - console.log("PushNotification.unregister failure: success callback parameter must be a function"); - return - } - - exec(successCallback, errorCallback, "PushNotification", "unregister", [options]); -}; - -/** - * Call this to set the application icon badge - */ - -PushNotification.prototype.setApplicationIconBadgeNumber = function(successCallback, errorCallback, badge) { - if (errorCallback == null) { errorCallback = function() {}} - - if (typeof errorCallback != "function") { - console.log("PushNotification.setApplicationIconBadgeNumber failure: failure parameter not a function"); - return - } - - if (typeof successCallback != "function") { - console.log("PushNotification.setApplicationIconBadgeNumber failure: success callback parameter must be a function"); - return - } - - exec(successCallback, errorCallback, "PushNotification", "setApplicationIconBadgeNumber", [{badge: badge}]); -}; - -/** - * Get the application icon badge - */ - -PushNotification.prototype.getApplicationIconBadgeNumber = function(successCallback, errorCallback) { - if (errorCallback == null) { errorCallback = function() {}} - - if (typeof errorCallback != "function") { - console.log("PushNotification.getApplicationIconBadgeNumber failure: failure parameter not a function"); - return - } - - if (typeof successCallback != "function") { - console.log("PushNotification.getApplicationIconBadgeNumber failure: success callback parameter must be a function"); - return - } - - exec(successCallback, errorCallback, "PushNotification", "getApplicationIconBadgeNumber", []); -}; - -/** - * Listen for an event. - * - * The following events are supported: - * - * - registration - * - notification - * - error - * - * @param {String} eventName to subscribe to. - * @param {Function} callback triggered on the event. - */ - -PushNotification.prototype.on = function(eventName, callback) { - if (this._handlers.hasOwnProperty(eventName)) { - this._handlers[eventName].push(callback); - } -}; - -/** - * Remove event listener. - * - * @param {String} eventName to match subscription. - * @param {Function} handle function associated with event. - */ - -PushNotification.prototype.off = function (eventName, handle) { - if (this._handlers.hasOwnProperty(eventName)) { - var handleIndex = this._handlers[eventName].indexOf(handle); - if (handleIndex >= 0) - this._handlers[eventName].splice(handleIndex, 1); - } -}; - -/** - * Emit an event. - * - * This is intended for internal use only. - * - * @param {String} eventName is the event to trigger. - * @param {*} all arguments are passed to the event listeners. - * - * @return {Boolean} is true when the event is triggered otherwise false. - */ - -PushNotification.prototype.emit = function() { - var args = Array.prototype.slice.call(arguments); - var eventName = args.shift(); - - if (!this._handlers.hasOwnProperty(eventName)) { - return false; - } - - for (var i = 0, length = this._handlers[eventName].length; i < length; i++) { - this._handlers[eventName][i].apply(undefined,args); - } - - return true; -}; - -PushNotification.prototype.finish = function(successCallback, errorCallback) { - if (successCallback == null) { successCallback = function() {}} - if (errorCallback == null) { errorCallback = function() {}} - - if (typeof successCallback != "function") { - console.log("finish failure: success callback parameter must be a function"); - return - } - - if (typeof errorCallback != "function") { - console.log("finish failure: failure parameter not a function"); - return - } - - exec(successCallback, errorCallback, 'PushNotification', 'finish', []); -} - -/*! - * Push Notification Plugin. - */ - -module.exports = { - /** - * Register for Push Notifications. - * - * This method will instantiate a new copy of the PushNotification object - * and start the registration process. - * - * @param {Object} options - * @return {PushNotification} instance - */ - - init: function(options) { - return new PushNotification(options); - }, - - /** - * PushNotification Object. - * - * Expose the PushNotification object for direct use - * and testing. Typically, you should use the - * .init helper method. - */ - - PushNotification: PushNotification -};
\ No newline at end of file |
