Commit f861c5d9 by 左计刚

补充文件上传

parent 2de2e889
Pod::Spec.new do |s|
s.name = 'ZDDR'
s.version = '1.0.0'
s.summary = '测试 Framework'
s.homepage = 'http://39.98.116.222:30006/aidr-sdk/aidr-sdk-ios'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'ZuoJiGang' => '365257510@qq.com' }
s.source = { :git => 'http://39.98.116.222:30006/aidr-sdk/aidr-sdk-ios.git', :tag => s.version }
s.platform = :ios
s.ios.deployment_target = '9.0'
s.swift_version = '4.0'
# 依赖库
s.dependency 'AFNetworking'
end
//
// UIZZDRView.h
// ZDDR
//
// Created by 左计刚 on 2022/1/19.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIZZDRView : UIView
- (instancetype)initWithFrame:(CGRect)frame;
@end
NS_ASSUME_NONNULL_END
//
// ZDDR.h
// ZDDR
//
// Created by 左计刚 on 2022/1/19.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
//! Project version number for SDKHeader.
FOUNDATION_EXPORT double ZDDRVersionNumber;
//! Project version string for MyFrameWork.
FOUNDATION_EXPORT const unsigned char ZDDRVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <SDKHeader/PublicHeader.h>
#import <ZDDR/ZDDRInit.h>
#import <ZDDR/UIZZDRView.h>
//
// ZDDRInit.h
// ZDDR
//
// Created by 左计刚 on 2022/1/20.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface ZDDRInit : NSObject
- (BOOL)applicationDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
@end
NS_ASSUME_NONNULL_END
/*
MGFaceDetection.strings
MegLiveDemo
Created by Megvii on 2017/5/26.
Copyright © 2017Year megvii. All rights reserved.
*/
//"face_check_error1" = "Keep your phone vertically";
//"face_check_error2" = "Face not found";
//"face_check_error3" = "Face not found";
//"face_check_error4" = "Face not found";
//"face_check_error5" = "Face too dark";
//"face_check_error6" = "Face too bright";
//"face_check_error7" = "Face too small";
//"face_check_error8" = "Face too large";
//"face_check_error9" = "Please avoid side light or backlight";
//"face_check_error10" = "Face out of rect";
//"face_check_error11" = "Keep the pose";
//"face_check_error12" = "Show me your eyes";
//"face_check_error13" = "Show me your mouth";
//
//"face_check_title" = "Finish";
//"face_check_title1" = "Keep your face in the frame";
//"face_check_title2" = "Keep the pose";
//"face_check_title3" = "Detect finish";
//
//"face_check_eye" = "Blink";
//"face_check_mouse" = "Open your mouth";
//"face_check_header_3" = "Shake your head";
//"face_check_header_1" = "Node your head";
"face_check_error1" = "请垂直握紧设备";
"face_check_error2" = "请让我看到您的正脸";
"face_check_error3" = "请让我看到您的正脸";
"face_check_error4" = "请让我看到您的正脸";
"face_check_error5" = "请让光线再亮点";
"face_check_error6" = "请让光线再暗点";
"face_check_error7" = "请再靠近一些";
"face_check_error8" = "请距离屏幕远一些";
"face_check_error9" = "请避免侧光和背光";
"face_check_error10" = "请将正脸置于取景框内";
"face_check_error11" = "没问题,请保持";
"face_check_error12" = "请勿遮挡眼睛";
"face_check_error13" = "请勿遮挡嘴";
"face_check_title" = "完成";
"face_check_title1" = "请将正脸置于取景框内";
"face_check_title2" = "没问题,请保持";
"face_check_title3" = "检测完成";
"face_check_eye" = "眨眼";
"face_check_mouse" = "张嘴";
"face_check_header_3" = "左右转头";
"face_check_header_1" = "上下点头";
/*
MGFaceDetection.strings
MegLiveDemo
Created by Megvii on 2017/5/26.
Copyright © 2017Year megvii. All rights reserved.
*/
"face_check_error1" = "请垂直握紧设备";
"face_check_error2" = "请让我看到您的正脸";
"face_check_error3" = "请让我看到您的正脸";
"face_check_error4" = "请让我看到您的正脸";
"face_check_error5" = "请让光线再亮点";
"face_check_error6" = "请让光线再暗点";
"face_check_error7" = "请再靠近一些";
"face_check_error8" = "请距离屏幕远一些";
"face_check_error9" = "请避免侧光和背光";
"face_check_error10" = "请将正脸置于取景框内";
"face_check_error11" = "没问题,请保持";
"face_check_error12" = "请勿遮挡眼睛";
"face_check_error13" = "请勿遮挡嘴";
"face_check_title" = "完成";
"face_check_title1" = "请将正脸置于取景框内";
"face_check_title2" = "没问题,请保持";
"face_check_title3" = "检测完成";
"face_check_eye" = "眨眼";
"face_check_mouse" = "张嘴";
"face_check_header_3" = "左右转头";
"face_check_header_1" = "上下点头";
framework module ZDDR {
umbrella header "ZDDR.h"
export *
module * { export * }
}
Purpose
--------------
XMLDictionary is a class designed to simplify parsing and generating of XML on iOS and Mac OS. XMLDictionary is built on top of the NSXMLParser classes, but behaves more like a DOM-style parser rather than SAX parser, in that it creates a tree of objects rather than generating events at the start and end of each node.
Unlike other DOM parsers, XMLDictionary does not attempt to replicate all of the nuances of the XML standard such as the ability to nest tags within text. If you need to represent something like an HTML document then XMLDictionary won't work for you. If you want to use XML as a data interchange format for passing nested data structures then XMLDictionary may well provide a simpler solution than other DOM-based parsers.
Supported OS & SDK Versions
-----------------------------
* Supported build target - iOS 7.1 / Mac OS 10.9 (Xcode 5.1, Apple LLVM compiler 5.1)
* Earliest supported deployment target - iOS 5.0 / Mac OS 10.7
* Earliest compatible deployment target - iOS 4.3 / Mac OS 10.6
NOTE: 'Supported' means that the library has been tested with this version. 'Compatible' means that the library should work on this OS version (i.e. it doesn't rely on any unavailable SDK features) but is no longer being tested for compatibility and may require tweaking or bug fixes to run correctly.
ARC Compatibility
------------------
As of version 1.1, XMLDictionary requires ARC. If you wish to use XMLDictionary in a non-ARC project, just add the -fobjc-arc compiler flag to the XMLDictionary.m class. To do this, go to the Build Phases tab in your target settings, open the Compile Sources group, double-click XMLDictionary.m in the list and type -fobjc-arc into the popover.
If you wish to convert your whole project to ARC, comment out the #error line in XMLDictionary.m, then run the Edit > Refactor > Convert to Objective-C ARC... tool in Xcode and make sure all files that you wish to use ARC for (including XMLDictionary.m) are checked.
Thread Safety
--------------
XMLDictionary's methods should all be thread safe. It is safe to use multiple XMLDictionaryParsers concurrently on different threads, but it is not safe to call the same parser concurrently on multiple threads.
Installation
--------------
To use the XMLDictionary in an app, just drag the class files into your project.
XMLDictionaryParser
---------------------
The XMLDictionaryParser class is responsible for parsing an XML file into a dictionary. You don't normally need to use this class explicitly as you can just use the utility methods added to NSDictionary, however it can be useful if you want to modify the default parser settings.
You can create new instances of XMLDictionaryParser if you need to use multiple different settings for different dictionaries. Once you have created an XMLDictionaryParser you can use the following methods to parse XML files using that specific parser instance:
- (NSDictionary *)dictionaryWithData:(NSData *)data;
- (NSDictionary *)dictionaryWithString:(NSString *)string;
- (NSDictionary *)dictionaryWithFile:(NSString *)path;
- (NSDictionary *)dictionaryWithParser:(NSXMLParser *)parser;
Alternatively, you can simply modify the settings of `[XMLDictionaryParser sharedInstance]` to affect the settings for all dictionaries parsed subsequently using the NSDictionary category extension methods.
Use the following properties to tweak the parsing behaviour:
@property (nonatomic, assign) BOOL collapseTextNodes;
If YES (the default value), tags that contain only text and have no children, attributes or comments will be collapsed into a single string object, simplifying traversal of the object tree.
@property (nonatomic, assign) BOOL stripEmptyNodes;
If YES (the default value), tags that are empty (have no children, attributes, text or comments) will be stripped.
@property (nonatomic, assign) BOOL trimWhiteSpace;
If YES (the default value), leading and trailing white space will be trimmed from text nodes, and text nodes containing only white space will be omitted from the dictionary.
@property (nonatomic, assign) BOOL alwaysUseArrays;
If `YES`, the every child node will be represented as an array, even if there is only one of them. This simplifies the logic needed to cope with properties that may be duplicated because you don't need to use `[value isKindOfClass:[NSArray class]]` to check the for the singular case. Defaults to `NO`.
@property (nonatomic, assign) BOOL preserveComments;
If `YES`, XML comments will be grouped into an array under the key `__comments` and can be accessed via the `comments` method. Defaults to `NO`.
@property (nonatomic, assign) XMLDictionaryAttributesMode attributesMode;
This property controls how XML attributes are handled. The default is `XMLDictionaryAttributesModePrefixed` meaning that attributes will be included in the dictionary, with an _ (underscore) prefix to avoid namespace collisions. Alternative values are `XMLDictionaryAttributesModeDictionary`, which will place all the attributes in a separate dictionary, `XMLDictionaryAttributesModeUnprefixed`, which includes the attributes without prefix (which may cause collisions with nodes) and `XMLDictionaryAttributesModeDiscard`, which will strip the attributes.
@property (nonatomic, assign) XMLDictionaryNodeNameMode nodeNameMode;
This property controls how the node name is handled. The default value is `XMLDictionaryNodeNameModeRootOnly`, meaning that the node name will only be included in the root dictionary (the names for the children can be inferred from the dictionary keys, but the `nodeName` method won't work for anything except the root node). Alternative values are `XMLDictionaryNodeNameModeAlways`, meaning that the node name will be included in the dictionary with the key `__name` (and can be accessed using the `nodeName`) method, or `XMLDictionaryNodeNameModeNever` which will never include the `__name' key.
Category Methods
-----------------
XMLDictionary extends NSDictionary with the following methods:
+ (NSDictionary *)dictionaryWithXMLParser:(NSParser *)parser;
Create a new NSDictionary object from an existing NSXMLParser. Useful if fetching data through AFNetworking.
+ (NSDictionary *)dictionaryWithXMLData:(NSData *)data;
Create a new NSDictionary object from XML-encoded data.
+ (NSDictionary *)dictionaryWithXMLString:(NSString *)string;
Create a new NSDictionary object from XML-encoded string.
+ (NSDictionary *)dictionaryWithXMLFile:(NSString *)path;
Create a new NSDictionary object from and XML-encoded file.
- (NSString *)attributeForKey:(NSString *)key;
Get the XML attribute for a given key (key name should not include prefix).
- (NSDictionary *)attributes;
Get a dictionary of all XML attributes for a given node's dictionary. If the node has no attributes then this will return nil.
- (NSDictionary *)childNodes;
Get a dictionary of all child nodes for a given node's dictionary. If multiple nodes have the same name they will be grouped into an array. If the node has no children then this will return nil.
- (NSArray *)comments;
Get an array of all comments for a given node. Note that the nesting relative to other nodes is not preserved. If the node has no comments then this will return nil.
- (NSString *)nodeName;
Get the name of the node. If the name is not known this will return nil.
- (NSString *)innerText;
Get the text content of the node. If the node has no text content, this will return nil;
- (NSString *)innerXML;
Get the contents of the node as an XML-encoded string. This XML string will not include the container node itself.
- (NSString *)XMLString;
Get the node and its content as an XML-encoded string. If the node name is not known, the top level tag will be called `<root>`.
- (NSArray *)arrayValueForKeyPath:(NSString *)keyPath;
Works just like `valueForKeyPath:` except that the value returned will always be an array. So if there is only a single value, it will be returned as `@[value]`.
- (NSString *)stringValueForKeyPath:(NSString *)keyPath;
Works just like `valueForKeyPath:` except that the value returned will always be a string. So if the value is a dictionary, the text value of `innerText` will be returned, and if the value is an array, the first item will be returned.
- (NSDictionary *)dictionaryValueForKeyPath:(NSString *)keyPath;
Works just like `valueForKeyPath:` except that the value returned will always be a dictionary. So if the collapseTextNodes option is enabled and the value is a string, this will convert it back to a dictionary before returning, and if the value is an array, the first item will be returned.
Usage
--------
The simplest way to load an XML file is as follows:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"xml"];
NSDictionary *xmlDoc = [NSDictionary dictionaryWithXMLFile:filePath];
You can then iterate over the dictionary as you would with any other object tree, e.g. one loaded from a Plist.
To access nested nodes and attributes, you can use the valueForKeyPath syntax. For example to get the string value of `<foo>` from the following XML:
<root>
<bar cliche="true">
<foo>Hello World</foo>
</bar>
<banjo>Was his name-oh</banjo>
</root>
You would write:
NSString *foo = [xmlDoc valueForKeyPath:@"bar.foo"];
The above examples assumes that you are using the default setting for `collapseTextNodes` and `alwaysUseArrays`. If `collapseTextNodes` is disabled then you would instead access `<foo>`'s value by writing:
NSString *foo = [[xmlDoc valueForKeyPath:@"bar.foo"] innerText];
If the `alwaysUseArrays` option is enabled then would use one of the following, depending on the `collapseTextNodes` property:
NSString *foo = [[xmlDoc valueForKeyPath:@"bar.foo"] firstObject];
NSString *foo = [[[xmlDoc valueForKeyPath:@"bar.foo"] firstObject] innerText];
To get the cliche attribute of `bar`, you could write:
NSString *barCliche = [xmlDoc[@"bar] attributes][@"cliche"];
If the `attributesMode` is set to the default value of `XMLDictionaryAttributesModePrefixed` then you can also do this:
NSString *barCliche = [xmlDoc valueForKeyPath:@"bar._cliche"];
Or if it is set to `XMLDictionaryAttributesModeUnprefixed` you would simply do this:
NSString *barCliche = [xmlDoc valueForKeyPath:@"bar.cliche"];
Release Notes
----------------
Version 1.4
- Added dictionaryWithXMLParser: constructor method
- Added wrapRootNode option as a nicer way to preserve root node name
- No longer crashes if non-string values are used as keys or attributes
- Now complies with the -Weverything warning level
Version 1.3
- added stripEmptyNodes property (defaults to YES)
- added arrayValueForKeyPath, stringValueForKeyPath and dictionaryValueForKeyPath methods to simplify working with data
Version 1.2.2
- sharedInstance method no longer returns a new instance each time
Version 1.2.1
- Removed isa reference, deprecated in iOS 7
Version 1.2
- Exposed XMLDictionaryParser object, which can be used to configure the parser
- Parsing options can now be changed without modifying the library
- Added option to always encode properties as arrays
- `__name` and `__coment` keys are no longer included by default
- Apostrophe is now encoded as `&apos;`
- removed `attributeForKey:` method
Version 1.1
- Updated to use ARC
- Added podspec
Version 1.0
- Initial release
========================================================================
CONSOLE APPLICATION : sm2 Project Overview
========================================================================
AppWizard has created this sm2 application for you.
This file contains a summary of what you will find in each of the files that
make up your sm2 application.
sm2.vcxproj
This is the main project file for VC++ projects generated using an Application Wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
Application Wizard.
sm2.vcxproj.filters
This is the filters file for VC++ projects generated using an Application Wizard.
It contains information about the association between the files in your project
and the filters. This association is used in the IDE to show grouping of files with
similar extensions under a specific node (for e.g. ".cpp" files are associated with the
"Source Files" filter).
sm2.cpp
This is the main application source file.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named sm2.pch and a precompiled types file named StdAfx.obj.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" comments to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Group</string>
</dict>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>Name</string>
<key>Key</key>
<string>name_preference</string>
<key>DefaultValue</key>
<string></string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>Alphabet</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Enabled</string>
<key>Key</key>
<string>enabled_preference</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSSliderSpecifier</string>
<key>Key</key>
<string>slider_preference</string>
<key>DefaultValue</key>
<real>0.5</real>
<key>MinimumValue</key>
<integer>0</integer>
<key>MaximumValue</key>
<integer>1</integer>
<key>MinimumValueImage</key>
<string></string>
<key>MaximumValueImage</key>
<string></string>
</dict>
</array>
</dict>
</plist>
/*
Localizable.strings
SocialSDK
Created by yeahugo on 13-6-17.
Copyright (c) 2013年 Umeng. All rights reserved.
*/
"button_cancel" = "Cancel";
"button_ok" = "OK";
"button_start" = "Start";
"button_close" = "Close";
"button_back" = "Back";
"button_refresh" = "Refresh";
"label_request_account" = "Getting account data, please wait……";
"oauth_title" = "Authorization";
"oauth_text" = "Connecting to authorization web, please wait……";
"oauth_follow" = "Follow official micro-blog";
"mask_text" = "please wait……";
"oauth_error_title" = "authorise failed";
"oauth_error_message" = "authorise failed, you can try again later";
"oauth_error_not_approved" = "authorise failed, for your app haven't approved or you haven't add your weibo uid to test accounts";
"shareQQ_error" = "Error";
"shareQQ_notInstall" = "Mobile QQ havn't be installed in your device";
"shareQQ_openFail" = "Open Mobile QQ fail";
"shareQQ_ShareFail" = "Share To QQ fail";
"shareInstagram_openFail" = "Open Instagram fail";
"shareClient_notInstall" = "Client not installed in your device";
"custom_share_title" = "UMeng share";
"shareList_title" = "Share To";
"shareEdit_title" = "Share To ";
"shareEdit_post" = "Post";
"shareEdit_change_account" = "Change Account";
"shareEdit_post_finish" = "Post Finished";
"shareEdit_post_fail" = "Post Failed";
"shareEdit_posting" = "Posting";
"shareEdit_delete_picture" = "Delete Picture";
"shareEdit_delete_video" = "Delete Video";
"shareEdit_delete_music" = "Delete Music";
"shareEdit_error_not_empty" = "Post content can not be empty";
"shareEdit_error_too_long" = "Post content's length too long";
"shareEdit_error_auth_expired" = "Post failed, for authorization expired";
"shareEdit_error_auth_again" = "authorize again";
"shareEdit_error_text_repeated" = "Text repeated";
"shareEdit_error_user_baned" = "Sorry, you have been banned";
"shareEdit_error_fail" = "Share fail";
"shareEdit_error_no_auth" = "Share fail, for no upload picture authority";
"shareEdit_error_empty_content" = "Share fail, for the content is empty";
"shareEdit_addFollow" = "Follow weibo";
"shareEdit_C" = "符";
"shareEdit_used" = "常";
"shareShake_button" = "Share";
"share_wechat" = "Share to Wechat";
"share_wechat_friend" = "Share to Wechat Friend";
"share_wechat_moments" = "Share to Wechat Moments";
"share_wechat_no_title" = "No Wechat";
"share_wechat_no_message" = "Wechat haven't been install in your device";
"share_facebook_not_login" = "No login Account";
"share_facebook_not_login_message" = "Your account haven't login";
"share_facebook_no_osSupport" = "iOS doesn't support";
"share_facebook_no_osSupport_message" = "The version of your iOS device doesn't support share the that media";
"share_ap" = "Share to APShare";
"share_ap_friend" = "Share to APShare friends";
"share_ap_moments" = "Share to APShare Timeline";
"share_ap_no_title" = "No AP";
"share_ap_no_message" = "AP not installed in device";
"share_ap_version_not_supported" = "The version of AP not supported.";
"share_sms_no_osSupport" = "No SMS";
"share_sms_no_osSupport_message" = "The device doesn't support SMS";
"share_email_no_osSupport" = "No email";
"share_email_no_osSupport_message" = "Your email service have been turned off, please turn it on before you share your email";
"login_title" = "Login";
"login_as_tourists" = "Login as tourists";
"login_choose" = "choose your available account";
"commentList_title" = "Comment List";
"commentList_mask_text" = "Requesting comments, please wait……";
"commentList_comment_here" = "Comment here";
"commentDetail_title" = "Detail";
"commentEdit_no_location" = "No Location";
"commentEdit_post_fail" = "Post comment fail";
"commentEdit_post_success" = "Post comment success";
"commentEdit_noLocation_title" = "Location service have been turned off";
"commentEdit_noLocation_message" = "Your device's location service have been turned off, please turn on it before you share your location";
"commentEdit_title" = "New Comment";
"commentEdit_wait" = "Please wait";
"ego_pull_down" = "Pull down, refresh";
"ego_refresh" = "Loose to refresh";
"ego_load_more" = "Loose to load more";
"ego_pull_up" = "Pull up, load more";
"ego_refreshing" = "Refreshing";
"ego_loading_more" = "Loading more";
"loading" = "Loading";
"shareEdit_error_network_fail_message" = "Network Error";
"network_fail_title" = "Network Error";
"network_fail_message" = "The network state of your device is not available.";
"account_title" = "User Center";
"account_title_authorize_status" = "authorize status";
"account_label_login_tourist" = "login as tourist";
"account_label_login_account" = "login account";
"account_lable_not_auth" = "not authorized";
"account_lable_have_auth" = "authorized";
"account_title_sns_config" = "sns accounts";
//分享面板
"umsocial_sina" = "Sina";
"umsocial_wechat" = "Wechat";
"umsocial_wechat_session" = "Wechat";
"umsocial_wechat_timeline" = "Moments";
"umsocial_wechat_favorite" = "Wechat Favorite";
"umsocial_qq" = "QQ";
"umsocial_qzone" = "Qzone";
"umsocial_tencentWB" = "tencentWB";
"umsocial_ap" = "alip";
"umsocial_ap_session" = "Alip";
"umsocial_ap_circle" = "LifeCircle";
"umsocial_lw_session" = "LaiWang";
"umsocial_lw_timeline" = "LW News";
"umsocial_yixin_session" = "YiXin";
"umsocial_yixin_timeline" = "YX Moments";
"umsocial_douban" = "Douban";
"umsocial_renren" = "Renren";
"umsocial_email" = "Email";
"umsocial_sms" = "SMS";
"umsocial_facebook" = "Facebook";
"umsocial_twitter" = "Twitter";
"umsocial_instagram" = "Instagram";
"umsocial_line" = "Line";
"umsocial_flickr" = "Flickr";
"umsocial_kakaoTalk" = "KakaoTalk";
"umsocial_pinterest" = "Pinterest";
"umsocial_tumblr" = "Tumblr";
"umsocial_linkedin" = "Linkedin";
"umsocial_whatsapp" = "Whatsapp";
"umsocial_youdaonote" = "ydnote";
"umsocial_evernote" = "evernote";
"umsocial_googleplus" = "Google+";
"umsocial_pocket" = "Pocket";
"umsocial_dropbox" = "Dropbox";
"umsocial_vkontakte" = "VKontakte";
"umsocial_facebookmessenger" = "Messenger";
"umsocial_default" = "template";
//云端分享认证的国际化字符串
"cloudShare_share_success" = "share success";
"cloudShare_share_failed" = "share failed";
"cloudShare_share_close" = "close";
"cloudShare_share_send" = "send";
"cloudShare_share" = "share";
"cloudShare_oauth_title" = "oauth";
"cloudShare_oauth_error" = "oauth error";
//UI面板的title和cancel控件的国际化字符串
"umsocial_shareUI_Title" = "select your platform";
"umsocial_shareUI_CancelControlText" = "Cancel";
/*
Localizable.strings
SocialSDK
Created by yeahugo on 13-6-17.
Copyright (c) 2013年 Umeng. All rights reserved.
*/
"button_cancel" = "取消";
"button_ok" = "确定";
"button_start" = "开启";
"button_close" = "关闭";
"button_back" = "返回";
"button_refresh" = "刷新";
"label_request_account" = "正在获取账户信息,请稍等...";
"oauth_title" = "授权";
"oauth_text" = "正在连接授权页面,请稍等...";
"mask_text" = "正在获取数据,请稍等...";
"oauth_follow" = "关注官方微博";
"oauth_error_title" = "授权失败";
"oauth_error_message" = "服务器繁忙,授权失败,请稍后再试";
"oauth_error_not_approved" = "由于没有在开放平台添加此账号作为测试账号或者没有通过审核等原因授权失败";
"shareQQ_error" = "抱歉";
"shareQQ_notInstall" = "没有安装手机QQ客户端";
"shareQQ_openFail" = "打开手机QQ失败";
"shareQQ_ShareFail" = "分享到QQ失败";
"shareClient_notInstall" = "没有安装客户端";
"shareInstagram_openFail" = "没有安装Instagram客户端";
"custom_share_title" = "友盟分享";
"shareList_title" = "分享至";
"shareEdit_title" = "分享至";
"shareEdit_post" = "发布";
"shareEdit_change_account" = "切换账号";
"shareEdit_post_finish" = "发送成功";
"shareEdit_post_fail" = "发送失败";
"shareEdit_posting" = "正在发送";
"shareEdit_delete_picture" = "删除图片";
"shareEdit_delete_video" = "删除视频";
"shareEdit_delete_music" = "删除音乐";
"shareEdit_error_not_empty" = "分享内容不能为空";
"shareEdit_error_too_long" = "分享内容长度超出限制";
"shareEdit_error_auth_expired" = "授权过期,分享失败";
"shareEdit_error_auth_again" = "重新授权";
"shareEdit_error_text_repeated" = "内容重复,分享失败";
"shareEdit_error_user_baned" = "对不起,因为违反了用户协议您已被禁言";
"shareEdit_error_fail" = "分享失败";
"shareEdit_error_no_auth" = "无上传图片的权限,分享失败";
"shareEdit_error_empty_content" = "分享内容为空,分享失败";
"shareEdit_addFollow" = "关注官方微博";
"shareEdit_C" = "符";
"shareEdit_used" = "常";
"shareShake_button" = "分享";
"share_wechat" = "分享至微信";
"share_wechat_friend" = "分享至微信好友";
"share_wechat_moments" = "分享至微信朋友圈";
"share_wechat_no_title" = "温馨提示";
"share_wechat_no_message" = "您的设备没有安装微信";
"share_facebook_not_login" = "账号未登录";
"share_facebook_not_login_message" = "账号未登录";
"share_facebook_no_osSupport" = "系统不支持";
"share_facebook_no_osSupport_message" = "您的iOS系统版本过低,不支持分享到该平台";
"share_ap" = "分享至支付宝";
"share_ap_friend" = "分享至支付宝好友";
"share_ap_moments" = "分享至支付宝生活圈";
"share_ap_no_title" = "温馨提示";
"share_ap_no_message" = "您的设备没有安装支付宝";
"share_ap_version_not_supported" = "您的支付宝版本不支持分享";
"share_sms_no_osSupport" = "不支持短信";
"share_sms_no_osSupport_message" = "您的设备不支持短信功能";
"share_email_no_osSupport" = "邮件功能未开启";
"share_email_no_osSupport_message" = "您当前的邮件服务处于未启用状态,请先前往系统设置中配置邮件服务后,再进行分享";
"login_title" = "登录";
"login_as_tourists" = "游客身份";
"login_choose" = "选择已有账号登录";
"commentList_title" = "评论列表";
"commentList_mask_text" = "正在获取评论数据,请稍等...";
"commentList_comment_here" = "在这说点什么...";
"commentDetail_title" = "评论详情";
"commentEdit_no_location" = "取消定位";
"commentEdit_post_fail" = "评论失败";
"commentEdit_post_success" = "评论成功";
"commentEdit_noLocation_title" = "定位服务未开启";
"commentEdit_noLocation_message" = "您当前的定位服务处于关闭状态,或者没有对此应用开启地理位置服务,请先前往系统设置中开启本应用的定位服务,再进行分享";
"commentEdit_title" = "新评论";
"commentEdit_wait" = "评论发送中,请稍等...";
"ego_pull_down" = "下拉刷新";
"ego_pull_up" = "上拉加载更多";
"ego_refreshing" = "正在刷新";
"ego_loading_more" = "正在加载更多";
"ego_refresh" = "松开立即刷新";
"ego_loadmore" = "松开立即加载更多";
"shareEdit_error_network_fail_message" = "网络不给力,发送失败了";
"loading" = " 加载中 ";
"network_fail_title" = "温馨提示";
"network_fail_message" = "当前网络不给力";
"account_title" = "个人中心";
"account_title_authorize_status" = "授权信息";
"account_label_login_tourist" = "游客登录";
"account_label_login_account" = "登录账号";
"account_lable_not_auth" = "尚未授权";
"account_lable_have_auth" = "已授权";
"account_title_sns_config" = "分享设置";
//分享面板
"umsocial_sina" = "新浪微博";
"umsocial_wechat" = "微信";
"umsocial_wechat_session" = "微信好友";
"umsocial_wechat_timeline" = "微信朋友圈";
"umsocial_wechat_favorite" = "微信收藏";
"umsocial_qq" = "QQ";
"umsocial_qzone" = "QQ空间";
"umsocial_tencentWB" = "腾讯微博";
"umsocial_ap" = "支付宝";
"umsocial_ap_session" = "支付宝好友";
"umsocial_ap_circle" = "生活圈";
"umsocial_lw_session" = "点点虫";
"umsocial_lw_timeline" = "点点虫动态";
"umsocial_yixin_session" = "易信";
"umsocial_yixin_timeline" = "易信朋友圈";
"umsocial_douban" = "豆瓣";
"umsocial_renren" = "人人网";
"umsocial_email" = "邮箱";
"umsocial_sms" = "短信";
"umsocial_facebook" = "Facebook";
"umsocial_twitter" = "Twitter";
"umsocial_instagram" = "Instagram";
"umsocial_line" = "Line";
"umsocial_flickr" = "Flickr";
"umsocial_kakaoTalk" = "KakaoTalk";
"umsocial_pinterest" = "Pinterest";
"umsocial_tumblr" = "Tumblr";
"umsocial_linkedin" = "Linkedin";
"umsocial_whatsapp" = "Whatsapp";
"umsocial_youdaonote" = "有道云笔记";
"umsocial_evernote" = "印象笔记";
"umsocial_googleplus" = "Google+";
"umsocial_pocket" = "Pocket";
"umsocial_dropbox" = "Dropbox";
"umsocial_vkontakte" = "VKontakte";
"umsocial_facebookmessenger" = "Messenger";
"umsocial_default" = "自定义模板";
//云端分享认证的国际化字符串
"cloudShare_share_success" = "分享成功";
"cloudShare_share_failed" = "分享失败";
"cloudShare_share_close" = "关闭";
"cloudShare_share_send" = "发送";
"cloudShare_share" = "分享";
"cloudShare_oauth_title" = "授权";
"cloudShare_oauth_error" = "授权错误";
//UI面板的title和cancel控件的国际化字符串
"umsocial_shareUI_Title" = "请选择分享平台";
"umsocial_shareUI_CancelControlText" = "取消分享";
#!/bin/bash
#
# This script generates 'WebP.framework' (static library).
# An iOS app can decode WebP images by including 'WebP.framework'.
#
# 1. Download the latest libwebp source code from
# http://downloads.webmproject.org/releases/webp/index.html
# 2. Use this script instead of the original 'iosbuild.sh' to build the WebP.framework.
# It will build all modules, include mux, demux, coder and decoder.
#
# Notice: You should use Xcode 7 (or above) to support bitcode.
set -e
# Extract the latest SDK version from the final field of the form: iphoneosX.Y
readonly SDK=$(xcodebuild -showsdks \
| grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}'
)
# Extract Xcode version.
readonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2)
if [[ -z "${XCODE}" ]]; then
echo "Xcode not available"
exit 1
fi
readonly OLDPATH=${PATH}
# Add iPhoneOS-V6 to the list of platforms below if you need armv6 support.
# Note that iPhoneOS-V6 support is not available with the iOS6 SDK.
PLATFORMS="iPhoneSimulator iPhoneSimulator64"
PLATFORMS+=" iPhoneOS-V7 iPhoneOS-V7s iPhoneOS-V7-arm64"
readonly PLATFORMS
readonly SRCDIR=$(dirname $0)
readonly TOPDIR=$(pwd)
readonly BUILDDIR="${TOPDIR}/iosbuild"
readonly TARGETDIR="${TOPDIR}/WebP.framework"
readonly DEVELOPER=$(xcode-select --print-path)
readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
LIBLIST=''
if [[ -z "${SDK}" ]]; then
echo "iOS SDK not available"
exit 1
elif [[ ${SDK} < 6.0 ]]; then
echo "You need iOS SDK version 6.0 or above"
exit 1
else
echo "iOS SDK Version ${SDK}"
fi
rm -rf ${BUILDDIR}
rm -rf ${TARGETDIR}
mkdir -p ${BUILDDIR}
mkdir -p ${TARGETDIR}/Headers/
if [[ ! -e ${SRCDIR}/configure ]]; then
if ! (cd ${SRCDIR} && sh autogen.sh); then
cat <<EOT
Error creating configure script!
This script requires the autoconf/automake and libtool to build. MacPorts can
be used to obtain these:
http://www.macports.org/install.php
EOT
exit 1
fi
fi
for PLATFORM in ${PLATFORMS}; do
ARCH2=""
if [[ "${PLATFORM}" == "iPhoneOS-V7-arm64" ]]; then
PLATFORM="iPhoneOS"
ARCH="aarch64"
ARCH2="arm64"
elif [[ "${PLATFORM}" == "iPhoneOS-V7s" ]]; then
PLATFORM="iPhoneOS"
ARCH="armv7s"
elif [[ "${PLATFORM}" == "iPhoneOS-V7" ]]; then
PLATFORM="iPhoneOS"
ARCH="armv7"
elif [[ "${PLATFORM}" == "iPhoneOS-V6" ]]; then
PLATFORM="iPhoneOS"
ARCH="armv6"
elif [[ "${PLATFORM}" == "iPhoneSimulator64" ]]; then
PLATFORM="iPhoneSimulator"
ARCH="x86_64"
else
ARCH="i386"
fi
ROOTDIR="${BUILDDIR}/${PLATFORM}-${SDK}-${ARCH}"
mkdir -p "${ROOTDIR}"
DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain"
SDKROOT="${PLATFORMSROOT}/"
SDKROOT+="${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK}.sdk/"
CFLAGS="-arch ${ARCH2:-${ARCH}} -pipe -isysroot ${SDKROOT} -O3 -DNDEBUG"
CFLAGS+=" -miphoneos-version-min=6.0 -fembed-bitcode"
set -x
export PATH="${DEVROOT}/usr/bin:${OLDPATH}"
${SRCDIR}/configure --host=${ARCH}-apple-darwin --prefix=${ROOTDIR} \
--build=$(${SRCDIR}/config.guess) \
--disable-shared --enable-static \
--enable-libwebpmux \
--enable-libwebpdemux \
--enable-swap-16bit-csp \
CFLAGS="${CFLAGS}"
set +x
# run make only in the src/ directory to create libwebpdecoder.a
cd src/
make V=0
make install
MAKEPATH=$(pwd)
cd ${ROOTDIR}/lib/
ar x libwebp.a
ar x libwebpmux.a
ar x libwebpdemux.a
ar q webp.a *.o
LIBLIST+=" ${ROOTDIR}/lib/webp.a"
cd ${MAKEPATH}
make clean
cd ..
export PATH=${OLDPATH}
done
cp -a ${SRCDIR}/src/webp/*.h ${TARGETDIR}/Headers/
${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Assets.car</key>
<data>
hIg1VKvtH79FJ85P13GTXERGDeI=
</data>
<key>AudioPlayerViewController.nib</key>
<data>
MN+uwuQuS43O/Ap3tQa/z0+Y8AQ=
</data>
<key>BuLuView.nib/objects-11.0+.nib</key>
<data>
/CqdNF4SvsogotdDakWZC3k5J5c=
</data>
<key>BuLuView.nib/runtime.nib</key>
<data>
/jj/tOtV08cbim1lWcSN50DgSQ0=
</data>
<key>CLLockVC.nib</key>
<data>
U/q7CR0hnB4+tVo5dFADBtpKft0=
</data>
<key>CameraViewController.nib</key>
<data>
DctrjLDPAYfHxCQWVrRzSIRkaNE=
</data>
<key>CommonTipView.nib</key>
<data>
I6wQ7mo+MeH1FM9k0waSkKw2gV8=
</data>
<key>FileManagerViewCell.nib</key>
<data>
8yxC2kYqil3iY+iFjrmZn2p1cRg=
</data>
<key>FileManagerViewController.nib</key>
<data>
+0E81L/4fGNiBwHJfsk8SNEmaxI=
</data>
<key>GestureLoginVC.nib</key>
<data>
ZZYSnICWrSynJoJadJPcZbAoK9Q=
</data>
<key>Headers/UIZZDRView.h</key>
<data>
Kf8WuOxGiukKydPSlA4dZrmaUVE=
</data>
<key>Headers/ZDDR.h</key>
<data>
Myr+IMhlIff467V/1zQALoTLcQI=
</data>
<key>Headers/ZDDRInit.h</key>
<data>
LutdiTm28fz0UWkXEv5SQb+rhnE=
</data>
<key>IDCardBack.png</key>
<data>
14/n7aw+o7+BeikXEiMVJN10S/s=
</data>
<key>IDCardFront.png</key>
<data>
WN7f9kLuFQpj56PaJqPOu7gOrZw=
</data>
<key>IDPhotoVC.nib/objects-11.0+.nib</key>
<data>
iylBBmGsfXSn4sWMj1Q9DuU2SoM=
</data>
<key>IDPhotoVC.nib/runtime.nib</key>
<data>
Fr90DbJ0+2keOrtrT4UEUalv/aQ=
</data>
<key>Info.plist</key>
<data>
qTwzmqDh3mvOHjwmZmrZo0vpufE=
</data>
<key>InfoPlist.strings</key>
<data>
E9wT9mmU05B/rSnU9o3egWxmWhc=
</data>
<key>LeftTableCell.nib</key>
<data>
5N/fY0o5/qBeGzXIgSlul+qSqbk=
</data>
<key>Localizable.strings</key>
<data>
ETMp8cS9g332F+sTa9ojCXfNJDM=
</data>
<key>MGFaceDetectionEn.strings</key>
<data>
9OaiNnWU14uawZns4PYigPMKltA=
</data>
<key>MGFaceDetectionZh.strings</key>
<data>
9OaiNnWU14uawZns4PYigPMKltA=
</data>
<key>MGLivenessDetectionResource.bundle/MGFaceDetectionEn.strings</key>
<data>
ljVRlDAQdzcCDOy1JYAKBL8mnVY=
</data>
<key>MGLivenessDetectionResource.bundle/MGFaceDetectionZh.strings</key>
<data>
QTpmFeJ9oJjHyH1acLV1+ypnB5E=
</data>
<key>MGLivenessDetectionResource.bundle/MegLive_model</key>
<data>
s8YVMdOnhdivFAIYMElA5bJINNM=
</data>
<key>MGLivenessDetectionResource.bundle/audio/meglive_eye_blink2.mp3</key>
<data>
UFChi2w8xDze4bbUXjx+Pjz7S9c=
</data>
<key>MGLivenessDetectionResource.bundle/audio/meglive_mouth_open2.mp3</key>
<data>
XrtJPwmzCwnRRun7mVHCVZ+uJsM=
</data>
<key>MGLivenessDetectionResource.bundle/audio/meglive_pitch_down.mp3</key>
<data>
HYc++e/P8+Qc27ZwFcjDVJqsa4g=
</data>
<key>MGLivenessDetectionResource.bundle/audio/meglive_well_done.mp3</key>
<data>
UwPOUqQ8F5ioNsUcUB+FEtt+pvs=
</data>
<key>MGLivenessDetectionResource.bundle/audio/meglive_yaw1.mp3</key>
<data>
h9MkDiMYtpzWYWgdITOe7FFLso8=
</data>
<key>MGLivenessDetectionResource.bundle/image/head-blink.png</key>
<data>
5VmT3p9DVT6H7vpjuyruAT8LkuQ=
</data>
<key>MGLivenessDetectionResource.bundle/image/head-down.png</key>
<data>
OdRjg6NfdydX62dyBZ53zaabsvY=
</data>
<key>MGLivenessDetectionResource.bundle/image/head-eye.png</key>
<data>
ml4MdlVgQt3v2q/yqHnw8+HWe5c=
</data>
<key>MGLivenessDetectionResource.bundle/image/head-left.png</key>
<data>
TWq2kf7V0y7uqGL370ZjTS7ttd8=
</data>
<key>MGLivenessDetectionResource.bundle/image/head-openMouse.png</key>
<data>
l3BouNMZAjRJgBvPYn7osucYKLA=
</data>
<key>MGLivenessDetectionResource.bundle/image/head-right.png</key>
<data>
KxrDEzl4i+c6MIVSRo6dx6uIqOY=
</data>
<key>MGLivenessDetectionResource.bundle/image/head-up.png</key>
<data>
fYsDQRl37nTT+AD1QDCDO2Hs1is=
</data>
<key>MGLivenessDetectionResource.bundle/image/header_bg_img.png</key>
<data>
iwBVB7R/g2JIkcwPv0RylOe+6WI=
</data>
<key>MGLivenessDetectionResource.bundle/image/header_first.png</key>
<data>
Awz8HQxz10Hu8GkZmb0dZUcfZIk=
</data>
<key>MegLive_model</key>
<data>
s8YVMdOnhdivFAIYMElA5bJINNM=
</data>
<key>Modules/module.modulemap</key>
<data>
c5gAHugycBMQtnJwQEvUCel1j14=
</data>
<key>MyPDFHtmlViewController.nib/objects-11.0+.nib</key>
<data>
Cciank8voc2iv/iUEU9C55aY1Bg=
</data>
<key>MyPDFHtmlViewController.nib/runtime.nib</key>
<data>
oxmw0qSexT5CiwKVicVw/lBDJpQ=
</data>
<key>MyWebViewController.nib/objects-11.0+.nib</key>
<data>
fL2syeILiR7n+ZD4txkb4PaOzgI=
</data>
<key>MyWebViewController.nib/runtime.nib</key>
<data>
8qAy/QBZFNAw68vc8wYxAJOTYQY=
</data>
<key>PhotoController.nib</key>
<data>
NY2mgUmwdJf51u3Le8BeJp+NBj8=
</data>
<key>PlayVideoView.nib</key>
<data>
9cYUgPELbUXaXrBOA8T8wNXauvk=
</data>
<key>QBImagePicker.storyboardc/Info.plist</key>
<data>
iwZHbHPu3m3FYRI+FCDLbHeFs44=
</data>
<key>QBImagePicker.storyboardc/QBAlbumsNavigationController.nib/objects-12.3+.nib</key>
<data>
3Y/nFhE9oSgdQuiLXqVOGg3YVVA=
</data>
<key>QBImagePicker.storyboardc/QBAlbumsNavigationController.nib/runtime.nib</key>
<data>
3Y/nFhE9oSgdQuiLXqVOGg3YVVA=
</data>
<key>QBImagePicker.storyboardc/QBAlbumsViewController.nib/objects-12.3+.nib</key>
<data>
G926ZwIQDoI+t6EAuyIl4r6znsI=
</data>
<key>QBImagePicker.storyboardc/QBAlbumsViewController.nib/runtime.nib</key>
<data>
G926ZwIQDoI+t6EAuyIl4r6znsI=
</data>
<key>QBImagePicker.storyboardc/QBAssetsViewController.nib/objects-12.3+.nib</key>
<data>
uMbv/JBFOHUAr8iA2JrL0vSHifM=
</data>
<key>QBImagePicker.storyboardc/QBAssetsViewController.nib/runtime.nib</key>
<data>
uMbv/JBFOHUAr8iA2JrL0vSHifM=
</data>
<key>QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib/objects-12.3+.nib</key>
<data>
nRcfyExecCjXy7l/PLEv5B9mCqc=
</data>
<key>QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib/runtime.nib</key>
<data>
nRcfyExecCjXy7l/PLEv5B9mCqc=
</data>
<key>QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib/objects-12.3+.nib</key>
<data>
bFikUb2FGLSr2O3MP0+qk7kDtuM=
</data>
<key>QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib/runtime.nib</key>
<data>
jOYhyTyFw651Apt7IeMMpp0z1Rc=
</data>
<key>README.md</key>
<data>
jx5C4dKA1TeQBAqW6Aj8dZwzAPE=
</data>
<key>ReadMe.txt</key>
<data>
rTCsWX99ZYGRyiHUsYlYXS7RSoo=
</data>
<key>Remote.storyboardc/Iai-uo-IGl-view-aQ3-nL-ARe.nib/objects-11.0+.nib</key>
<data>
KB8zBe6yxfrcyp/RE0VX3ktOv80=
</data>
<key>Remote.storyboardc/Iai-uo-IGl-view-aQ3-nL-ARe.nib/runtime.nib</key>
<data>
EhAR44vms7004lhqq/PRgdTg47U=
</data>
<key>Remote.storyboardc/Info.plist</key>
<data>
bkg9CBtmoGUYVZJt/hl8H0TODz4=
</data>
<key>Remote.storyboardc/RemoteMidViewController.nib/objects-11.0+.nib</key>
<data>
J4ElJDIdfg2LtZnIxp8vD7bQmD0=
</data>
<key>Remote.storyboardc/RemoteMidViewController.nib/runtime.nib</key>
<data>
J4ElJDIdfg2LtZnIxp8vD7bQmD0=
</data>
<key>Remote.storyboardc/RemoteRealViewController.nib/objects-11.0+.nib</key>
<data>
kuhP9KTqFJVxqmqjmNnPcu4yZhY=
</data>
<key>Remote.storyboardc/RemoteRealViewController.nib/runtime.nib</key>
<data>
kuhP9KTqFJVxqmqjmNnPcu4yZhY=
</data>
<key>Remote.storyboardc/RrO-Qu-FLL-view-YGE-t5-x3r.nib/objects-11.0+.nib</key>
<data>
9J0zzoJ1GMsigvKGJLqPZKy9S+E=
</data>
<key>Remote.storyboardc/RrO-Qu-FLL-view-YGE-t5-x3r.nib/runtime.nib</key>
<data>
s7kadr90S9Rx50IsqkIuPqmRyI4=
</data>
<key>ReviewResultVC.nib/objects-11.0+.nib</key>
<data>
XH29qiv/SFwhu91EWcw/3QMqSJY=
</data>
<key>ReviewResultVC.nib/runtime.nib</key>
<data>
MGTN0cRLz78nVe55/1y1Zhrc4hs=
</data>
<key>SCCameraResultController.nib/objects-11.0+.nib</key>
<data>
2RZizad3LFuLDEsNYCgJPml9VME=
</data>
<key>SCCameraResultController.nib/runtime.nib</key>
<data>
KYLdC9B/H0/PShcvHpD5GrLnGd8=
</data>
<key>SCCameraView.nib/objects-11.0+.nib</key>
<data>
sF8aPo1qWzb+hiUJXeOn1LNcNoM=
</data>
<key>SCCameraView.nib/runtime.nib</key>
<data>
nuEeTJSS2qI25xAgXu2630xi6bY=
</data>
<key>SGQRCode.bundle/QRCodeLeftBottom@2x.png</key>
<data>
1Asa7EE5M4xxijAdwdyyD/I8BYs=
</data>
<key>SGQRCode.bundle/QRCodeLeftBottom@3x.png</key>
<data>
A78ylhO6uRMAstuJaVkRAGr2k2c=
</data>
<key>SGQRCode.bundle/QRCodeLeftTop@2x.png</key>
<data>
UqMF9s1CORMXlruAUAfMy9xWJXA=
</data>
<key>SGQRCode.bundle/QRCodeLeftTop@3x.png</key>
<data>
fTJviT+hbRyS7GMDECtplbMdzgY=
</data>
<key>SGQRCode.bundle/QRCodeRightBottom@2x.png</key>
<data>
YSPqSSvU3bpdPwawUPdmw31Z6Fw=
</data>
<key>SGQRCode.bundle/QRCodeRightBottom@3x.png</key>
<data>
b8ilDU0zyzLW8Du4/5w7hCy0zyM=
</data>
<key>SGQRCode.bundle/QRCodeRightTop@2x.png</key>
<data>
dbHMXIn4ns4MVtsDKVqHAXFYyio=
</data>
<key>SGQRCode.bundle/QRCodeRightTop@3x.png</key>
<data>
Xi6nEQ8MzGB5Aag8pEmhbkeukHI=
</data>
<key>SGQRCode.bundle/QRCodeScanningLine@2x.png</key>
<data>
kgN7QLnahL4bAVdbmeNoRiAT2MU=
</data>
<key>SGQRCode.bundle/QRCodeScanningLine@3x.png</key>
<data>
jy1on6QVD+bXiP30mngveDRAplE=
</data>
<key>SGQRCode.bundle/Root.plist</key>
<data>
jOhqEUF1/xyY+fuswiWT+ELC3dI=
</data>
<key>SGQRCode.bundle/en.lproj/Root.strings</key>
<dict>
<key>hash</key>
<data>
t4KY9Gh4uIiOv7VnHtRrKEuPRY8=
</data>
<key>optional</key>
<true/>
</dict>
<key>SGQRCode.bundle/sound.caf</key>
<data>
iZVdiwY7C4RBniEGgPS440vVkRo=
</data>
<key>SVProgressHUD.bundle/angle-mask.png</key>
<data>
oqIJzVxhZua/CZX+TGK3kylFilY=
</data>
<key>SVProgressHUD.bundle/angle-mask@2x.png</key>
<data>
3aAb8SeX29Ro7z1pt6A1yqUAaHs=
</data>
<key>SVProgressHUD.bundle/angle-mask@3x.png</key>
<data>
pPD0GLNI2PnWq2CX6UyQ9H52T9g=
</data>
<key>SVProgressHUD.bundle/error.png</key>
<data>
oP6f/Zad0pEL8xrimTdNlSXrrpA=
</data>
<key>SVProgressHUD.bundle/error@2x.png</key>
<data>
cFCuvbmEkaKmhj2RThSqw/5KUtM=
</data>
<key>SVProgressHUD.bundle/error@3x.png</key>
<data>
QSlxhLYpqk8M4tlq+X0hXbamUH0=
</data>
<key>SVProgressHUD.bundle/info.png</key>
<data>
CP1bXzRkp6v+a6oAHECMgzhmOIU=
</data>
<key>SVProgressHUD.bundle/info@2x.png</key>
<data>
yx+ZQImmZJ+j/av7X/uJpzaqomU=
</data>
<key>SVProgressHUD.bundle/info@3x.png</key>
<data>
5MgHR68ek5Ayg9vc2oGqk1wMpdQ=
</data>
<key>SVProgressHUD.bundle/success.png</key>
<data>
oQ/IlYYGw5vH/rx4pqvYiNddu8c=
</data>
<key>SVProgressHUD.bundle/success@2x.png</key>
<data>
P1jXd1XGKWq/KG50KF6pWjBVwBo=
</data>
<key>SVProgressHUD.bundle/success@3x.png</key>
<data>
hmliT+WZg212OTNmAhP+uSOyYio=
</data>
<key>SYWCameraResultViewController.nib/objects-11.0+.nib</key>
<data>
K6FO/HbhQU6j80Vxw+Goqw29/24=
</data>
<key>SYWCameraResultViewController.nib/runtime.nib</key>
<data>
ygMZ+ZHI9tugH0N45QCnhUnF4hk=
</data>
<key>ScreenProjectionVideoVC.nib/objects-11.0+.nib</key>
<data>
yZrOf6Yk6stu0VfKNMZRyShk3j4=
</data>
<key>ScreenProjectionVideoVC.nib/runtime.nib</key>
<data>
mOL2a4ZVkKcXayepbdVgggvkRGU=
</data>
<key>TRTC.storyboardc/Info.plist</key>
<data>
gjFd8Jrj0eTOsK0z5aD4hci1ZKc=
</data>
<key>TRTC.storyboardc/TRTCMainViewController.nib/objects-11.0+.nib</key>
<data>
zQIlRBtHqV51ftEV9qIBngviX9o=
</data>
<key>TRTC.storyboardc/TRTCMainViewController.nib/runtime.nib</key>
<data>
zQIlRBtHqV51ftEV9qIBngviX9o=
</data>
<key>TRTC.storyboardc/Ztf-Hn-jJO-view-CWD-6p-pfW.nib/objects-11.0+.nib</key>
<data>
i5yPQYiCfm9uTlTl328C3HPTLpc=
</data>
<key>TRTC.storyboardc/Ztf-Hn-jJO-view-CWD-6p-pfW.nib/runtime.nib</key>
<data>
6+CpbZpbziXhJjPpF4+txDb1s/k=
</data>
<key>TRTCSettings.storyboardc/Info.plist</key>
<data>
Cw6KbfN5ALtN5fY8JFMdFFt6Y+0=
</data>
<key>TRTCSettings.storyboardc/J22-N3-PuQ-view-elt-Ks-vh2.nib/objects-11.0+.nib</key>
<data>
SqCW3PrBxSINv15gly4FywEz7Ws=
</data>
<key>TRTCSettings.storyboardc/J22-N3-PuQ-view-elt-Ks-vh2.nib/runtime.nib</key>
<data>
koUnj6bwuC/EQjqkyLi0cOzYDFg=
</data>
<key>TRTCSettings.storyboardc/TRTCPKSettingsViewController.nib/objects-11.0+.nib</key>
<data>
6AseJbcGjPsmrVpx29pUDb8ui8Q=
</data>
<key>TRTCSettings.storyboardc/TRTCPKSettingsViewController.nib/runtime.nib</key>
<data>
6AseJbcGjPsmrVpx29pUDb8ui8Q=
</data>
<key>TRTCSettings.storyboardc/TRTCStreamSettingsViewController.nib/objects-11.0+.nib</key>
<data>
0iegeWYDAYAdJ8TouO0IW2lA8zA=
</data>
<key>TRTCSettings.storyboardc/TRTCStreamSettingsViewController.nib/runtime.nib</key>
<data>
0iegeWYDAYAdJ8TouO0IW2lA8zA=
</data>
<key>TRTCSettings.storyboardc/lji-B9-o0a-view-FEa-Gn-HOa.nib/objects-11.0+.nib</key>
<data>
SxRbQAzPPCriSlJqpREmPWrDV7g=
</data>
<key>TRTCSettings.storyboardc/lji-B9-o0a-view-FEa-Gn-HOa.nib/runtime.nib</key>
<data>
lAIXwocrr6fmo4gz9TGyO2OyF7I=
</data>
<key>UMSocialSDKResources.bundle/Buttons/UMS_add_friend_off@2x.png</key>
<data>
sJE/xo/JIuUVVHdPkDlD8YiY2S0=
</data>
<key>UMSocialSDKResources.bundle/Buttons/UMS_delete_image_button_normal@2x.png</key>
<data>
1iWpAxsjlOMruXZHu1pXxVR3kFI=
</data>
<key>UMSocialSDKResources.bundle/Buttons/UMS_nav_button_close@2x.png</key>
<data>
l6AB6WM7o6jD/6r1EDZNymdiYDk=
</data>
<key>UMSocialSDKResources.bundle/Buttons/UMS_nav_button_send@2x.png</key>
<data>
6l9qdc5h8C568MM2z7gpFdbp2/M=
</data>
<key>UMSocialSDKResources.bundle/Buttons/UMS_url_image@2x.png</key>
<data>
fB90DzX7PQBeZCqKrBJDJlS/VjY=
</data>
<key>UMSocialSDKResources.bundle/Buttons/UMS_url_music@2x.png</key>
<data>
t5FFEysFBepd0qv1c4FQv9pwLFE=
</data>
<key>UMSocialSDKResources.bundle/Buttons/UMS_url_video@2x.png</key>
<data>
BsDS9+SXnjB3x/j9lZw9u0dSTfE=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_ap.png</key>
<data>
7y+Jri3KeRo4HW93cxsRtHQ3r+E=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_default.png</key>
<data>
cFQLjPP0LklWBSRhjLJNRiPc+nI=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_dingding.png</key>
<data>
CycuRtZNW5ohMTC8BBzdUfMB6M0=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_douban.png</key>
<data>
ziR2UvmonrHoxKUwAr1WBag0M+Y=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_dropbox.png</key>
<data>
YVGY/SgX0Mm+AORr0cbKCqf0PKE=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_email.png</key>
<data>
NVpqAB8V52llxOsxs7u+asJs3b0=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_evernote.png</key>
<data>
kgU+1BrhXfmxAx6Dg+AjydBE0qU=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_facebook.png</key>
<data>
bmHGneGq2NqjUl9eJJl+Zk4hnsY=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_facebookmessenger.png</key>
<data>
PGdieqYC9yFnr+GT0K0cEAUTxbc=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_flickr.png</key>
<data>
izfyDFpOlthr5HQeczIkhH822UA=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_googleplus.png</key>
<data>
K52WH33dp6rjB4VyTwKT5PnQAXY=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_instagram.png</key>
<data>
PBSRbQ9vzJ01/Gx1xo0OlTF+A6Q=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_kakaoTalk.png</key>
<data>
mLQlbp14yoPEZE02HE3CybLr154=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_line.png</key>
<data>
PJZIoBiPhfiNunGB1IPo/GB8n/w=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_linkedin.png</key>
<data>
plNJcPjAp5YfSi4cS5orcPGEYHA=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_lw_session.png</key>
<data>
dXXNMIrfO/Nb3hpPxaXXog+IESo=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_lw_timeline.png</key>
<data>
/SCZVgyQ7rxqmfWsLW/3wMuvnvI=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_pinterest.png</key>
<data>
BF6qCe2Me+DXfRbNt50OZjDjgBA=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_pocket.png</key>
<data>
C1QR+1oY0tpIUkIXiSlw2aQMi+Y=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_qq.png</key>
<data>
nymksUkHrUXNN1fa1HFlzje5Suo=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_qzone.png</key>
<data>
Go1xpyG76ewizRfIZK+mVcIhweM=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_renren.png</key>
<data>
1sUEoW/u88gzOY8wxpfXsYqflcI=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_sina.png</key>
<data>
4p/r0SR8/gHZbKurFrHKOn0Qt+s=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_sms.png</key>
<data>
ytWG+UICAmwFAJr9US2ayoDDOII=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_tencentWB.png</key>
<data>
9XeAxGecy2BDVvsvnX2zzsEhw6I=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_tim.png</key>
<data>
Lz/kYM5RDikSq3guQhpGQXWq280=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_tumblr.png</key>
<data>
kyJ3ig9oklTmzhdFo7PX5h9fkR4=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_twitter.png</key>
<data>
AaRMHlPVEM+yTEBRZr+g+QObA/w=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_vkontakte.png</key>
<data>
kU45HUVo54iK5Zq9P75MLTmvrTo=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_wechat.png</key>
<data>
Pii3H3Y9qIOj80UGcTeinu8jT5A=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_wechat_favorite.png</key>
<data>
ILj4SIaoqCEW5yxSmxmyU2cV3k4=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_wechat_timeline.png</key>
<data>
LRwjfEU3D+kU+2loYeFEBC+v72Y=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_whatsapp.png</key>
<data>
H3HR7v0WGWx7cXAaUBrg2N3hAiA=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_yixin_favorite.png</key>
<data>
1VWcsLT7NMJBlzwnOyUP0ojjsvY=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_yixin_session.png</key>
<data>
e60x3aYLSFS5IsJZaqUwip2yYwU=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_yixin_timeline.png</key>
<data>
Y7Z4ztTSbum22ZXy55fpz0YdSqo=
</data>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_youdaonote.png</key>
<data>
FF/j8ZP7l0GoAEyrk/N3dpqTW+M=
</data>
<key>UMSocialSDKResources.bundle/UMSocialWaterMark/umsocial_defaultwatermark.png</key>
<data>
MCp9Cs37z59IJrx/INe32jQ8gvg=
</data>
<key>UMSocialSDKResources.bundle/en.lproj/UMSocialLocalizable.strings</key>
<dict>
<key>hash</key>
<data>
4LCP76uRV3HMtjzTcK+3PLsaqtE=
</data>
<key>optional</key>
<true/>
</dict>
<key>UMSocialSDKResources.bundle/zh-Hans.lproj/UMSocialLocalizable.strings</key>
<dict>
<key>hash</key>
<data>
LZ460SWfmmxVdgkmpsnwaZrXM0k=
</data>
<key>optional</key>
<true/>
</dict>
<key>VERSION</key>
<data>
NqPOiUrEldjLkAYxns7UnnKZhYc=
</data>
<key>VideoViewController.nib/objects-11.0+.nib</key>
<data>
2fwhLiXg96ImObVCM7Opf5N4Oxo=
</data>
<key>VideoViewController.nib/runtime.nib</key>
<data>
/a1DhKQaG7BwvWMXDSEE1s3vVGA=
</data>
<key>WMPlayer.bundle/bottom_shadow.png</key>
<data>
oh1Lgp3Gne8A9SoT2lXlNbCauFM=
</data>
<key>WMPlayer.bundle/close@2x.png</key>
<data>
SsH5p/CXLMACcwcOcHJAbKTuQPU=
</data>
<key>WMPlayer.bundle/close@3x.png</key>
<data>
2k4y853seS62UYTVdV39vAa8jwQ=
</data>
<key>WMPlayer.bundle/dot@2x.png</key>
<data>
cvaJqxb6td6oZTcp52T16cFnUcM=
</data>
<key>WMPlayer.bundle/dot@3x.png</key>
<data>
xYYDvn6BGHvKAdW+CLw9BPYz86o=
</data>
<key>WMPlayer.bundle/fullscreen@2x.png</key>
<data>
UlhGm8rJ8IjqqwvXIDC+LZmF6qo=
</data>
<key>WMPlayer.bundle/fullscreen@3x.png</key>
<data>
fTtauilnAgh6iNcm4jw78Qw0WmA=
</data>
<key>WMPlayer.bundle/nonfullscreen@2x.png</key>
<data>
pxbQlt8MDqOJc2ASlCLU0jI2iSg=
</data>
<key>WMPlayer.bundle/nonfullscreen@3x.png</key>
<data>
voVBt0TFsihywAZyQ3VoGJZmOVw=
</data>
<key>WMPlayer.bundle/play_new_brightness_day.png</key>
<data>
OLx4JObNQAYwI/AhXdQ/og2onQI=
</data>
<key>WMPlayer.bundle/play_new_brightness_day@2x.png</key>
<data>
Aie1/0pl80iZXyV5QaPrjRvr/Js=
</data>
<key>WMPlayer.bundle/play_new_brightness_night.png</key>
<data>
nNYqNPeaj8pJuSmygmKMr6hXtNs=
</data>
<key>WMPlayer.bundle/play_new_brightness_night@2x.png</key>
<data>
Trs2/AAYA9XqoTbblr7qPjCfZAU=
</data>
<key>WMPlayer.bundle/player_ctrl_icon_next@2x.png</key>
<data>
LCJnBtaYg35Nhq5mawSZFNT2/f0=
</data>
<key>WMPlayer.bundle/player_ctrl_icon_next@3x.png</key>
<data>
8d+gwm49tJSBxZ5hB/4E1uGhNr0=
</data>
<key>WMPlayer.bundle/player_ctrl_icon_pause@2x.png</key>
<data>
Wgw1gZKVLW1GtJLwWLICPf3ismk=
</data>
<key>WMPlayer.bundle/player_ctrl_icon_pause@3x.png</key>
<data>
iDaWkfPef1oWlM5G69Dwch8BSag=
</data>
<key>WMPlayer.bundle/player_ctrl_icon_play@2x.png</key>
<data>
kW/dAhsJhSvZXi1ulSzUPifTRzw=
</data>
<key>WMPlayer.bundle/player_ctrl_icon_play@3x.png</key>
<data>
XjPdMuMumrwFN1dY1yFJ/KcIzkU=
</data>
<key>WMPlayer.bundle/player_icon_download@2x.png</key>
<data>
2gKH+pA18zhUjYMNI1I+Sb/19MY=
</data>
<key>WMPlayer.bundle/player_icon_download@3x.png</key>
<data>
Ra2jpuRuyAoEJUTkyUlLz7QC0DU=
</data>
<key>WMPlayer.bundle/player_icon_fullscreen@2x.png</key>
<data>
ElGHAKPKaj3XT6xsNL4RJGlQjaI=
</data>
<key>WMPlayer.bundle/player_icon_fullscreen@3x.png</key>
<data>
uXG9qoj6WY3bK7NPN6i+5YO9AlI=
</data>
<key>WMPlayer.bundle/player_icon_lock@2x.png</key>
<data>
c3QtzE3/6OkJ2VHvWShpXUn586o=
</data>
<key>WMPlayer.bundle/player_icon_lock@3x.png</key>
<data>
JtzWJmuzOJF6OhSUDkIiZOD+cUU=
</data>
<key>WMPlayer.bundle/player_icon_nav_back@2x.png</key>
<data>
HyxugB0iKmuhOec90ZEUdKCyj4M=
</data>
<key>WMPlayer.bundle/player_icon_nav_back@3x.png</key>
<data>
83aOrfwfRfk5HqygOoKNp+JJD5w=
</data>
<key>WMPlayer.bundle/player_icon_unlock@2x.png</key>
<data>
Cmkkag2fxqqdL2WyY9+TLzeqKos=
</data>
<key>WMPlayer.bundle/player_icon_unlock@3x.png</key>
<data>
1IrT3KsdMaeI9fT575CP0593Nlo=
</data>
<key>WMPlayer.bundle/progress_icon_l@2x.png</key>
<data>
SSzCNvGxL1t9NHUpQ4RexASS5PI=
</data>
<key>WMPlayer.bundle/progress_icon_l@3x.png</key>
<data>
0Xdy8r0ShRjs7fsIfVdiVRWTbQE=
</data>
<key>WMPlayer.bundle/progress_icon_r@2x.png</key>
<data>
D3m46ZaCyMqS+lY825Dg6C7qamk=
</data>
<key>WMPlayer.bundle/progress_icon_r@3x.png</key>
<data>
v/ai6v479+26tOGgVE2tTj3JgX4=
</data>
<key>WMPlayer.bundle/top_shadow.png</key>
<data>
PLhzJccuCcJX+/P5zse/u+RJ5w8=
</data>
<key>WTTabBarView.nib</key>
<data>
CKG4vJGvE2LO0aILofjDqP/1nqo=
</data>
<key>WaitView.nib</key>
<data>
daxAIsUNEESFMJmeUIB4GfOWgD0=
</data>
<key>WebP.sh</key>
<data>
1i/1bEzWpWkHP2cFuIifnIKem/0=
</data>
<key>ZYAlertTableCell.nib</key>
<data>
oqqu9I85MRAUC8PFXKNPFLdTZgA=
</data>
<key>beimian.png</key>
<data>
9DM/K+Zy8M7WnwCAOhegkkwNq4A=
</data>
<key>build.sh</key>
<data>
y7t1TiXvVu2qW3vk0QfPkYGDg3M=
</data>
<key>cameraPre.png</key>
<data>
YrP5JxEyTnGtyOLWpu7IMw4dmdE=
</data>
<key>circleCancel.png</key>
<data>
fLuG+oYnfSC5021019lQn0tKYMI=
</data>
<key>circleRight.png</key>
<data>
uwldafc5sk9cbsqp714i0FR3z4Q=
</data>
<key>closeButton.png</key>
<data>
elSgLqzBZmKn8sKjWzxE2E5TYPk=
</data>
<key>config.xml</key>
<data>
p+nVXQAk2JLfARQWsMff+xTeHE4=
</data>
<key>cordova.js</key>
<data>
O9xXdRiVAIadsdHAWx6V/ZYLFvA=
</data>
<key>de.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
cIfK7Oi6XskM1GIVl/a61k1M3zM=
</data>
<key>optional</key>
<true/>
</dict>
<key>en.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
3m5ZK5pIPc5SqP03ovurZSHGK3Y=
</data>
<key>optional</key>
<true/>
</dict>
<key>es.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
pR/IlAVZgYnZ7oq6Mn2S1t75gwc=
</data>
<key>optional</key>
<true/>
</dict>
<key>giftSent.aac</key>
<data>
rO67egGiKpzRrleUdfw5OENVIgY=
</data>
<key>goodluck.mp4</key>
<data>
73yHwauU7vvVX3YGM4u0sq9v/4Y=
</data>
<key>head-blink.png</key>
<data>
neinEcREgf/JWD3zTPv7LS/863s=
</data>
<key>head-down.png</key>
<data>
MYHzZau+ODeW1JTTAHfQGH1tnjA=
</data>
<key>head-eye.png</key>
<data>
poTBsEwfXWyagVuIAzNXJ5JsLoc=
</data>
<key>head-left.png</key>
<data>
z5TmRm2KE1M5st9/rv114z4XWqA=
</data>
<key>head-openMouse.png</key>
<data>
e5zH4kAnE2FHbXL2qv+EITtw8Us=
</data>
<key>head-right.png</key>
<data>
QkSbnU1Mh3acplmC4o3g9iLo624=
</data>
<key>head-up.png</key>
<data>
M1YXJrSiym/awd2WltqBcncfE0A=
</data>
<key>header_bg_img.png</key>
<data>
FdQqkfrWvOM72eML1gs3X8uBYOQ=
</data>
<key>header_first.png</key>
<data>
oytCCZYbIxA6zZv1vvLYfvIfD9o=
</data>
<key>iv_document_identification1.png</key>
<data>
nsV++npsZf0K08riey52rLvc6aQ=
</data>
<key>ja.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
+dBErWb5Xu/B8eVE3JAW51Zh7Ug=
</data>
<key>optional</key>
<true/>
</dict>
<key>licenceBack.png</key>
<data>
yBCUQM/4nV0kEiEUf5bfRh2Tv88=
</data>
<key>licenceFront.png</key>
<data>
3ZTicQYMasaOD2KmFtowK/F9L/U=
</data>
<key>licenceThumbnailBack.png</key>
<data>
z2twm7d4yOnFGH4q99pt1tWoiKg=
</data>
<key>licenceThumbnailFront.png</key>
<data>
c3etLeE07QjwmNgS3+FumiWarIY=
</data>
<key>meglive_eye_blink2.mp3</key>
<data>
UFChi2w8xDze4bbUXjx+Pjz7S9c=
</data>
<key>meglive_mouth_open2.mp3</key>
<data>
XrtJPwmzCwnRRun7mVHCVZ+uJsM=
</data>
<key>meglive_pitch_down.mp3</key>
<data>
HYc++e/P8+Qc27ZwFcjDVJqsa4g=
</data>
<key>meglive_well_done.mp3</key>
<data>
UwPOUqQ8F5ioNsUcUB+FEtt+pvs=
</data>
<key>meglive_yaw1.mp3</key>
<data>
h9MkDiMYtpzWYWgdITOe7FFLso8=
</data>
<key>on_mic.aac</key>
<data>
YaVEUt8HoAqfZCIQuVee9mlcifw=
</data>
<key>pl.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
sI1fmnwggg61YATanKbqAhh6Pzs=
</data>
<key>optional</key>
<true/>
</dict>
<key>record_test_background.mp3</key>
<data>
lMpK/hgy3dU2lg42ApmwNBcHY8k=
</data>
<key>renxiang.png</key>
<data>
L72x2vPBHA+ZBCy+rO+92oMdwus=
</data>
<key>speed_test.jpg</key>
<data>
LpXXWCxTWD+or7VOD+eiWXySy7o=
</data>
<key>stopAlertView.nib</key>
<data>
RVuOicO80sJAYxWs9JAwoD6Y/ZE=
</data>
<key>takePhoto.png</key>
<data>
7PEHKmDwZkDpDMptPxCXBra/KEE=
</data>
<key>vchat_cheers.m4a</key>
<data>
MieT5HERxD/E+OQ89I1DWZPMjoM=
</data>
<key>zh-Hans.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
RrYzYMJ76snDpMgRrzsh2F9RJCw=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>files2</key>
<dict>
<key>Assets.car</key>
<dict>
<key>hash</key>
<data>
hIg1VKvtH79FJ85P13GTXERGDeI=
</data>
<key>hash2</key>
<data>
wynz4MHhTdVQ7fGvRIYzrWfHeWWA/bA5TKsc8+UuXJw=
</data>
</dict>
<key>AudioPlayerViewController.nib</key>
<dict>
<key>hash</key>
<data>
MN+uwuQuS43O/Ap3tQa/z0+Y8AQ=
</data>
<key>hash2</key>
<data>
RfJ+30g6Ue1KkXM0hkW5Z/OjaeaTb0aYXw10VoCqXV0=
</data>
</dict>
<key>BuLuView.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
/CqdNF4SvsogotdDakWZC3k5J5c=
</data>
<key>hash2</key>
<data>
0pomj7bA1J1n+Jyb+un+83bo2F+KdN/2/+0kV40w9pw=
</data>
</dict>
<key>BuLuView.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
/jj/tOtV08cbim1lWcSN50DgSQ0=
</data>
<key>hash2</key>
<data>
tgqGEnpzRuUez22wUlsMI6EKaXX1bmBg90lXcSYe0PE=
</data>
</dict>
<key>CLLockVC.nib</key>
<dict>
<key>hash</key>
<data>
U/q7CR0hnB4+tVo5dFADBtpKft0=
</data>
<key>hash2</key>
<data>
oE/F7UP2282Kc3iw49h8DPj7a/DQTYg0e93DenWuEeA=
</data>
</dict>
<key>CameraViewController.nib</key>
<dict>
<key>hash</key>
<data>
DctrjLDPAYfHxCQWVrRzSIRkaNE=
</data>
<key>hash2</key>
<data>
zNhmNdM7rnBbMrZzX0A2RP360fNrZXc2mLn8NxqfqQw=
</data>
</dict>
<key>CommonTipView.nib</key>
<dict>
<key>hash</key>
<data>
I6wQ7mo+MeH1FM9k0waSkKw2gV8=
</data>
<key>hash2</key>
<data>
J/7Urj5b/C5mnQGY6JP8G/NDf4R8C6i5JrBI/5sLzPM=
</data>
</dict>
<key>FileManagerViewCell.nib</key>
<dict>
<key>hash</key>
<data>
8yxC2kYqil3iY+iFjrmZn2p1cRg=
</data>
<key>hash2</key>
<data>
kOf6RSjgOQzNqnSMjCcrDnf+L9n55HLInX8jQlHtiJg=
</data>
</dict>
<key>FileManagerViewController.nib</key>
<dict>
<key>hash</key>
<data>
+0E81L/4fGNiBwHJfsk8SNEmaxI=
</data>
<key>hash2</key>
<data>
eQr0bLD7+xAcylGHEiQ52XF3y6P38lpgOarqnydoYZM=
</data>
</dict>
<key>GestureLoginVC.nib</key>
<dict>
<key>hash</key>
<data>
ZZYSnICWrSynJoJadJPcZbAoK9Q=
</data>
<key>hash2</key>
<data>
4ZJVmJUIK5XmmBbHrdBc2LhXWpVMMglHnCo4yDeG4+0=
</data>
</dict>
<key>Headers/UIZZDRView.h</key>
<dict>
<key>hash</key>
<data>
Kf8WuOxGiukKydPSlA4dZrmaUVE=
</data>
<key>hash2</key>
<data>
lQWSXZvEgpxJGZlZxx+fD//2PvzIr/CxE51gBnF6dVg=
</data>
</dict>
<key>Headers/ZDDR.h</key>
<dict>
<key>hash</key>
<data>
Myr+IMhlIff467V/1zQALoTLcQI=
</data>
<key>hash2</key>
<data>
a3dw8pXJ5IPco23ltUk3g6UpHf5BQSAAjKkimC0JYBw=
</data>
</dict>
<key>Headers/ZDDRInit.h</key>
<dict>
<key>hash</key>
<data>
LutdiTm28fz0UWkXEv5SQb+rhnE=
</data>
<key>hash2</key>
<data>
VysrpbUHSt6t96xr38XxOOQV8OdoDwpUq/oAlDaAtyc=
</data>
</dict>
<key>IDCardBack.png</key>
<dict>
<key>hash</key>
<data>
14/n7aw+o7+BeikXEiMVJN10S/s=
</data>
<key>hash2</key>
<data>
89Z86c29lsSkAZoKe0nqoHk5FTym+YbtPCSawh8g0MQ=
</data>
</dict>
<key>IDCardFront.png</key>
<dict>
<key>hash</key>
<data>
WN7f9kLuFQpj56PaJqPOu7gOrZw=
</data>
<key>hash2</key>
<data>
9jQz1XZmmvmMDG0n2OlFztNkGC6tnklwduWC7ux8y1Q=
</data>
</dict>
<key>IDPhotoVC.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
iylBBmGsfXSn4sWMj1Q9DuU2SoM=
</data>
<key>hash2</key>
<data>
FEqBsdTtylMzxWcr+4a3jpu6D6DygWweXgFMajBHv5I=
</data>
</dict>
<key>IDPhotoVC.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
Fr90DbJ0+2keOrtrT4UEUalv/aQ=
</data>
<key>hash2</key>
<data>
1qloEuD9Euxw2t+SzaxL5+t9QULoH5ZsqMOF10Xz/8k=
</data>
</dict>
<key>InfoPlist.strings</key>
<dict>
<key>hash</key>
<data>
E9wT9mmU05B/rSnU9o3egWxmWhc=
</data>
<key>hash2</key>
<data>
7qTUrTMfJMxiegmB9qiAhxA0rahwwKa1hKgJxi36zpE=
</data>
</dict>
<key>LeftTableCell.nib</key>
<dict>
<key>hash</key>
<data>
5N/fY0o5/qBeGzXIgSlul+qSqbk=
</data>
<key>hash2</key>
<data>
uhVEgfhErgWO3NLR8Mwf/5hdL1XDK/rISGQwuRTCbyA=
</data>
</dict>
<key>Localizable.strings</key>
<dict>
<key>hash</key>
<data>
ETMp8cS9g332F+sTa9ojCXfNJDM=
</data>
<key>hash2</key>
<data>
/j0uBAHnUTlbcPBoH/jx/T7Z5f3GvVuz/fciPvjIqV8=
</data>
</dict>
<key>MGFaceDetectionEn.strings</key>
<dict>
<key>hash</key>
<data>
9OaiNnWU14uawZns4PYigPMKltA=
</data>
<key>hash2</key>
<data>
J2kglpIgAD71PW3kTSTfTmlP0ttbJTJtMCG8r7auZa8=
</data>
</dict>
<key>MGFaceDetectionZh.strings</key>
<dict>
<key>hash</key>
<data>
9OaiNnWU14uawZns4PYigPMKltA=
</data>
<key>hash2</key>
<data>
J2kglpIgAD71PW3kTSTfTmlP0ttbJTJtMCG8r7auZa8=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/MGFaceDetectionEn.strings</key>
<dict>
<key>hash</key>
<data>
ljVRlDAQdzcCDOy1JYAKBL8mnVY=
</data>
<key>hash2</key>
<data>
sZpZhyNNSj7ezCGhIwKpx8YFRVXtjsV4LZbArpMYumw=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/MGFaceDetectionZh.strings</key>
<dict>
<key>hash</key>
<data>
QTpmFeJ9oJjHyH1acLV1+ypnB5E=
</data>
<key>hash2</key>
<data>
ebB03uxUK4D5T7mhWCzslV++TbxRdyO0+0VBPKYqJEM=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/MegLive_model</key>
<dict>
<key>hash</key>
<data>
s8YVMdOnhdivFAIYMElA5bJINNM=
</data>
<key>hash2</key>
<data>
Flmfw0C9CLDcz/OuHlcn5kZzMPqv7yUx3soBimIPomA=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/audio/meglive_eye_blink2.mp3</key>
<dict>
<key>hash</key>
<data>
UFChi2w8xDze4bbUXjx+Pjz7S9c=
</data>
<key>hash2</key>
<data>
qXvzRXE0E2voX1BZnp5kGTqd0yM36jAPCE3uiHv+p0w=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/audio/meglive_mouth_open2.mp3</key>
<dict>
<key>hash</key>
<data>
XrtJPwmzCwnRRun7mVHCVZ+uJsM=
</data>
<key>hash2</key>
<data>
gB6d6qEBxf+jPc6WmH+KZiDZCx9DKLygqmoWcfBhWoQ=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/audio/meglive_pitch_down.mp3</key>
<dict>
<key>hash</key>
<data>
HYc++e/P8+Qc27ZwFcjDVJqsa4g=
</data>
<key>hash2</key>
<data>
xicqyoNjMKCiLzydy1dVX0x0GA4Mrw/tGyNte2QDUpY=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/audio/meglive_well_done.mp3</key>
<dict>
<key>hash</key>
<data>
UwPOUqQ8F5ioNsUcUB+FEtt+pvs=
</data>
<key>hash2</key>
<data>
EES/ydREmBD1tY1XPW66BuPpl8YbzM7XCgpQLk6k/RM=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/audio/meglive_yaw1.mp3</key>
<dict>
<key>hash</key>
<data>
h9MkDiMYtpzWYWgdITOe7FFLso8=
</data>
<key>hash2</key>
<data>
HTwhdFT64p/qR7++fSXA0zeWaLmVfTZDlaEZvk2WGM8=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/head-blink.png</key>
<dict>
<key>hash</key>
<data>
5VmT3p9DVT6H7vpjuyruAT8LkuQ=
</data>
<key>hash2</key>
<data>
fsgomaFGq1C+nGYjOtaXx2xPnWu2jOCdGdKX/i1xSJE=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/head-down.png</key>
<dict>
<key>hash</key>
<data>
OdRjg6NfdydX62dyBZ53zaabsvY=
</data>
<key>hash2</key>
<data>
1+I7O9bifEzjW2m4WgQbS5AKisrWFojfvLtaedmgbnQ=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/head-eye.png</key>
<dict>
<key>hash</key>
<data>
ml4MdlVgQt3v2q/yqHnw8+HWe5c=
</data>
<key>hash2</key>
<data>
7N8OWR60TOdPnjSu/hvxHadQQ8OnH1g2Ks05/mjBhjY=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/head-left.png</key>
<dict>
<key>hash</key>
<data>
TWq2kf7V0y7uqGL370ZjTS7ttd8=
</data>
<key>hash2</key>
<data>
JoqAK09wKWHI9ifub4+LF8H/xvwwz0s00+uJd/PCc7Q=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/head-openMouse.png</key>
<dict>
<key>hash</key>
<data>
l3BouNMZAjRJgBvPYn7osucYKLA=
</data>
<key>hash2</key>
<data>
1/dn9gUw766ZguQ0r9AWBp8FxwK1qy1KZ31BcUUSmpk=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/head-right.png</key>
<dict>
<key>hash</key>
<data>
KxrDEzl4i+c6MIVSRo6dx6uIqOY=
</data>
<key>hash2</key>
<data>
KBgHg7TDfusB40N7/2d15cLUfvZDa7Qc7DAi20W7P/o=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/head-up.png</key>
<dict>
<key>hash</key>
<data>
fYsDQRl37nTT+AD1QDCDO2Hs1is=
</data>
<key>hash2</key>
<data>
HW26Su/5LxWJlr/QlOqo/28isfkU8Jaxnhyz5KbSzYY=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/header_bg_img.png</key>
<dict>
<key>hash</key>
<data>
iwBVB7R/g2JIkcwPv0RylOe+6WI=
</data>
<key>hash2</key>
<data>
pdQgPtsxuavzFjGY7RxpWNlUAzVPr10WZxWMO5Oz3iU=
</data>
</dict>
<key>MGLivenessDetectionResource.bundle/image/header_first.png</key>
<dict>
<key>hash</key>
<data>
Awz8HQxz10Hu8GkZmb0dZUcfZIk=
</data>
<key>hash2</key>
<data>
nvomsPip2ZjezAQZaIahErUzAHqF33w3VwSKlO7cawc=
</data>
</dict>
<key>MegLive_model</key>
<dict>
<key>hash</key>
<data>
s8YVMdOnhdivFAIYMElA5bJINNM=
</data>
<key>hash2</key>
<data>
Flmfw0C9CLDcz/OuHlcn5kZzMPqv7yUx3soBimIPomA=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
c5gAHugycBMQtnJwQEvUCel1j14=
</data>
<key>hash2</key>
<data>
ixqXizbpndXqyZhSkRmdzNIF9IW4U1eF2ApF8AIY+sw=
</data>
</dict>
<key>MyPDFHtmlViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
Cciank8voc2iv/iUEU9C55aY1Bg=
</data>
<key>hash2</key>
<data>
Ch0gz5am5l13WGhmB6qzqC1MeTkGepKJq6BxPhsOAHI=
</data>
</dict>
<key>MyPDFHtmlViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
oxmw0qSexT5CiwKVicVw/lBDJpQ=
</data>
<key>hash2</key>
<data>
MM6uO9PqO9M/LSBjllHXM+ObVTwbpbqQT7TN6mWtCTY=
</data>
</dict>
<key>MyWebViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
fL2syeILiR7n+ZD4txkb4PaOzgI=
</data>
<key>hash2</key>
<data>
Rkn+hWWyjGqCjfwifw2dpLoYd8z7MTVhKbOqK9trI48=
</data>
</dict>
<key>MyWebViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
8qAy/QBZFNAw68vc8wYxAJOTYQY=
</data>
<key>hash2</key>
<data>
/8VHmIFr1ox45qkznAzFq4hnqkJk1Z1nIvJEov+1yC4=
</data>
</dict>
<key>PhotoController.nib</key>
<dict>
<key>hash</key>
<data>
NY2mgUmwdJf51u3Le8BeJp+NBj8=
</data>
<key>hash2</key>
<data>
PVBYLDQyXRSgK9OeQ1I5ITMYtvZCm/B/kHKUnusHPUE=
</data>
</dict>
<key>PlayVideoView.nib</key>
<dict>
<key>hash</key>
<data>
9cYUgPELbUXaXrBOA8T8wNXauvk=
</data>
<key>hash2</key>
<data>
jgXDvbEp04xMaC7sA6Ulal5cGFziEVCe0B4xii+4sbU=
</data>
</dict>
<key>QBImagePicker.storyboardc/Info.plist</key>
<dict>
<key>hash</key>
<data>
iwZHbHPu3m3FYRI+FCDLbHeFs44=
</data>
<key>hash2</key>
<data>
gyFhkTx7M92K1jKJpSG0Yl9R+mQfrd/YtnmTaP54ukY=
</data>
</dict>
<key>QBImagePicker.storyboardc/QBAlbumsNavigationController.nib/objects-12.3+.nib</key>
<dict>
<key>hash</key>
<data>
3Y/nFhE9oSgdQuiLXqVOGg3YVVA=
</data>
<key>hash2</key>
<data>
mUXdkb+NxsI+E0gUArmyKTyyxLFfXVhA574uINUR8oc=
</data>
</dict>
<key>QBImagePicker.storyboardc/QBAlbumsNavigationController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
3Y/nFhE9oSgdQuiLXqVOGg3YVVA=
</data>
<key>hash2</key>
<data>
mUXdkb+NxsI+E0gUArmyKTyyxLFfXVhA574uINUR8oc=
</data>
</dict>
<key>QBImagePicker.storyboardc/QBAlbumsViewController.nib/objects-12.3+.nib</key>
<dict>
<key>hash</key>
<data>
G926ZwIQDoI+t6EAuyIl4r6znsI=
</data>
<key>hash2</key>
<data>
oy4PLaoLykiXwECsCS7B2jv9UOBd+soVv2NSRsEFdbg=
</data>
</dict>
<key>QBImagePicker.storyboardc/QBAlbumsViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
G926ZwIQDoI+t6EAuyIl4r6znsI=
</data>
<key>hash2</key>
<data>
oy4PLaoLykiXwECsCS7B2jv9UOBd+soVv2NSRsEFdbg=
</data>
</dict>
<key>QBImagePicker.storyboardc/QBAssetsViewController.nib/objects-12.3+.nib</key>
<dict>
<key>hash</key>
<data>
uMbv/JBFOHUAr8iA2JrL0vSHifM=
</data>
<key>hash2</key>
<data>
W06nLbgSxJKEBC/k3WWhfrK83uDLxgpgO16hI7Bc0kc=
</data>
</dict>
<key>QBImagePicker.storyboardc/QBAssetsViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
uMbv/JBFOHUAr8iA2JrL0vSHifM=
</data>
<key>hash2</key>
<data>
W06nLbgSxJKEBC/k3WWhfrK83uDLxgpgO16hI7Bc0kc=
</data>
</dict>
<key>QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib/objects-12.3+.nib</key>
<dict>
<key>hash</key>
<data>
nRcfyExecCjXy7l/PLEv5B9mCqc=
</data>
<key>hash2</key>
<data>
k6iMP9Hl2kCucQ6Gl2vp5G8HWGzWQJRV17WapI/4MiI=
</data>
</dict>
<key>QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
nRcfyExecCjXy7l/PLEv5B9mCqc=
</data>
<key>hash2</key>
<data>
k6iMP9Hl2kCucQ6Gl2vp5G8HWGzWQJRV17WapI/4MiI=
</data>
</dict>
<key>QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib/objects-12.3+.nib</key>
<dict>
<key>hash</key>
<data>
bFikUb2FGLSr2O3MP0+qk7kDtuM=
</data>
<key>hash2</key>
<data>
q9TKMjA0xiASqtzqXZ+mT6LHD7Q8jPHsGsgJn8TX+cU=
</data>
</dict>
<key>QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
jOYhyTyFw651Apt7IeMMpp0z1Rc=
</data>
<key>hash2</key>
<data>
GbiBKiTnNcTzc5q2GSBRSQPgZIJ6HkfIIjJwwVTJvzc=
</data>
</dict>
<key>README.md</key>
<dict>
<key>hash</key>
<data>
jx5C4dKA1TeQBAqW6Aj8dZwzAPE=
</data>
<key>hash2</key>
<data>
FiySJ7M27H7mBNMmVpvgUYfMRDjs/O1wLZz6OZIQl/k=
</data>
</dict>
<key>ReadMe.txt</key>
<dict>
<key>hash</key>
<data>
rTCsWX99ZYGRyiHUsYlYXS7RSoo=
</data>
<key>hash2</key>
<data>
fkSg3bu3Mfz3D5qbTlRxXtBSSF4J2Q5Vwt72gdpMwr0=
</data>
</dict>
<key>Remote.storyboardc/Iai-uo-IGl-view-aQ3-nL-ARe.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
KB8zBe6yxfrcyp/RE0VX3ktOv80=
</data>
<key>hash2</key>
<data>
o0Tmsqzam6DSZ4aYT59F6FdgkO1cIDsOrSkkjSrbp6E=
</data>
</dict>
<key>Remote.storyboardc/Iai-uo-IGl-view-aQ3-nL-ARe.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
EhAR44vms7004lhqq/PRgdTg47U=
</data>
<key>hash2</key>
<data>
Sh/Nr9pU2DzAVZGUKYVnk68o4nEqOwT6SjfQIU4MXKY=
</data>
</dict>
<key>Remote.storyboardc/Info.plist</key>
<dict>
<key>hash</key>
<data>
bkg9CBtmoGUYVZJt/hl8H0TODz4=
</data>
<key>hash2</key>
<data>
RUUz9MDAqtw1UqpSlIAvccwVPWq8eP7HBL6rjvk0Bqw=
</data>
</dict>
<key>Remote.storyboardc/RemoteMidViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
J4ElJDIdfg2LtZnIxp8vD7bQmD0=
</data>
<key>hash2</key>
<data>
Iec3QCU9YXfwc/KJEie2dGKz2ybufpr1jT2UMnkELhc=
</data>
</dict>
<key>Remote.storyboardc/RemoteMidViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
J4ElJDIdfg2LtZnIxp8vD7bQmD0=
</data>
<key>hash2</key>
<data>
Iec3QCU9YXfwc/KJEie2dGKz2ybufpr1jT2UMnkELhc=
</data>
</dict>
<key>Remote.storyboardc/RemoteRealViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
kuhP9KTqFJVxqmqjmNnPcu4yZhY=
</data>
<key>hash2</key>
<data>
Y8CvZV6SKy/bAIK5MUMVZJQ1jGqAXUbzSYgMv9OXeIY=
</data>
</dict>
<key>Remote.storyboardc/RemoteRealViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
kuhP9KTqFJVxqmqjmNnPcu4yZhY=
</data>
<key>hash2</key>
<data>
Y8CvZV6SKy/bAIK5MUMVZJQ1jGqAXUbzSYgMv9OXeIY=
</data>
</dict>
<key>Remote.storyboardc/RrO-Qu-FLL-view-YGE-t5-x3r.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
9J0zzoJ1GMsigvKGJLqPZKy9S+E=
</data>
<key>hash2</key>
<data>
jK2Dn6r9Aa3DEaLnTWBypA4qu8GqfcT6sKKcXE2VJss=
</data>
</dict>
<key>Remote.storyboardc/RrO-Qu-FLL-view-YGE-t5-x3r.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
s7kadr90S9Rx50IsqkIuPqmRyI4=
</data>
<key>hash2</key>
<data>
nuA8fQYVQgAykVEx0gZFXMIXWxpuxlKkbA8ULDKvxO8=
</data>
</dict>
<key>ReviewResultVC.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
XH29qiv/SFwhu91EWcw/3QMqSJY=
</data>
<key>hash2</key>
<data>
vb1OKtZ/RDPPdlz3k0+N1JPQIUkNnzXb6HJZKB8jV/o=
</data>
</dict>
<key>ReviewResultVC.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
MGTN0cRLz78nVe55/1y1Zhrc4hs=
</data>
<key>hash2</key>
<data>
rnXmqszRpm1nwLBSIsIpBkQ4iKxTLftfTn538GBrTtc=
</data>
</dict>
<key>SCCameraResultController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
2RZizad3LFuLDEsNYCgJPml9VME=
</data>
<key>hash2</key>
<data>
2vjbcST3hRYPQtnNDGIcjAxPl2ULDY912b0xv/pMF1g=
</data>
</dict>
<key>SCCameraResultController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
KYLdC9B/H0/PShcvHpD5GrLnGd8=
</data>
<key>hash2</key>
<data>
hRl1TfYiQEu70T6DPKYHya/h6SrFAXcOChAiA8/Voq8=
</data>
</dict>
<key>SCCameraView.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
sF8aPo1qWzb+hiUJXeOn1LNcNoM=
</data>
<key>hash2</key>
<data>
FZ0Skx/HoUe/CfBQfLoVzwgDBBt90uBol8zd5Dqei2w=
</data>
</dict>
<key>SCCameraView.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
nuEeTJSS2qI25xAgXu2630xi6bY=
</data>
<key>hash2</key>
<data>
mCjMJWHnqXCL6UBuilk2O87Dfcj7q0wS3eDaq3YnksY=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeLeftBottom@2x.png</key>
<dict>
<key>hash</key>
<data>
1Asa7EE5M4xxijAdwdyyD/I8BYs=
</data>
<key>hash2</key>
<data>
pkGmzxT7WP5hX7ZxUscFjEuZnZFwxFHDOZ1Iqc2WmpY=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeLeftBottom@3x.png</key>
<dict>
<key>hash</key>
<data>
A78ylhO6uRMAstuJaVkRAGr2k2c=
</data>
<key>hash2</key>
<data>
s3uJfXt5dJJmoNjXbKn707OYdrutMgtHBjxbzNlVdYI=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeLeftTop@2x.png</key>
<dict>
<key>hash</key>
<data>
UqMF9s1CORMXlruAUAfMy9xWJXA=
</data>
<key>hash2</key>
<data>
dCCR+z018zsCjz4zATE/I9+s5g5BYBXStPmE7FzRm0Q=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeLeftTop@3x.png</key>
<dict>
<key>hash</key>
<data>
fTJviT+hbRyS7GMDECtplbMdzgY=
</data>
<key>hash2</key>
<data>
Pl1tfFwLXFTLOmRorPC5ct1Rnghvb/RssjilVI4eW5o=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeRightBottom@2x.png</key>
<dict>
<key>hash</key>
<data>
YSPqSSvU3bpdPwawUPdmw31Z6Fw=
</data>
<key>hash2</key>
<data>
TO+MqCA4NKW4xnBFafkRh880+8hgKSVR9bSHpNK1ffI=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeRightBottom@3x.png</key>
<dict>
<key>hash</key>
<data>
b8ilDU0zyzLW8Du4/5w7hCy0zyM=
</data>
<key>hash2</key>
<data>
fuQL8u8f17fPp62728lpbtr06pKykgqSyNUKWvbeDnk=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeRightTop@2x.png</key>
<dict>
<key>hash</key>
<data>
dbHMXIn4ns4MVtsDKVqHAXFYyio=
</data>
<key>hash2</key>
<data>
iJlhgiooMpsobQW6dN3YGJlSv9+NomUp13DEfXzWCR8=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeRightTop@3x.png</key>
<dict>
<key>hash</key>
<data>
Xi6nEQ8MzGB5Aag8pEmhbkeukHI=
</data>
<key>hash2</key>
<data>
Xd+j+DPnfZX9ihoLv4U59TIQxlAVgqO8nkdj1tL4I8Y=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeScanningLine@2x.png</key>
<dict>
<key>hash</key>
<data>
kgN7QLnahL4bAVdbmeNoRiAT2MU=
</data>
<key>hash2</key>
<data>
KPxmmMUXgEAxRMeoSn3DZTvF1/bzwpDZJpAq/c7dRPE=
</data>
</dict>
<key>SGQRCode.bundle/QRCodeScanningLine@3x.png</key>
<dict>
<key>hash</key>
<data>
jy1on6QVD+bXiP30mngveDRAplE=
</data>
<key>hash2</key>
<data>
VPXe7VlPXCHqxRlLQAU9Yfluv5/gzkWAR83xZopLrVU=
</data>
</dict>
<key>SGQRCode.bundle/Root.plist</key>
<dict>
<key>hash</key>
<data>
jOhqEUF1/xyY+fuswiWT+ELC3dI=
</data>
<key>hash2</key>
<data>
m26DmegPkB5jwUJkVEtLlObYALX8He100Ny0+NNJg/g=
</data>
</dict>
<key>SGQRCode.bundle/en.lproj/Root.strings</key>
<dict>
<key>hash</key>
<data>
t4KY9Gh4uIiOv7VnHtRrKEuPRY8=
</data>
<key>hash2</key>
<data>
xUzNd7J7w99oAnMIWGe1dAGArHMuEXwQqxSziDU5vLk=
</data>
<key>optional</key>
<true/>
</dict>
<key>SGQRCode.bundle/sound.caf</key>
<dict>
<key>hash</key>
<data>
iZVdiwY7C4RBniEGgPS440vVkRo=
</data>
<key>hash2</key>
<data>
nF6Fi+K3yiQ85bNQ6qX1Zg+XRhxlRV3UWNISmh7b4OM=
</data>
</dict>
<key>SVProgressHUD.bundle/angle-mask.png</key>
<dict>
<key>hash</key>
<data>
oqIJzVxhZua/CZX+TGK3kylFilY=
</data>
<key>hash2</key>
<data>
DDw2jnXp1WjofT+IkD6qy3+dLIzDE9vrxNSPoeQO4jo=
</data>
</dict>
<key>SVProgressHUD.bundle/angle-mask@2x.png</key>
<dict>
<key>hash</key>
<data>
3aAb8SeX29Ro7z1pt6A1yqUAaHs=
</data>
<key>hash2</key>
<data>
6QAJXoYU7vQpTdzUcb2HrKhSj6gCcrZb9r6z0J5yK+w=
</data>
</dict>
<key>SVProgressHUD.bundle/angle-mask@3x.png</key>
<dict>
<key>hash</key>
<data>
pPD0GLNI2PnWq2CX6UyQ9H52T9g=
</data>
<key>hash2</key>
<data>
iwwAX8HeeU70vQudb1L6z80VbnuVeJ+zn94jLMovmKs=
</data>
</dict>
<key>SVProgressHUD.bundle/error.png</key>
<dict>
<key>hash</key>
<data>
oP6f/Zad0pEL8xrimTdNlSXrrpA=
</data>
<key>hash2</key>
<data>
UDk/X+yyN+USnDW9JFp7P9O5irCLZkeybVB1BEDVunA=
</data>
</dict>
<key>SVProgressHUD.bundle/error@2x.png</key>
<dict>
<key>hash</key>
<data>
cFCuvbmEkaKmhj2RThSqw/5KUtM=
</data>
<key>hash2</key>
<data>
Xc9fgzh3g2FX8j9dYqux/gm+73IDul7Vb0KaMAQZo+E=
</data>
</dict>
<key>SVProgressHUD.bundle/error@3x.png</key>
<dict>
<key>hash</key>
<data>
QSlxhLYpqk8M4tlq+X0hXbamUH0=
</data>
<key>hash2</key>
<data>
P6wK1oxOL6vyD7o9q9+hP9jctZaTyluZgm1zpKgw0dM=
</data>
</dict>
<key>SVProgressHUD.bundle/info.png</key>
<dict>
<key>hash</key>
<data>
CP1bXzRkp6v+a6oAHECMgzhmOIU=
</data>
<key>hash2</key>
<data>
GeypxgyrUdKQ8Nyqc9w0q9XLCdtRbk4cJi9EE5QXXs8=
</data>
</dict>
<key>SVProgressHUD.bundle/info@2x.png</key>
<dict>
<key>hash</key>
<data>
yx+ZQImmZJ+j/av7X/uJpzaqomU=
</data>
<key>hash2</key>
<data>
KLsrQZrjUwrsUtZSul1bJbNH8OTb5+YrjaVW+rbl64Q=
</data>
</dict>
<key>SVProgressHUD.bundle/info@3x.png</key>
<dict>
<key>hash</key>
<data>
5MgHR68ek5Ayg9vc2oGqk1wMpdQ=
</data>
<key>hash2</key>
<data>
eer51e9B3uVrPmnlKfYiqok7LLlR6cnUt8JBmo2oG3Y=
</data>
</dict>
<key>SVProgressHUD.bundle/success.png</key>
<dict>
<key>hash</key>
<data>
oQ/IlYYGw5vH/rx4pqvYiNddu8c=
</data>
<key>hash2</key>
<data>
ZneDtnotiia14nbyRklrCVgGmnlPcjpSwUjyHSfPeXc=
</data>
</dict>
<key>SVProgressHUD.bundle/success@2x.png</key>
<dict>
<key>hash</key>
<data>
P1jXd1XGKWq/KG50KF6pWjBVwBo=
</data>
<key>hash2</key>
<data>
hbpOiBtrYWqPZJYnEBIf/dZWn+6rFwHRPp0WzU9gA18=
</data>
</dict>
<key>SVProgressHUD.bundle/success@3x.png</key>
<dict>
<key>hash</key>
<data>
hmliT+WZg212OTNmAhP+uSOyYio=
</data>
<key>hash2</key>
<data>
EMic5PZw5ab7sBUjL5t1YMrH5WnRAJCbgeMLFJgZQ/Q=
</data>
</dict>
<key>SYWCameraResultViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
K6FO/HbhQU6j80Vxw+Goqw29/24=
</data>
<key>hash2</key>
<data>
m7GskIDtfWdyk+ihZJkxYdPcCVputYmyqlkod3gzcLA=
</data>
</dict>
<key>SYWCameraResultViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
ygMZ+ZHI9tugH0N45QCnhUnF4hk=
</data>
<key>hash2</key>
<data>
uyix+XASVVUhkQXPTLspbBhpMp8/IpZKJvRcWqHDqxo=
</data>
</dict>
<key>ScreenProjectionVideoVC.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
yZrOf6Yk6stu0VfKNMZRyShk3j4=
</data>
<key>hash2</key>
<data>
H+UQZFDAnCv8RN6oTeyn8woJ2cNJbsrVXIw051cb5ek=
</data>
</dict>
<key>ScreenProjectionVideoVC.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
mOL2a4ZVkKcXayepbdVgggvkRGU=
</data>
<key>hash2</key>
<data>
1m/e1e0R87iB3N0/cYD1Qy2oXQO7vXlAuJnRrHW6yOI=
</data>
</dict>
<key>TRTC.storyboardc/Info.plist</key>
<dict>
<key>hash</key>
<data>
gjFd8Jrj0eTOsK0z5aD4hci1ZKc=
</data>
<key>hash2</key>
<data>
jmLTC7hBtmtQmrWnbP/hIc/0y+jvryCsnlilSvzpDdE=
</data>
</dict>
<key>TRTC.storyboardc/TRTCMainViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
zQIlRBtHqV51ftEV9qIBngviX9o=
</data>
<key>hash2</key>
<data>
rCeJybkOHCvLKDIgCgbVv+kdhj+0AnRDbh2gbIBpXqU=
</data>
</dict>
<key>TRTC.storyboardc/TRTCMainViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
zQIlRBtHqV51ftEV9qIBngviX9o=
</data>
<key>hash2</key>
<data>
rCeJybkOHCvLKDIgCgbVv+kdhj+0AnRDbh2gbIBpXqU=
</data>
</dict>
<key>TRTC.storyboardc/Ztf-Hn-jJO-view-CWD-6p-pfW.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
i5yPQYiCfm9uTlTl328C3HPTLpc=
</data>
<key>hash2</key>
<data>
a7uoYncMHIgGlr0mRKCX1VmYUmmOcRThzUe5c7IUcfE=
</data>
</dict>
<key>TRTC.storyboardc/Ztf-Hn-jJO-view-CWD-6p-pfW.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
6+CpbZpbziXhJjPpF4+txDb1s/k=
</data>
<key>hash2</key>
<data>
Z8uQfjqpkfYmUr3qG8/3F2iyupq4DCIFjA5XB6FuRYI=
</data>
</dict>
<key>TRTCSettings.storyboardc/Info.plist</key>
<dict>
<key>hash</key>
<data>
Cw6KbfN5ALtN5fY8JFMdFFt6Y+0=
</data>
<key>hash2</key>
<data>
OJy9UpJWN+xTBOQ3ePed6GZ5J2SecMhTb8zXNSU4Vt0=
</data>
</dict>
<key>TRTCSettings.storyboardc/J22-N3-PuQ-view-elt-Ks-vh2.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
SqCW3PrBxSINv15gly4FywEz7Ws=
</data>
<key>hash2</key>
<data>
Mi2sPGNU413KZZbVEL22A1Pgl1v557gUqjrYxfci8/g=
</data>
</dict>
<key>TRTCSettings.storyboardc/J22-N3-PuQ-view-elt-Ks-vh2.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
koUnj6bwuC/EQjqkyLi0cOzYDFg=
</data>
<key>hash2</key>
<data>
BRV0jC0PCNiSyJCTmdBr79/nUfHxRcVzym3/iBXTOWU=
</data>
</dict>
<key>TRTCSettings.storyboardc/TRTCPKSettingsViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
6AseJbcGjPsmrVpx29pUDb8ui8Q=
</data>
<key>hash2</key>
<data>
8aTkyynwbsMrMWlvIBhmZEv9juIx16n25M9OHABsGKs=
</data>
</dict>
<key>TRTCSettings.storyboardc/TRTCPKSettingsViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
6AseJbcGjPsmrVpx29pUDb8ui8Q=
</data>
<key>hash2</key>
<data>
8aTkyynwbsMrMWlvIBhmZEv9juIx16n25M9OHABsGKs=
</data>
</dict>
<key>TRTCSettings.storyboardc/TRTCStreamSettingsViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
0iegeWYDAYAdJ8TouO0IW2lA8zA=
</data>
<key>hash2</key>
<data>
yu4kMymKNFJoMypd2n60JWFTEETPSb9ttN4GscVwkws=
</data>
</dict>
<key>TRTCSettings.storyboardc/TRTCStreamSettingsViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
0iegeWYDAYAdJ8TouO0IW2lA8zA=
</data>
<key>hash2</key>
<data>
yu4kMymKNFJoMypd2n60JWFTEETPSb9ttN4GscVwkws=
</data>
</dict>
<key>TRTCSettings.storyboardc/lji-B9-o0a-view-FEa-Gn-HOa.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
SxRbQAzPPCriSlJqpREmPWrDV7g=
</data>
<key>hash2</key>
<data>
gMJigXYkXrtST+7/7XUiE00n6w/VDQrI3gena+CDrlw=
</data>
</dict>
<key>TRTCSettings.storyboardc/lji-B9-o0a-view-FEa-Gn-HOa.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
lAIXwocrr6fmo4gz9TGyO2OyF7I=
</data>
<key>hash2</key>
<data>
CspBLxCsNhzJgbUV9s6cFrFRzQ9S/b+Xa69CvL4+H+A=
</data>
</dict>
<key>UMSocialSDKResources.bundle/Buttons/UMS_add_friend_off@2x.png</key>
<dict>
<key>hash</key>
<data>
sJE/xo/JIuUVVHdPkDlD8YiY2S0=
</data>
<key>hash2</key>
<data>
q1h8gboawnEfSuWb4vWnSCjT5ochcTqmtuWm8J0zjcY=
</data>
</dict>
<key>UMSocialSDKResources.bundle/Buttons/UMS_delete_image_button_normal@2x.png</key>
<dict>
<key>hash</key>
<data>
1iWpAxsjlOMruXZHu1pXxVR3kFI=
</data>
<key>hash2</key>
<data>
qsg37ah8dt0rUvcV5X1cSD6ESdwyH6BJ693PpaZAanU=
</data>
</dict>
<key>UMSocialSDKResources.bundle/Buttons/UMS_nav_button_close@2x.png</key>
<dict>
<key>hash</key>
<data>
l6AB6WM7o6jD/6r1EDZNymdiYDk=
</data>
<key>hash2</key>
<data>
Wf6kHjFjbOLzoCbR++vnXcF/0agmJ4VraIyWIYhi/RU=
</data>
</dict>
<key>UMSocialSDKResources.bundle/Buttons/UMS_nav_button_send@2x.png</key>
<dict>
<key>hash</key>
<data>
6l9qdc5h8C568MM2z7gpFdbp2/M=
</data>
<key>hash2</key>
<data>
YO45H4M3WmCbt4rbw3PhpocezgigKyXY2K8T9c4oUXU=
</data>
</dict>
<key>UMSocialSDKResources.bundle/Buttons/UMS_url_image@2x.png</key>
<dict>
<key>hash</key>
<data>
fB90DzX7PQBeZCqKrBJDJlS/VjY=
</data>
<key>hash2</key>
<data>
Mqvm5PhxzSzRCtbPexJYZyiYvzf07EKRClVGhDCE5ck=
</data>
</dict>
<key>UMSocialSDKResources.bundle/Buttons/UMS_url_music@2x.png</key>
<dict>
<key>hash</key>
<data>
t5FFEysFBepd0qv1c4FQv9pwLFE=
</data>
<key>hash2</key>
<data>
9epWslxhplNqHVOIN6azJ+lL5j4leyKz5EtPLXInSuU=
</data>
</dict>
<key>UMSocialSDKResources.bundle/Buttons/UMS_url_video@2x.png</key>
<dict>
<key>hash</key>
<data>
BsDS9+SXnjB3x/j9lZw9u0dSTfE=
</data>
<key>hash2</key>
<data>
sH7hA79+l5C9bs0ir7H9BC4FyxNVgFq1GOCI3cwSnxg=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_ap.png</key>
<dict>
<key>hash</key>
<data>
7y+Jri3KeRo4HW93cxsRtHQ3r+E=
</data>
<key>hash2</key>
<data>
xO1t3MMErV572LayzeHL5FSf6tovRC0zugHjGMimQr8=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_default.png</key>
<dict>
<key>hash</key>
<data>
cFQLjPP0LklWBSRhjLJNRiPc+nI=
</data>
<key>hash2</key>
<data>
Y+SS6SA/5vnbeVkManqXsOGM1jtdDnMAICTIhm6xjsE=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_dingding.png</key>
<dict>
<key>hash</key>
<data>
CycuRtZNW5ohMTC8BBzdUfMB6M0=
</data>
<key>hash2</key>
<data>
Nb1ssZ2erJaLORcdPo86RmiEbvjsnFv/00JEcyHWzPY=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_douban.png</key>
<dict>
<key>hash</key>
<data>
ziR2UvmonrHoxKUwAr1WBag0M+Y=
</data>
<key>hash2</key>
<data>
VVu7Y36WmBd6BKJYeoNaZLCdH+llw+9xDnBWQX/tP5U=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_dropbox.png</key>
<dict>
<key>hash</key>
<data>
YVGY/SgX0Mm+AORr0cbKCqf0PKE=
</data>
<key>hash2</key>
<data>
qYOXeiVc3o7DZ2BsostogNzYby2hf2IYztS0A6vWoBU=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_email.png</key>
<dict>
<key>hash</key>
<data>
NVpqAB8V52llxOsxs7u+asJs3b0=
</data>
<key>hash2</key>
<data>
PRCRkUgSdfSkITr+rvBCMvQ4kFFZl7JxH7U47YVsjZA=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_evernote.png</key>
<dict>
<key>hash</key>
<data>
kgU+1BrhXfmxAx6Dg+AjydBE0qU=
</data>
<key>hash2</key>
<data>
U+tgx+QOOgSjLSbmLk/U+Nm7gaZhVQbb6xBWjY39bSk=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_facebook.png</key>
<dict>
<key>hash</key>
<data>
bmHGneGq2NqjUl9eJJl+Zk4hnsY=
</data>
<key>hash2</key>
<data>
fzhG054pGrpwQCtVkToZZATSrItnZazZcLJmjp28JN0=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_facebookmessenger.png</key>
<dict>
<key>hash</key>
<data>
PGdieqYC9yFnr+GT0K0cEAUTxbc=
</data>
<key>hash2</key>
<data>
NsgCLddh3GUlip+ppAceckwkj6oku0PJhPtq3wouz38=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_flickr.png</key>
<dict>
<key>hash</key>
<data>
izfyDFpOlthr5HQeczIkhH822UA=
</data>
<key>hash2</key>
<data>
sfTLy4akeZor2iwvhXjol+VKXP4lC+qkNaiuGc4OxwU=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_googleplus.png</key>
<dict>
<key>hash</key>
<data>
K52WH33dp6rjB4VyTwKT5PnQAXY=
</data>
<key>hash2</key>
<data>
dMxGlw1lJGLfMLBINNK/g5Dt8DfcRytYEo0UXhA06cA=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_instagram.png</key>
<dict>
<key>hash</key>
<data>
PBSRbQ9vzJ01/Gx1xo0OlTF+A6Q=
</data>
<key>hash2</key>
<data>
Kbl9h7s2VlF1nB0jrJB5W+hbnXOe6tsmArmjO0Bowec=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_kakaoTalk.png</key>
<dict>
<key>hash</key>
<data>
mLQlbp14yoPEZE02HE3CybLr154=
</data>
<key>hash2</key>
<data>
ybYV8SoOOsHD/uNofJqONYAFRJtY2UgISfy83lJX+LA=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_line.png</key>
<dict>
<key>hash</key>
<data>
PJZIoBiPhfiNunGB1IPo/GB8n/w=
</data>
<key>hash2</key>
<data>
CVGJoHSlURJKfWhfg60QkOpOnrkkmf3jiIE2qnQp78c=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_linkedin.png</key>
<dict>
<key>hash</key>
<data>
plNJcPjAp5YfSi4cS5orcPGEYHA=
</data>
<key>hash2</key>
<data>
KULGvxr46Emvqj2/xbLa+xj2aoBn1UvfBNse+WUPysA=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_lw_session.png</key>
<dict>
<key>hash</key>
<data>
dXXNMIrfO/Nb3hpPxaXXog+IESo=
</data>
<key>hash2</key>
<data>
XM4+bAMxijuxo9Vp27RdoGFK8y8cagnqUxS7vhcoB6k=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_lw_timeline.png</key>
<dict>
<key>hash</key>
<data>
/SCZVgyQ7rxqmfWsLW/3wMuvnvI=
</data>
<key>hash2</key>
<data>
XlHWZdTiriMOnqxrsLIGf3zU+K/eO1KyKpoEEn7RXqc=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_pinterest.png</key>
<dict>
<key>hash</key>
<data>
BF6qCe2Me+DXfRbNt50OZjDjgBA=
</data>
<key>hash2</key>
<data>
sS+oC82XdhpYRecDj1G1iCBwxM+8qaG8Xqr8Ejd4MCI=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_pocket.png</key>
<dict>
<key>hash</key>
<data>
C1QR+1oY0tpIUkIXiSlw2aQMi+Y=
</data>
<key>hash2</key>
<data>
uKCBqC4NLUoe2bs5VwISgYRgvncvjo7xswWQ57YwXZI=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_qq.png</key>
<dict>
<key>hash</key>
<data>
nymksUkHrUXNN1fa1HFlzje5Suo=
</data>
<key>hash2</key>
<data>
1p02esMo+uOCY00Ssp5D5AXZFPw83RM61lKApfHG0bM=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_qzone.png</key>
<dict>
<key>hash</key>
<data>
Go1xpyG76ewizRfIZK+mVcIhweM=
</data>
<key>hash2</key>
<data>
vcMg2GZAQb4LNdviqNaTCxR6JOnsc9GM7CyQZS//66s=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_renren.png</key>
<dict>
<key>hash</key>
<data>
1sUEoW/u88gzOY8wxpfXsYqflcI=
</data>
<key>hash2</key>
<data>
kBJVmnbdThdVJaWgeQ3nDJpuF5ClgDIm9sivEnseJZ8=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_sina.png</key>
<dict>
<key>hash</key>
<data>
4p/r0SR8/gHZbKurFrHKOn0Qt+s=
</data>
<key>hash2</key>
<data>
HAmPLrcozzDf42k0tmZHoaV7KyBMATS4f23CQ1ODRkQ=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_sms.png</key>
<dict>
<key>hash</key>
<data>
ytWG+UICAmwFAJr9US2ayoDDOII=
</data>
<key>hash2</key>
<data>
6vDDtWs2bJoKCrMikb+x39ZgrmeyUT0LMk1XQ8xxK3o=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_tencentWB.png</key>
<dict>
<key>hash</key>
<data>
9XeAxGecy2BDVvsvnX2zzsEhw6I=
</data>
<key>hash2</key>
<data>
wpqnK5euQmQpDHuh6VcWRHqkulz685t3+W4437LP/EM=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_tim.png</key>
<dict>
<key>hash</key>
<data>
Lz/kYM5RDikSq3guQhpGQXWq280=
</data>
<key>hash2</key>
<data>
BrxaTL9p6skt7S6hBnO0rjya2MN/O3vjpmVGPdYULBA=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_tumblr.png</key>
<dict>
<key>hash</key>
<data>
kyJ3ig9oklTmzhdFo7PX5h9fkR4=
</data>
<key>hash2</key>
<data>
3+7JbK6yfuAbAkRlP+Oz5h5UJW7PabHyb/u/djBsjKY=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_twitter.png</key>
<dict>
<key>hash</key>
<data>
AaRMHlPVEM+yTEBRZr+g+QObA/w=
</data>
<key>hash2</key>
<data>
L74WtDsBM4CQ939XO0Pr56dc+FyZfEVm6bB/HhztY5w=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_vkontakte.png</key>
<dict>
<key>hash</key>
<data>
kU45HUVo54iK5Zq9P75MLTmvrTo=
</data>
<key>hash2</key>
<data>
JpMp2HYEKv6RmKGxnWxAAGggLAw92cJaPMEPRPfCwQU=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_wechat.png</key>
<dict>
<key>hash</key>
<data>
Pii3H3Y9qIOj80UGcTeinu8jT5A=
</data>
<key>hash2</key>
<data>
nWUHzgb1gOsJAwFrj4/8TIAs4Sw6qGCAFzKrmYZzufo=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_wechat_favorite.png</key>
<dict>
<key>hash</key>
<data>
ILj4SIaoqCEW5yxSmxmyU2cV3k4=
</data>
<key>hash2</key>
<data>
1T4AKbSB5qRi5k2wpqjeka6IqfkACcZDhyj2Hhdk1rA=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_wechat_timeline.png</key>
<dict>
<key>hash</key>
<data>
LRwjfEU3D+kU+2loYeFEBC+v72Y=
</data>
<key>hash2</key>
<data>
zzxTjIAekhm0NPY0hLrJzYGlyEM7yujnuuEjXdMjm84=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_whatsapp.png</key>
<dict>
<key>hash</key>
<data>
H3HR7v0WGWx7cXAaUBrg2N3hAiA=
</data>
<key>hash2</key>
<data>
zJQonOrPPRaDKP+Lo7QItsPDneF8RIpjSTAKsiNfCLo=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_yixin_favorite.png</key>
<dict>
<key>hash</key>
<data>
1VWcsLT7NMJBlzwnOyUP0ojjsvY=
</data>
<key>hash2</key>
<data>
WG3+fL4EtBjOIOIWK0VOL5XVV1oQqW2AZ8LXHwjuKbk=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_yixin_session.png</key>
<dict>
<key>hash</key>
<data>
e60x3aYLSFS5IsJZaqUwip2yYwU=
</data>
<key>hash2</key>
<data>
UjHcvryNVeTrApA2nNU+yn+tPQkgyJ8gqVw2F64UfXo=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_yixin_timeline.png</key>
<dict>
<key>hash</key>
<data>
Y7Z4ztTSbum22ZXy55fpz0YdSqo=
</data>
<key>hash2</key>
<data>
8KWTtHul9+Dc/43BniFYFYmzx/6oeCnej8M5WtWLD8I=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialPlatformTheme/default/umsocial_youdaonote.png</key>
<dict>
<key>hash</key>
<data>
FF/j8ZP7l0GoAEyrk/N3dpqTW+M=
</data>
<key>hash2</key>
<data>
SVs90fZGhjp6Q4R25ik3zxFl3khheihbIRaft+cmdbc=
</data>
</dict>
<key>UMSocialSDKResources.bundle/UMSocialWaterMark/umsocial_defaultwatermark.png</key>
<dict>
<key>hash</key>
<data>
MCp9Cs37z59IJrx/INe32jQ8gvg=
</data>
<key>hash2</key>
<data>
+oC0A8Qt780qGFE9czjeY1mHAX1rbIpllH/ukHs4ldc=
</data>
</dict>
<key>UMSocialSDKResources.bundle/en.lproj/UMSocialLocalizable.strings</key>
<dict>
<key>hash</key>
<data>
4LCP76uRV3HMtjzTcK+3PLsaqtE=
</data>
<key>hash2</key>
<data>
ZXkc7AmoQvoFH14L2SIDSj01yHyMRhYAIvwrl5LH0Uk=
</data>
<key>optional</key>
<true/>
</dict>
<key>UMSocialSDKResources.bundle/zh-Hans.lproj/UMSocialLocalizable.strings</key>
<dict>
<key>hash</key>
<data>
LZ460SWfmmxVdgkmpsnwaZrXM0k=
</data>
<key>hash2</key>
<data>
qwWB52ZPynGM1bwxBF1z3okBttdeAyngxHat2FPOIgc=
</data>
<key>optional</key>
<true/>
</dict>
<key>VERSION</key>
<dict>
<key>hash</key>
<data>
NqPOiUrEldjLkAYxns7UnnKZhYc=
</data>
<key>hash2</key>
<data>
Lp+hVg19xAjkKCXIkTP803/6PSp9P5Eash7GshrXbNg=
</data>
</dict>
<key>VideoViewController.nib/objects-11.0+.nib</key>
<dict>
<key>hash</key>
<data>
2fwhLiXg96ImObVCM7Opf5N4Oxo=
</data>
<key>hash2</key>
<data>
HVe24IUd4DBKnq82yUhwL4zfdOFzHIw1d7KUcn1VS7k=
</data>
</dict>
<key>VideoViewController.nib/runtime.nib</key>
<dict>
<key>hash</key>
<data>
/a1DhKQaG7BwvWMXDSEE1s3vVGA=
</data>
<key>hash2</key>
<data>
J5z+sA/pEZblVAK0LyR6gnvUW1/aAlr6g+6zqcxn1zU=
</data>
</dict>
<key>WMPlayer.bundle/bottom_shadow.png</key>
<dict>
<key>hash</key>
<data>
oh1Lgp3Gne8A9SoT2lXlNbCauFM=
</data>
<key>hash2</key>
<data>
mX4YmHbGb+ceoMAfwnB6XQXwQ9EiDgNQBMsKIiycO54=
</data>
</dict>
<key>WMPlayer.bundle/close@2x.png</key>
<dict>
<key>hash</key>
<data>
SsH5p/CXLMACcwcOcHJAbKTuQPU=
</data>
<key>hash2</key>
<data>
dvGeuacVbwGe6cUXG5OOZSb1ip4lL4t+cij9TAE+r94=
</data>
</dict>
<key>WMPlayer.bundle/close@3x.png</key>
<dict>
<key>hash</key>
<data>
2k4y853seS62UYTVdV39vAa8jwQ=
</data>
<key>hash2</key>
<data>
Z/QT+zFCd07n8YN+E2D96r8daQsTMeFNJN/kOvE2Zk4=
</data>
</dict>
<key>WMPlayer.bundle/dot@2x.png</key>
<dict>
<key>hash</key>
<data>
cvaJqxb6td6oZTcp52T16cFnUcM=
</data>
<key>hash2</key>
<data>
sqL1jTG9N0ihNL4Aq/8MaFebRHbiQxU90NsenRk2m9g=
</data>
</dict>
<key>WMPlayer.bundle/dot@3x.png</key>
<dict>
<key>hash</key>
<data>
xYYDvn6BGHvKAdW+CLw9BPYz86o=
</data>
<key>hash2</key>
<data>
k12ra6+Hh18mOabCscD38knvKGa1wiHsz9tEvCDY6rI=
</data>
</dict>
<key>WMPlayer.bundle/fullscreen@2x.png</key>
<dict>
<key>hash</key>
<data>
UlhGm8rJ8IjqqwvXIDC+LZmF6qo=
</data>
<key>hash2</key>
<data>
lHXXgI2j2YN/5ZZVCBPgAQ9ZFuu+cHwBCgJwHT5l99M=
</data>
</dict>
<key>WMPlayer.bundle/fullscreen@3x.png</key>
<dict>
<key>hash</key>
<data>
fTtauilnAgh6iNcm4jw78Qw0WmA=
</data>
<key>hash2</key>
<data>
UKPT/8uEhpdMl7OAljsVdLFs2lCH6gK2wlLtNwbmEhs=
</data>
</dict>
<key>WMPlayer.bundle/nonfullscreen@2x.png</key>
<dict>
<key>hash</key>
<data>
pxbQlt8MDqOJc2ASlCLU0jI2iSg=
</data>
<key>hash2</key>
<data>
paXso8g4WOPqafol23Tf07XX7YnEImwxcr9MQrvctPU=
</data>
</dict>
<key>WMPlayer.bundle/nonfullscreen@3x.png</key>
<dict>
<key>hash</key>
<data>
voVBt0TFsihywAZyQ3VoGJZmOVw=
</data>
<key>hash2</key>
<data>
6YP9LIs94vwZkxklwC9KWtXu7r7mW9sqOQHqv8KFb1Y=
</data>
</dict>
<key>WMPlayer.bundle/play_new_brightness_day.png</key>
<dict>
<key>hash</key>
<data>
OLx4JObNQAYwI/AhXdQ/og2onQI=
</data>
<key>hash2</key>
<data>
AvY4olkbKyy6ARtMI2YBiRAl4ZHMoE6ev8t7gciKgGQ=
</data>
</dict>
<key>WMPlayer.bundle/play_new_brightness_day@2x.png</key>
<dict>
<key>hash</key>
<data>
Aie1/0pl80iZXyV5QaPrjRvr/Js=
</data>
<key>hash2</key>
<data>
lhy00EpTUgFmWdXhYpT7CeF6a4rLsHS7LgzRCY7uDKE=
</data>
</dict>
<key>WMPlayer.bundle/play_new_brightness_night.png</key>
<dict>
<key>hash</key>
<data>
nNYqNPeaj8pJuSmygmKMr6hXtNs=
</data>
<key>hash2</key>
<data>
X7r9IDmx1AMPng3wMXxEDDwWsN9q+peqg9XDQG19B/w=
</data>
</dict>
<key>WMPlayer.bundle/play_new_brightness_night@2x.png</key>
<dict>
<key>hash</key>
<data>
Trs2/AAYA9XqoTbblr7qPjCfZAU=
</data>
<key>hash2</key>
<data>
XbBA3c1qFaT4DiVrOv2Wtsej20k9cPI8OfJXzscvZsM=
</data>
</dict>
<key>WMPlayer.bundle/player_ctrl_icon_next@2x.png</key>
<dict>
<key>hash</key>
<data>
LCJnBtaYg35Nhq5mawSZFNT2/f0=
</data>
<key>hash2</key>
<data>
3AooovDw1oljd0AJCZ1SpXGTc/lPzvqg33sbTbClP0U=
</data>
</dict>
<key>WMPlayer.bundle/player_ctrl_icon_next@3x.png</key>
<dict>
<key>hash</key>
<data>
8d+gwm49tJSBxZ5hB/4E1uGhNr0=
</data>
<key>hash2</key>
<data>
zqgbH5N1n8AnDh7vSazX+ehtmjJwMfMAnMAomlG1UlI=
</data>
</dict>
<key>WMPlayer.bundle/player_ctrl_icon_pause@2x.png</key>
<dict>
<key>hash</key>
<data>
Wgw1gZKVLW1GtJLwWLICPf3ismk=
</data>
<key>hash2</key>
<data>
zf3HczB+q2fBFfG3D9gvHJI8cLQlNKUFthYMoLntYUw=
</data>
</dict>
<key>WMPlayer.bundle/player_ctrl_icon_pause@3x.png</key>
<dict>
<key>hash</key>
<data>
iDaWkfPef1oWlM5G69Dwch8BSag=
</data>
<key>hash2</key>
<data>
Hfzl3Ae0KzszfZTHUk+UW3cUdug8ju2aoWnzLLjJy9s=
</data>
</dict>
<key>WMPlayer.bundle/player_ctrl_icon_play@2x.png</key>
<dict>
<key>hash</key>
<data>
kW/dAhsJhSvZXi1ulSzUPifTRzw=
</data>
<key>hash2</key>
<data>
QlCSVAfaD/ggvtVk+G6SHG4oMJP769GscDE8qFxjreA=
</data>
</dict>
<key>WMPlayer.bundle/player_ctrl_icon_play@3x.png</key>
<dict>
<key>hash</key>
<data>
XjPdMuMumrwFN1dY1yFJ/KcIzkU=
</data>
<key>hash2</key>
<data>
IhA+1undEoKTaJLf3oP77Jd/2Nuxo22PWHnvDexadaA=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_download@2x.png</key>
<dict>
<key>hash</key>
<data>
2gKH+pA18zhUjYMNI1I+Sb/19MY=
</data>
<key>hash2</key>
<data>
5Ouo59Ec1v5YXpDIK2UDJS/0IamTvuzE2WVSbUdHMvk=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_download@3x.png</key>
<dict>
<key>hash</key>
<data>
Ra2jpuRuyAoEJUTkyUlLz7QC0DU=
</data>
<key>hash2</key>
<data>
MuzR3eHjtXPpQQMcTPIiIgxWTxCoxpiwRHPpC+UnuMA=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_fullscreen@2x.png</key>
<dict>
<key>hash</key>
<data>
ElGHAKPKaj3XT6xsNL4RJGlQjaI=
</data>
<key>hash2</key>
<data>
sO9G/8MpBvf2qfCBFHyyccvum/QDFCSbB54C8wdOcO0=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_fullscreen@3x.png</key>
<dict>
<key>hash</key>
<data>
uXG9qoj6WY3bK7NPN6i+5YO9AlI=
</data>
<key>hash2</key>
<data>
Wx1GEGzuMtWtQqWa13/bTLchFdI41LqxIIJPDLuxRIc=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_lock@2x.png</key>
<dict>
<key>hash</key>
<data>
c3QtzE3/6OkJ2VHvWShpXUn586o=
</data>
<key>hash2</key>
<data>
EA/u7K0PFrf/H5kHXCOtqIcRG8EPDDQaGER+gmnq3GM=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_lock@3x.png</key>
<dict>
<key>hash</key>
<data>
JtzWJmuzOJF6OhSUDkIiZOD+cUU=
</data>
<key>hash2</key>
<data>
Q4c1r0WwoZ6FAOVtLsq4NMvY5zzJ7IxjPVQFLEyAFOI=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_nav_back@2x.png</key>
<dict>
<key>hash</key>
<data>
HyxugB0iKmuhOec90ZEUdKCyj4M=
</data>
<key>hash2</key>
<data>
x0t4jlrC3ZPLIw6378NtW7XqxCZ50orAWlnkMyxhTpI=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_nav_back@3x.png</key>
<dict>
<key>hash</key>
<data>
83aOrfwfRfk5HqygOoKNp+JJD5w=
</data>
<key>hash2</key>
<data>
AJDZutApSMiJtDuxd39dgkdKMbap7uXKPrPWZZhoncA=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_unlock@2x.png</key>
<dict>
<key>hash</key>
<data>
Cmkkag2fxqqdL2WyY9+TLzeqKos=
</data>
<key>hash2</key>
<data>
qOWlEXW1V8d6mM1aa139hfIapEWs2mBV9XdxlsLkEko=
</data>
</dict>
<key>WMPlayer.bundle/player_icon_unlock@3x.png</key>
<dict>
<key>hash</key>
<data>
1IrT3KsdMaeI9fT575CP0593Nlo=
</data>
<key>hash2</key>
<data>
5omMN2Kw4T9fNMkiZj83rQc4umRIZf7+isW9RCokKhs=
</data>
</dict>
<key>WMPlayer.bundle/progress_icon_l@2x.png</key>
<dict>
<key>hash</key>
<data>
SSzCNvGxL1t9NHUpQ4RexASS5PI=
</data>
<key>hash2</key>
<data>
yWiEY5zkMsyzg/p3ABZAqnzkMd6a1Vz/x40VRC61nnY=
</data>
</dict>
<key>WMPlayer.bundle/progress_icon_l@3x.png</key>
<dict>
<key>hash</key>
<data>
0Xdy8r0ShRjs7fsIfVdiVRWTbQE=
</data>
<key>hash2</key>
<data>
X90M5VaZr2Jgs0Qt95OAd0h7HNxrrzz5i4/fAMX0KEE=
</data>
</dict>
<key>WMPlayer.bundle/progress_icon_r@2x.png</key>
<dict>
<key>hash</key>
<data>
D3m46ZaCyMqS+lY825Dg6C7qamk=
</data>
<key>hash2</key>
<data>
EugMQdV9rXWwQJTebF1S3+vHJ6qvhHlCZ628ey5Me3A=
</data>
</dict>
<key>WMPlayer.bundle/progress_icon_r@3x.png</key>
<dict>
<key>hash</key>
<data>
v/ai6v479+26tOGgVE2tTj3JgX4=
</data>
<key>hash2</key>
<data>
+nKAhvgOZX/NJTvAYJm6Z5XsTwJUyY4QSdXusC05lXI=
</data>
</dict>
<key>WMPlayer.bundle/top_shadow.png</key>
<dict>
<key>hash</key>
<data>
PLhzJccuCcJX+/P5zse/u+RJ5w8=
</data>
<key>hash2</key>
<data>
oKqE9wG8IbafRcjHCVAJO/nTXBphFFd+fy8k/GsEfKU=
</data>
</dict>
<key>WTTabBarView.nib</key>
<dict>
<key>hash</key>
<data>
CKG4vJGvE2LO0aILofjDqP/1nqo=
</data>
<key>hash2</key>
<data>
PsZLaycBO9o3P6IdzLPXXdxoCaqmYDQqu6NY9evZz3A=
</data>
</dict>
<key>WaitView.nib</key>
<dict>
<key>hash</key>
<data>
daxAIsUNEESFMJmeUIB4GfOWgD0=
</data>
<key>hash2</key>
<data>
Abvkg/cOQm7UIIU5nwlDr2x+KvFFgFtZmM/afCn92XY=
</data>
</dict>
<key>WebP.sh</key>
<dict>
<key>hash</key>
<data>
1i/1bEzWpWkHP2cFuIifnIKem/0=
</data>
<key>hash2</key>
<data>
VqTHqE0Nzh59K2MUymwcPAHo7XdUjJNpo/KYFS7XIdQ=
</data>
</dict>
<key>ZYAlertTableCell.nib</key>
<dict>
<key>hash</key>
<data>
oqqu9I85MRAUC8PFXKNPFLdTZgA=
</data>
<key>hash2</key>
<data>
0palRk4s4NDAdnENyktEnM9Lz0CNL1W9OuqFQf6aECU=
</data>
</dict>
<key>beimian.png</key>
<dict>
<key>hash</key>
<data>
9DM/K+Zy8M7WnwCAOhegkkwNq4A=
</data>
<key>hash2</key>
<data>
AZ0oOReFeg/hUB/u3AFSdgoR6l0c1mndaL82nIwI1Zo=
</data>
</dict>
<key>build.sh</key>
<dict>
<key>hash</key>
<data>
y7t1TiXvVu2qW3vk0QfPkYGDg3M=
</data>
<key>hash2</key>
<data>
fFr1jbCYBj+YU0hjZVwugONUri+SInPUV4qh9F9ypE8=
</data>
</dict>
<key>cameraPre.png</key>
<dict>
<key>hash</key>
<data>
YrP5JxEyTnGtyOLWpu7IMw4dmdE=
</data>
<key>hash2</key>
<data>
1UE70jmCpzKa66Enu0gwlVYi00m+xQWad801trJVTt8=
</data>
</dict>
<key>circleCancel.png</key>
<dict>
<key>hash</key>
<data>
fLuG+oYnfSC5021019lQn0tKYMI=
</data>
<key>hash2</key>
<data>
36dWC6P9ROH8CpfGEooPxBmODYl8u0GPqRxi966qz+0=
</data>
</dict>
<key>circleRight.png</key>
<dict>
<key>hash</key>
<data>
uwldafc5sk9cbsqp714i0FR3z4Q=
</data>
<key>hash2</key>
<data>
IWZCwBxYjNbK5Qk7qq4h/+bHg/cPsU4XudU8ahsc8SY=
</data>
</dict>
<key>closeButton.png</key>
<dict>
<key>hash</key>
<data>
elSgLqzBZmKn8sKjWzxE2E5TYPk=
</data>
<key>hash2</key>
<data>
aNeNd3A0qtvEHVR2gM9uuIzXJ6Q3h5WL5P2ORupkvSc=
</data>
</dict>
<key>config.xml</key>
<dict>
<key>hash</key>
<data>
p+nVXQAk2JLfARQWsMff+xTeHE4=
</data>
<key>hash2</key>
<data>
rlCkZCpI0AyuJd9HAFlEEml8w+UDziSEkL4CPNVxvY8=
</data>
</dict>
<key>cordova.js</key>
<dict>
<key>hash</key>
<data>
O9xXdRiVAIadsdHAWx6V/ZYLFvA=
</data>
<key>hash2</key>
<data>
yRCTykHlqmNf5HMyMygPNsnfrgXVgMvS3ghD6S264hU=
</data>
</dict>
<key>de.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
cIfK7Oi6XskM1GIVl/a61k1M3zM=
</data>
<key>hash2</key>
<data>
i5QzMO0d/kn/2dSTrwhM95g7bTCGe5pOlGWmLkyBsYY=
</data>
<key>optional</key>
<true/>
</dict>
<key>en.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
3m5ZK5pIPc5SqP03ovurZSHGK3Y=
</data>
<key>hash2</key>
<data>
yBo4cKODaBLAcVnMvyuLFnp7XlM669Prp7ButFzK6mY=
</data>
<key>optional</key>
<true/>
</dict>
<key>es.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
pR/IlAVZgYnZ7oq6Mn2S1t75gwc=
</data>
<key>hash2</key>
<data>
tKnEsoQgjbEj/gCaj87B1RlES7zXhiV14NOoxDrmFDk=
</data>
<key>optional</key>
<true/>
</dict>
<key>giftSent.aac</key>
<dict>
<key>hash</key>
<data>
rO67egGiKpzRrleUdfw5OENVIgY=
</data>
<key>hash2</key>
<data>
z++YfKUCjJ+aC+8EddsclVxOmB6DW21Ms4xLXWltQbU=
</data>
</dict>
<key>goodluck.mp4</key>
<dict>
<key>hash</key>
<data>
73yHwauU7vvVX3YGM4u0sq9v/4Y=
</data>
<key>hash2</key>
<data>
zzlJ77ELJYbKiKThtfMNeD2rJERDNpEBRX1md5lqJpA=
</data>
</dict>
<key>head-blink.png</key>
<dict>
<key>hash</key>
<data>
neinEcREgf/JWD3zTPv7LS/863s=
</data>
<key>hash2</key>
<data>
i9j+CCtotEeV8s7p6eMA72HlTddnImqVIXI5W4rGy90=
</data>
</dict>
<key>head-down.png</key>
<dict>
<key>hash</key>
<data>
MYHzZau+ODeW1JTTAHfQGH1tnjA=
</data>
<key>hash2</key>
<data>
sQDxp/0G/23W9KIvDo4emVMlvM/g9tZ8ktxcyhfEOnM=
</data>
</dict>
<key>head-eye.png</key>
<dict>
<key>hash</key>
<data>
poTBsEwfXWyagVuIAzNXJ5JsLoc=
</data>
<key>hash2</key>
<data>
RmZQYvkAsbxmzv9LlDNa98a9OXi3p+ZmTvYOA9RPwEo=
</data>
</dict>
<key>head-left.png</key>
<dict>
<key>hash</key>
<data>
z5TmRm2KE1M5st9/rv114z4XWqA=
</data>
<key>hash2</key>
<data>
RQfd3mirfuSF57EfUFvsAuA4Bt1EAjkXhdc2XteS9QM=
</data>
</dict>
<key>head-openMouse.png</key>
<dict>
<key>hash</key>
<data>
e5zH4kAnE2FHbXL2qv+EITtw8Us=
</data>
<key>hash2</key>
<data>
nA5SgiYXTjOGwFRvzu9kwngW1MWHRQt7IAjinz4eJZ0=
</data>
</dict>
<key>head-right.png</key>
<dict>
<key>hash</key>
<data>
QkSbnU1Mh3acplmC4o3g9iLo624=
</data>
<key>hash2</key>
<data>
4b8nEvGZeuYr2sL437VPztTjBsSOc69FInGDpbVDnLs=
</data>
</dict>
<key>head-up.png</key>
<dict>
<key>hash</key>
<data>
M1YXJrSiym/awd2WltqBcncfE0A=
</data>
<key>hash2</key>
<data>
4k3ToTPAd/mTjxOnSdl2vA2vl3LSqsixVGOn47Lt4hQ=
</data>
</dict>
<key>header_bg_img.png</key>
<dict>
<key>hash</key>
<data>
FdQqkfrWvOM72eML1gs3X8uBYOQ=
</data>
<key>hash2</key>
<data>
AjfN/chLhv0Fld7MLZZavoBGhR3gpdOPlvm4KafAfrA=
</data>
</dict>
<key>header_first.png</key>
<dict>
<key>hash</key>
<data>
oytCCZYbIxA6zZv1vvLYfvIfD9o=
</data>
<key>hash2</key>
<data>
6dhqmvbarvlfewwAb/iZy5IwkXfshxMo8PA48DPotNQ=
</data>
</dict>
<key>iv_document_identification1.png</key>
<dict>
<key>hash</key>
<data>
nsV++npsZf0K08riey52rLvc6aQ=
</data>
<key>hash2</key>
<data>
44PAcTAi0GDEO4WGO7yGc7oyUjVWsrqTHyQPuXX2e18=
</data>
</dict>
<key>ja.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
+dBErWb5Xu/B8eVE3JAW51Zh7Ug=
</data>
<key>hash2</key>
<data>
uUnT2P4dAykMauO7eDuekbKfBiay98uWHVbU5aoyN0E=
</data>
<key>optional</key>
<true/>
</dict>
<key>licenceBack.png</key>
<dict>
<key>hash</key>
<data>
yBCUQM/4nV0kEiEUf5bfRh2Tv88=
</data>
<key>hash2</key>
<data>
ZOxDJzGgqnCWIXD1+bAtNG5H06w1NgkOOpE2CvB6exw=
</data>
</dict>
<key>licenceFront.png</key>
<dict>
<key>hash</key>
<data>
3ZTicQYMasaOD2KmFtowK/F9L/U=
</data>
<key>hash2</key>
<data>
HELo2AkcMR2rmUdUhKkivK3E459PiugJu5WX87SFyK8=
</data>
</dict>
<key>licenceThumbnailBack.png</key>
<dict>
<key>hash</key>
<data>
z2twm7d4yOnFGH4q99pt1tWoiKg=
</data>
<key>hash2</key>
<data>
aJrFprY1b0uCCoHHBm0SztCsyegLA0v0S0nnFlbRX0M=
</data>
</dict>
<key>licenceThumbnailFront.png</key>
<dict>
<key>hash</key>
<data>
c3etLeE07QjwmNgS3+FumiWarIY=
</data>
<key>hash2</key>
<data>
4wtnh2CTH/OhvvMHqmFNLWmAr6zl3uS2CXDW0vVrxlc=
</data>
</dict>
<key>meglive_eye_blink2.mp3</key>
<dict>
<key>hash</key>
<data>
UFChi2w8xDze4bbUXjx+Pjz7S9c=
</data>
<key>hash2</key>
<data>
qXvzRXE0E2voX1BZnp5kGTqd0yM36jAPCE3uiHv+p0w=
</data>
</dict>
<key>meglive_mouth_open2.mp3</key>
<dict>
<key>hash</key>
<data>
XrtJPwmzCwnRRun7mVHCVZ+uJsM=
</data>
<key>hash2</key>
<data>
gB6d6qEBxf+jPc6WmH+KZiDZCx9DKLygqmoWcfBhWoQ=
</data>
</dict>
<key>meglive_pitch_down.mp3</key>
<dict>
<key>hash</key>
<data>
HYc++e/P8+Qc27ZwFcjDVJqsa4g=
</data>
<key>hash2</key>
<data>
xicqyoNjMKCiLzydy1dVX0x0GA4Mrw/tGyNte2QDUpY=
</data>
</dict>
<key>meglive_well_done.mp3</key>
<dict>
<key>hash</key>
<data>
UwPOUqQ8F5ioNsUcUB+FEtt+pvs=
</data>
<key>hash2</key>
<data>
EES/ydREmBD1tY1XPW66BuPpl8YbzM7XCgpQLk6k/RM=
</data>
</dict>
<key>meglive_yaw1.mp3</key>
<dict>
<key>hash</key>
<data>
h9MkDiMYtpzWYWgdITOe7FFLso8=
</data>
<key>hash2</key>
<data>
HTwhdFT64p/qR7++fSXA0zeWaLmVfTZDlaEZvk2WGM8=
</data>
</dict>
<key>on_mic.aac</key>
<dict>
<key>hash</key>
<data>
YaVEUt8HoAqfZCIQuVee9mlcifw=
</data>
<key>hash2</key>
<data>
IfiNOSkSF1t1RBGeDpkHpC8l8nCbrngN8CJkNFnquqY=
</data>
</dict>
<key>pl.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
sI1fmnwggg61YATanKbqAhh6Pzs=
</data>
<key>hash2</key>
<data>
/GsVP5OLu/9E7s8DJrmL8SG4v/Qcu3Ary0wgUeu0J8U=
</data>
<key>optional</key>
<true/>
</dict>
<key>record_test_background.mp3</key>
<dict>
<key>hash</key>
<data>
lMpK/hgy3dU2lg42ApmwNBcHY8k=
</data>
<key>hash2</key>
<data>
AtmtpymR9l+XEXm3KW0HOvL1d9BDatOCPArPrS+SLwM=
</data>
</dict>
<key>renxiang.png</key>
<dict>
<key>hash</key>
<data>
L72x2vPBHA+ZBCy+rO+92oMdwus=
</data>
<key>hash2</key>
<data>
8kF6eZ3fr4clZtaO7KyaJHF2OS+NpXa262oLtKQsCnA=
</data>
</dict>
<key>speed_test.jpg</key>
<dict>
<key>hash</key>
<data>
LpXXWCxTWD+or7VOD+eiWXySy7o=
</data>
<key>hash2</key>
<data>
wDbLt1U6kJ+LiHfURhkkMH8n7LZs/5KO7q/VacOIfik=
</data>
</dict>
<key>stopAlertView.nib</key>
<dict>
<key>hash</key>
<data>
RVuOicO80sJAYxWs9JAwoD6Y/ZE=
</data>
<key>hash2</key>
<data>
fE71rGqlTrsAAU3eabrjF0M843zhB9AwNLlkCmyjwy8=
</data>
</dict>
<key>takePhoto.png</key>
<dict>
<key>hash</key>
<data>
7PEHKmDwZkDpDMptPxCXBra/KEE=
</data>
<key>hash2</key>
<data>
DMWWAvNXH7bDlPip4MFnXMOp2t4yLWjCrsAdTsfiGdU=
</data>
</dict>
<key>vchat_cheers.m4a</key>
<dict>
<key>hash</key>
<data>
MieT5HERxD/E+OQ89I1DWZPMjoM=
</data>
<key>hash2</key>
<data>
63RQhacQ7f9zCC8zDvFO5zX9QI2IjYnoJc0l/1zYrG4=
</data>
</dict>
<key>zh-Hans.lproj/QBImagePicker.strings</key>
<dict>
<key>hash</key>
<data>
RrYzYMJ76snDpMgRrzsh2F9RJCw=
</data>
<key>hash2</key>
<data>
Dt4spQcXRldX8rTPQzlw4+kzqbs54HtAiXCuxTJud1M=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
#!/bin/bash
rm -rf build
mkdir -p build
pushd `pwd`
rm -rf MGBaseKit/build/
xcodebuild -project MGBaseKit.xcodeproj -scheme MGBaseKit -derivedDataPath MGBaseKit/build/ -configuration Release
popd
#copy framework
cp -rp ./MGBaseKit/build/Build/Products/Release-iphoneos/MGBaseKit.framework build/
rm -rf MGBaseKit/build
<?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.
-->
<widget xmlns = "http://www.w3.org/ns/widgets"
id = "io.cordova.helloCordova"
version = "2.0.0">
<name>Hello Cordova</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author href="http://cordova.io" email="dev@cordova.apache.org">
Apache Cordova Team
</author>
<content src="about:blank" />
<!-- Whitelist docs: https://github.com/apache/cordova-plugin-whitelist -->
<access origin="*" />
<!-- Grant certain URLs the ability to launch external applications. This
behaviour is set to match that of Cordova versions before 3.6.0, and
should be reviewed before launching an application in production. It
may be changed in the future. -->
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<!-- Preferences for iOS -->
<preference name="AllowInlineMediaPlayback" value="false" />
<preference name="BackupWebStorage" value="local" />
<preference name="DisallowOverscroll" value="false" />
<preference name="EnableViewportScale" value="false" />
<preference name="KeyboardDisplayRequiresUserAction" value="true" />
<preference name="MediaPlaybackRequiresUserAction" value="false" />
<preference name="SuppressesIncrementalRendering" value="false" />
<preference name="GapBetweenPages" value="0" />
<preference name="PageLength" value="0" />
<preference name="PaginationBreakingMode" value="page" /> <!-- page, column -->
<preference name="PaginationMode" value="unpaginated" /> <!-- unpaginated, leftToRight, topToBottom, bottomToTop, rightToLeft -->
<feature name="LocalStorage">
<param name="ios-package" value="CDVLocalStorage"/>
</feature>
<!--设备-->
<feature name="Pactera">
<param name="ios-package" value="Pactera"/>
</feature>
<feature name="Video">
<param name="ios-package" value="Video"/>
</feature>
<feature name="Camera">
<param name="ios-package" value="Camera"/>
</feature>
</widget>
// Platform: ios
// 49a8db57fa070d20ea7b304a53ffec3d7250c5af
/*
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.
*/
;(function() {
var PLATFORM_VERSION_BUILD_LABEL = '3.9.2';
// file: src/scripts/require.js
/*jshint -W079 */
/*jshint -W020 */
var require,
define;
(function () {
var modules = {},
// Stack of moduleIds currently being built.
requireStack = [],
// Map of module ID -> index into requireStack of modules currently being built.
inProgressModules = {},
SEPARATOR = ".";
function build(module) {
var factory = module.factory,
localRequire = function (id) {
var resultantId = id;
//Its a relative path, so lop off the last portion and add the id (minus "./")
if (id.charAt(0) === ".") {
resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2);
}
return require(resultantId);
};
module.exports = {};
delete module.factory;
factory(localRequire, module.exports, module);
return module.exports;
}
require = function (id) {
if (!modules[id]) {
throw "module " + id + " not found";
} else if (id in inProgressModules) {
var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id;
throw "Cycle in require graph: " + cycle;
}
if (modules[id].factory) {
try {
inProgressModules[id] = requireStack.length;
requireStack.push(id);
return build(modules[id]);
} finally {
delete inProgressModules[id];
requireStack.pop();
}
}
return modules[id].exports;
};
define = function (id, factory) {
if (modules[id]) {
throw "module " + id + " already defined";
}
modules[id] = {
id: id,
factory: factory
};
};
define.remove = function (id) {
delete modules[id];
};
define.moduleMap = modules;
})();
//Export for use in node
if (typeof module === "object" && typeof require === "function") {
module.exports.require = require;
module.exports.define = define;
}
// file: src/cordova.js
define("cordova", function(require, exports, module) {
// Workaround for Windows 10 in hosted environment case
// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object
if (window.cordova && !(window.cordova instanceof HTMLElement)) {
throw new Error("cordova already defined");
}
var channel = require('cordova/channel');
var platform = require('cordova/platform');
/**
* Intercept calls to addEventListener + removeEventListener and handle deviceready,
* resume, and pause events.
*/
var m_document_addEventListener = document.addEventListener;
var m_document_removeEventListener = document.removeEventListener;
var m_window_addEventListener = window.addEventListener;
var m_window_removeEventListener = window.removeEventListener;
/**
* Houses custom event handlers to intercept on document + window event listeners.
*/
var documentEventHandlers = {},
windowEventHandlers = {};
document.addEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
if (typeof documentEventHandlers[e] != 'undefined') {
documentEventHandlers[e].subscribe(handler);
} else {
m_document_addEventListener.call(document, evt, handler, capture);
}
};
window.addEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
if (typeof windowEventHandlers[e] != 'undefined') {
windowEventHandlers[e].subscribe(handler);
} else {
m_window_addEventListener.call(window, evt, handler, capture);
}
};
document.removeEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
// If unsubscribing from an event that is handled by a plugin
if (typeof documentEventHandlers[e] != "undefined") {
documentEventHandlers[e].unsubscribe(handler);
} else {
m_document_removeEventListener.call(document, evt, handler, capture);
}
};
window.removeEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
// If unsubscribing from an event that is handled by a plugin
if (typeof windowEventHandlers[e] != "undefined") {
windowEventHandlers[e].unsubscribe(handler);
} else {
m_window_removeEventListener.call(window, evt, handler, capture);
}
};
function createEvent(type, data) {
var event = document.createEvent('Events');
event.initEvent(type, false, false);
if (data) {
for (var i in data) {
if (data.hasOwnProperty(i)) {
event[i] = data[i];
}
}
}
return event;
}
var cordova = {
define:define,
require:require,
version:PLATFORM_VERSION_BUILD_LABEL,
platformVersion:PLATFORM_VERSION_BUILD_LABEL,
platformId:platform.id,
/**
* Methods to add/remove your own addEventListener hijacking on document + window.
*/
addWindowEventHandler:function(event) {
return (windowEventHandlers[event] = channel.create(event));
},
addStickyDocumentEventHandler:function(event) {
return (documentEventHandlers[event] = channel.createSticky(event));
},
addDocumentEventHandler:function(event) {
return (documentEventHandlers[event] = channel.create(event));
},
removeWindowEventHandler:function(event) {
delete windowEventHandlers[event];
},
removeDocumentEventHandler:function(event) {
delete documentEventHandlers[event];
},
/**
* Retrieve original event handlers that were replaced by Cordova
*
* @return object
*/
getOriginalHandlers: function() {
return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
},
/**
* Method to fire event from native code
* bNoDetach is required for events which cause an exception which needs to be caught in native code
*/
fireDocumentEvent: function(type, data, bNoDetach) {
var evt = createEvent(type, data);
if (typeof documentEventHandlers[type] != 'undefined') {
if( bNoDetach ) {
documentEventHandlers[type].fire(evt);
}
else {
setTimeout(function() {
// Fire deviceready on listeners that were registered before cordova.js was loaded.
if (type == 'deviceready') {
document.dispatchEvent(evt);
}
documentEventHandlers[type].fire(evt);
}, 0);
}
} else {
document.dispatchEvent(evt);
}
},
fireWindowEvent: function(type, data) {
var evt = createEvent(type,data);
if (typeof windowEventHandlers[type] != 'undefined') {
setTimeout(function() {
windowEventHandlers[type].fire(evt);
}, 0);
} else {
window.dispatchEvent(evt);
}
},
/**
* Plugin callback mechanism.
*/
// Randomize the starting callbackId to avoid collisions after refreshing or navigating.
// This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
callbackId: Math.floor(Math.random() * 2000000000),
callbacks: {},
callbackStatus: {
NO_RESULT: 0,
OK: 1,
CLASS_NOT_FOUND_EXCEPTION: 2,
ILLEGAL_ACCESS_EXCEPTION: 3,
INSTANTIATION_EXCEPTION: 4,
MALFORMED_URL_EXCEPTION: 5,
IO_EXCEPTION: 6,
INVALID_ACTION: 7,
JSON_EXCEPTION: 8,
ERROR: 9
},
/**
* Called by native code when returning successful result from an action.
*/
callbackSuccess: function(callbackId, args) {
cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
},
/**
* Called by native code when returning error result from an action.
*/
callbackError: function(callbackId, args) {
// TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
// Derive success from status.
cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
},
/**
* Called by native code when returning the result from an action.
*/
callbackFromNative: function(callbackId, isSuccess, status, args, keepCallback) {
try {
var callback = cordova.callbacks[callbackId];
if (callback) {
if (isSuccess && status == cordova.callbackStatus.OK) {
callback.success && callback.success.apply(null, args);
} else if (!isSuccess) {
callback.fail && callback.fail.apply(null, args);
}
/*
else
Note, this case is intentionally not caught.
this can happen if isSuccess is true, but callbackStatus is NO_RESULT
which is used to remove a callback from the list without calling the callbacks
typically keepCallback is false in this case
*/
// Clear callback if not expecting any more results
if (!keepCallback) {
delete cordova.callbacks[callbackId];
}
}
}
catch (err) {
var msg = "Error in " + (isSuccess ? "Success" : "Error") + " callbackId: " + callbackId + " : " + err;
console && console.log && console.log(msg);
cordova.fireWindowEvent("cordovacallbackerror", { 'message': msg });
throw err;
}
},
addConstructor: function(func) {
channel.onCordovaReady.subscribe(function() {
try {
func();
} catch(e) {
console.log("Failed to run constructor: " + e);
}
});
}
};
module.exports = cordova;
});
// file: src/common/argscheck.js
define("cordova/argscheck", function(require, exports, module) {
var utils = require('cordova/utils');
var moduleExports = module.exports;
var typeMap = {
'A': 'Array',
'D': 'Date',
'N': 'Number',
'S': 'String',
'F': 'Function',
'O': 'Object'
};
function extractParamName(callee, argIndex) {
return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];
}
function checkArgs(spec, functionName, args, opt_callee) {
if (!moduleExports.enableChecks) {
return;
}
var errMsg = null;
var typeName;
for (var i = 0; i < spec.length; ++i) {
var c = spec.charAt(i),
cUpper = c.toUpperCase(),
arg = args[i];
// Asterix means allow anything.
if (c == '*') {
continue;
}
typeName = utils.typeName(arg);
if ((arg === null || arg === undefined) && c == cUpper) {
continue;
}
if (typeName != typeMap[cUpper]) {
errMsg = 'Expected ' + typeMap[cUpper];
break;
}
}
if (errMsg) {
errMsg += ', but got ' + typeName + '.';
errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
// Don't log when running unit tests.
if (typeof jasmine == 'undefined') {
console.error(errMsg);
}
throw TypeError(errMsg);
}
}
function getValue(value, defaultValue) {
return value === undefined ? defaultValue : value;
}
moduleExports.checkArgs = checkArgs;
moduleExports.getValue = getValue;
moduleExports.enableChecks = true;
});
// file: src/common/base64.js
define("cordova/base64", function(require, exports, module) {
var base64 = exports;
base64.fromArrayBuffer = function(arrayBuffer) {
var array = new Uint8Array(arrayBuffer);
return uint8ToBase64(array);
};
base64.toArrayBuffer = function(str) {
var decodedStr = typeof atob != 'undefined' ? atob(str) : new Buffer(str,'base64').toString('binary');
var arrayBuffer = new ArrayBuffer(decodedStr.length);
var array = new Uint8Array(arrayBuffer);
for (var i=0, len=decodedStr.length; i < len; i++) {
array[i] = decodedStr.charCodeAt(i);
}
return arrayBuffer;
};
//------------------------------------------------------------------------------
/* This code is based on the performance tests at http://jsperf.com/b64tests
* This 12-bit-at-a-time algorithm was the best performing version on all
* platforms tested.
*/
var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64_12bit;
var b64_12bitTable = function() {
b64_12bit = [];
for (var i=0; i<64; i++) {
for (var j=0; j<64; j++) {
b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j];
}
}
b64_12bitTable = function() { return b64_12bit; };
return b64_12bit;
};
function uint8ToBase64(rawData) {
var numBytes = rawData.byteLength;
var output="";
var segment;
var table = b64_12bitTable();
for (var i=0;i<numBytes-2;i+=3) {
segment = (rawData[i] << 16) + (rawData[i+1] << 8) + rawData[i+2];
output += table[segment >> 12];
output += table[segment & 0xfff];
}
if (numBytes - i == 2) {
segment = (rawData[i] << 16) + (rawData[i+1] << 8);
output += table[segment >> 12];
output += b64_6bit[(segment & 0xfff) >> 6];
output += '=';
} else if (numBytes - i == 1) {
segment = (rawData[i] << 16);
output += table[segment >> 12];
output += '==';
}
return output;
}
});
// file: src/common/builder.js
define("cordova/builder", function(require, exports, module) {
var utils = require('cordova/utils');
function each(objects, func, context) {
for (var prop in objects) {
if (objects.hasOwnProperty(prop)) {
func.apply(context, [objects[prop], prop]);
}
}
}
function clobber(obj, key, value) {
exports.replaceHookForTesting(obj, key);
var needsProperty = false;
try {
obj[key] = value;
} catch (e) {
needsProperty = true;
}
// Getters can only be overridden by getters.
if (needsProperty || obj[key] !== value) {
utils.defineGetter(obj, key, function() {
return value;
});
}
}
function assignOrWrapInDeprecateGetter(obj, key, value, message) {
if (message) {
utils.defineGetter(obj, key, function() {
console.log(message);
delete obj[key];
clobber(obj, key, value);
return value;
});
} else {
clobber(obj, key, value);
}
}
function include(parent, objects, clobber, merge) {
each(objects, function (obj, key) {
try {
var result = obj.path ? require(obj.path) : {};
if (clobber) {
// Clobber if it doesn't exist.
if (typeof parent[key] === 'undefined') {
assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
} else if (typeof obj.path !== 'undefined') {
// If merging, merge properties onto parent, otherwise, clobber.
if (merge) {
recursiveMerge(parent[key], result);
} else {
assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
}
}
result = parent[key];
} else {
// Overwrite if not currently defined.
if (typeof parent[key] == 'undefined') {
assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
} else {
// Set result to what already exists, so we can build children into it if they exist.
result = parent[key];
}
}
if (obj.children) {
include(result, obj.children, clobber, merge);
}
} catch(e) {
utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"');
}
});
}
/**
* Merge properties from one object onto another recursively. Properties from
* the src object will overwrite existing target property.
*
* @param target Object to merge properties into.
* @param src Object to merge properties from.
*/
function recursiveMerge(target, src) {
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
if (target.prototype && target.prototype.constructor === target) {
// If the target object is a constructor override off prototype.
clobber(target.prototype, prop, src[prop]);
} else {
if (typeof src[prop] === 'object' && typeof target[prop] === 'object') {
recursiveMerge(target[prop], src[prop]);
} else {
clobber(target, prop, src[prop]);
}
}
}
}
}
exports.buildIntoButDoNotClobber = function(objects, target) {
include(target, objects, false, false);
};
exports.buildIntoAndClobber = function(objects, target) {
include(target, objects, true, false);
};
exports.buildIntoAndMerge = function(objects, target) {
include(target, objects, true, true);
};
exports.recursiveMerge = recursiveMerge;
exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter;
exports.replaceHookForTesting = function() {};
});
// file: src/common/channel.js
define("cordova/channel", function(require, exports, module) {
var utils = require('cordova/utils'),
nextGuid = 1;
/**
* Custom pub-sub "channel" that can have functions subscribed to it
* This object is used to define and control firing of events for
* cordova initialization, as well as for custom events thereafter.
*
* The order of events during page load and Cordova startup is as follows:
*
* onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed.
* onNativeReady* Internal event that indicates the Cordova native side is ready.
* onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created.
* onDeviceReady* User event fired to indicate that Cordova is ready
* onResume User event fired to indicate a start/resume lifecycle event
* onPause User event fired to indicate a pause lifecycle event
*
* The events marked with an * are sticky. Once they have fired, they will stay in the fired state.
* All listeners that subscribe after the event is fired will be executed right away.
*
* The only Cordova events that user code should register for are:
* deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript
* pause App has moved to background
* resume App has returned to foreground
*
* Listeners can be registered as:
* document.addEventListener("deviceready", myDeviceReadyListener, false);
* document.addEventListener("resume", myResumeListener, false);
* document.addEventListener("pause", myPauseListener, false);
*
* The DOM lifecycle events should be used for saving and restoring state
* window.onload
* window.onunload
*
*/
/**
* Channel
* @constructor
* @param type String the channel name
*/
var Channel = function(type, sticky) {
this.type = type;
// Map of guid -> function.
this.handlers = {};
// 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
this.state = sticky ? 1 : 0;
// Used in sticky mode to remember args passed to fire().
this.fireArgs = null;
// Used by onHasSubscribersChange to know if there are any listeners.
this.numHandlers = 0;
// Function that is called when the first listener is subscribed, or when
// the last listener is unsubscribed.
this.onHasSubscribersChange = null;
},
channel = {
/**
* Calls the provided function only after all of the channels specified
* have been fired. All channels must be sticky channels.
*/
join: function(h, c) {
var len = c.length,
i = len,
f = function() {
if (!(--i)) h();
};
for (var j=0; j<len; j++) {
if (c[j].state === 0) {
throw Error('Can only use join with sticky channels.');
}
c[j].subscribe(f);
}
if (!len) h();
},
create: function(type) {
return channel[type] = new Channel(type, false);
},
createSticky: function(type) {
return channel[type] = new Channel(type, true);
},
/**
* cordova Channels that must fire before "deviceready" is fired.
*/
deviceReadyChannelsArray: [],
deviceReadyChannelsMap: {},
/**
* Indicate that a feature needs to be initialized before it is ready to be used.
* This holds up Cordova's "deviceready" event until the feature has been initialized
* and Cordova.initComplete(feature) is called.
*
* @param feature {String} The unique feature name
*/
waitForInitialization: function(feature) {
if (feature) {
var c = channel[feature] || this.createSticky(feature);
this.deviceReadyChannelsMap[feature] = c;
this.deviceReadyChannelsArray.push(c);
}
},
/**
* Indicate that initialization code has completed and the feature is ready to be used.
*
* @param feature {String} The unique feature name
*/
initializationComplete: function(feature) {
var c = this.deviceReadyChannelsMap[feature];
if (c) {
c.fire();
}
}
};
function forceFunction(f) {
if (typeof f != 'function') throw "Function required as first argument!";
}
/**
* Subscribes the given function to the channel. Any time that
* Channel.fire is called so too will the function.
* Optionally specify an execution context for the function
* and a guid that can be used to stop subscribing to the channel.
* Returns the guid.
*/
Channel.prototype.subscribe = function(f, c) {
// need a function to call
forceFunction(f);
if (this.state == 2) {
f.apply(c || this, this.fireArgs);
return;
}
var func = f,
guid = f.observer_guid;
if (typeof c == "object") { func = utils.close(c, f); }
if (!guid) {
// first time any channel has seen this subscriber
guid = '' + nextGuid++;
}
func.observer_guid = guid;
f.observer_guid = guid;
// Don't add the same handler more than once.
if (!this.handlers[guid]) {
this.handlers[guid] = func;
this.numHandlers++;
if (this.numHandlers == 1) {
this.onHasSubscribersChange && this.onHasSubscribersChange();
}
}
};
/**
* Unsubscribes the function with the given guid from the channel.
*/
Channel.prototype.unsubscribe = function(f) {
// need a function to unsubscribe
forceFunction(f);
var guid = f.observer_guid,
handler = this.handlers[guid];
if (handler) {
delete this.handlers[guid];
this.numHandlers--;
if (this.numHandlers === 0) {
this.onHasSubscribersChange && this.onHasSubscribersChange();
}
}
};
/**
* Calls all functions subscribed to this channel.
*/
Channel.prototype.fire = function(e) {
var fail = false,
fireArgs = Array.prototype.slice.call(arguments);
// Apply stickiness.
if (this.state == 1) {
this.state = 2;
this.fireArgs = fireArgs;
}
if (this.numHandlers) {
// Copy the values first so that it is safe to modify it from within
// callbacks.
var toCall = [];
for (var item in this.handlers) {
toCall.push(this.handlers[item]);
}
for (var i = 0; i < toCall.length; ++i) {
toCall[i].apply(this, fireArgs);
}
if (this.state == 2 && this.numHandlers) {
this.numHandlers = 0;
this.handlers = {};
this.onHasSubscribersChange && this.onHasSubscribersChange();
}
}
};
// defining them here so they are ready super fast!
// DOM event that is received when the web page is loaded and parsed.
channel.createSticky('onDOMContentLoaded');
// Event to indicate the Cordova native side is ready.
channel.createSticky('onNativeReady');
// Event to indicate that all Cordova JavaScript objects have been created
// and it's time to run plugin constructors.
channel.createSticky('onCordovaReady');
// Event to indicate that all automatically loaded JS plugins are loaded and ready.
// FIXME remove this
channel.createSticky('onPluginsReady');
// Event to indicate that Cordova is ready
channel.createSticky('onDeviceReady');
// Event to indicate a resume lifecycle event
channel.create('onResume');
// Event to indicate a pause lifecycle event
channel.create('onPause');
// Channels that must fire before "deviceready" is fired.
channel.waitForInitialization('onCordovaReady');
channel.waitForInitialization('onDOMContentLoaded');
module.exports = channel;
});
// file: e:/cordova/cordova-ios/cordova-js-src/exec.js
define("cordova/exec", function(require, exports, module) {
/**
* Creates a gap bridge iframe used to notify the native code about queued
* commands.
*/
var cordova = require('cordova'),
channel = require('cordova/channel'),
utils = require('cordova/utils'),
base64 = require('cordova/base64'),
// XHR mode does not work on iOS 4.2.
// XHR mode's main advantage is working around a bug in -webkit-scroll, which
// doesn't exist only on iOS 5.x devices.
// IFRAME_NAV is the fastest.
// IFRAME_HASH could be made to enable synchronous bridge calls if we wanted this feature.
jsToNativeModes = {
IFRAME_NAV: 0, // Default. Uses a new iframe for each poke.
// XHR bridge appears to be flaky sometimes: CB-3900, CB-3359, CB-5457, CB-4970, CB-4998, CB-5134
XHR_NO_PAYLOAD: 1, // About the same speed as IFRAME_NAV. Performance not about the same as IFRAME_NAV, but more variable.
XHR_WITH_PAYLOAD: 2, // Flakey, and not as performant
XHR_OPTIONAL_PAYLOAD: 3, // Flakey, and not as performant
IFRAME_HASH_NO_PAYLOAD: 4, // Not fully baked. A bit faster than IFRAME_NAV, but risks jank since poke happens synchronously.
IFRAME_HASH_WITH_PAYLOAD: 5, // Slower than no payload. Maybe since it has to be URI encoded / decoded.
WK_WEBVIEW_BINDING: 6 // Only way that works for WKWebView :)
},
bridgeMode,
execIframe,
execHashIframe,
hashToggle = 1,
execXhr,
requestCount = 0,
vcHeaderValue = null,
commandQueue = [], // Contains pending JS->Native messages.
isInContextOfEvalJs = 0,
failSafeTimerId = 0;
function shouldBundleCommandJson() {
if (bridgeMode === jsToNativeModes.XHR_WITH_PAYLOAD) {
return true;
}
if (bridgeMode === jsToNativeModes.XHR_OPTIONAL_PAYLOAD) {
var payloadLength = 0;
for (var i = 0; i < commandQueue.length; ++i) {
payloadLength += commandQueue[i].length;
}
// The value here was determined using the benchmark within CordovaLibApp on an iPad 3.
return payloadLength < 4500;
}
return false;
}
function massageArgsJsToNative(args) {
if (!args || utils.typeName(args) != 'Array') {
return args;
}
var ret = [];
args.forEach(function(arg, i) {
if (utils.typeName(arg) == 'ArrayBuffer') {
ret.push({
'CDVType': 'ArrayBuffer',
'data': base64.fromArrayBuffer(arg)
});
} else {
ret.push(arg);
}
});
return ret;
}
function massageMessageNativeToJs(message) {
if (message.CDVType == 'ArrayBuffer') {
var stringToArrayBuffer = function(str) {
var ret = new Uint8Array(str.length);
for (var i = 0; i < str.length; i++) {
ret[i] = str.charCodeAt(i);
}
return ret.buffer;
};
var base64ToArrayBuffer = function(b64) {
return stringToArrayBuffer(atob(b64));
};
message = base64ToArrayBuffer(message.data);
}
return message;
}
function convertMessageToArgsNativeToJs(message) {
var args = [];
if (!message || !message.hasOwnProperty('CDVType')) {
args.push(message);
} else if (message.CDVType == 'MultiPart') {
message.messages.forEach(function(e) {
args.push(massageMessageNativeToJs(e));
});
} else {
args.push(massageMessageNativeToJs(message));
}
return args;
}
function iOSExec() {
if (bridgeMode === undefined) {
bridgeMode = jsToNativeModes.IFRAME_NAV;
}
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.cordova && window.webkit.messageHandlers.cordova.postMessage) {
bridgeMode = jsToNativeModes.WK_WEBVIEW_BINDING;
}
var successCallback, failCallback, service, action, actionArgs, splitCommand;
var callbackId = null;
if (typeof arguments[0] !== "string") {
// FORMAT ONE
successCallback = arguments[0];
failCallback = arguments[1];
service = arguments[2];
action = arguments[3];
actionArgs = arguments[4];
// Since we need to maintain backwards compatibility, we have to pass
// an invalid callbackId even if no callback was provided since plugins
// will be expecting it. The Cordova.exec() implementation allocates
// an invalid callbackId and passes it even if no callbacks were given.
callbackId = 'INVALID';
} else {
// FORMAT TWO, REMOVED
try {
splitCommand = arguments[0].split(".");
action = splitCommand.pop();
service = splitCommand.join(".");
actionArgs = Array.prototype.splice.call(arguments, 1);
console.log('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' +
"cordova.exec(null, null, \"" + service + "\", \"" + action + "\"," + JSON.stringify(actionArgs) + ");"
);
return;
} catch (e) {}
}
// If actionArgs is not provided, default to an empty array
actionArgs = actionArgs || [];
// Register the callbacks and add the callbackId to the positional
// arguments if given.
if (successCallback || failCallback) {
callbackId = service + cordova.callbackId++;
cordova.callbacks[callbackId] =
{success:successCallback, fail:failCallback};
}
actionArgs = massageArgsJsToNative(actionArgs);
var command = [callbackId, service, action, actionArgs];
// Stringify and queue the command. We stringify to command now to
// effectively clone the command arguments in case they are mutated before
// the command is executed.
commandQueue.push(JSON.stringify(command));
if (bridgeMode === jsToNativeModes.WK_WEBVIEW_BINDING) {
window.webkit.messageHandlers.cordova.postMessage(command);
} else {
// If we're in the context of a stringByEvaluatingJavaScriptFromString call,
// then the queue will be flushed when it returns; no need for a poke.
// Also, if there is already a command in the queue, then we've already
// poked the native side, so there is no reason to do so again.
if (!isInContextOfEvalJs && commandQueue.length == 1) {
pokeNative();
}
}
}
function pokeNative() {
switch (bridgeMode) {
case jsToNativeModes.XHR_NO_PAYLOAD:
case jsToNativeModes.XHR_WITH_PAYLOAD:
case jsToNativeModes.XHR_OPTIONAL_PAYLOAD:
pokeNativeViaXhr();
break;
default: // iframe-based.
pokeNativeViaIframe();
}
}
function pokeNativeViaXhr() {
// This prevents sending an XHR when there is already one being sent.
// This should happen only in rare circumstances (refer to unit tests).
if (execXhr && execXhr.readyState != 4) {
execXhr = null;
}
// Re-using the XHR improves exec() performance by about 10%.
execXhr = execXhr || new XMLHttpRequest();
// Changing this to a GET will make the XHR reach the URIProtocol on 4.2.
// For some reason it still doesn't work though...
// Add a timestamp to the query param to prevent caching.
execXhr.open('HEAD', "/!gap_exec?" + (+new Date()), true);
if (!vcHeaderValue) {
vcHeaderValue = /.*\((.*)\)$/.exec(navigator.userAgent)[1];
}
execXhr.setRequestHeader('vc', vcHeaderValue);
execXhr.setRequestHeader('rc', ++requestCount);
if (shouldBundleCommandJson()) {
execXhr.setRequestHeader('cmds', iOSExec.nativeFetchMessages());
}
execXhr.send(null);
}
function pokeNativeViaIframe() {
// CB-5488 - Don't attempt to create iframe before document.body is available.
if (!document.body) {
setTimeout(pokeNativeViaIframe);
return;
}
if (bridgeMode === jsToNativeModes.IFRAME_HASH_NO_PAYLOAD || bridgeMode === jsToNativeModes.IFRAME_HASH_WITH_PAYLOAD) {
// TODO: This bridge mode doesn't properly support being removed from the DOM (CB-7735)
if (!execHashIframe) {
execHashIframe = document.createElement('iframe');
execHashIframe.style.display = 'none';
document.body.appendChild(execHashIframe);
// Hash changes don't work on about:blank, so switch it to file:///.
execHashIframe.contentWindow.history.replaceState(null, null, 'file:///#');
}
// The delegate method is called only when the hash changes, so toggle it back and forth.
hashToggle = hashToggle ^ 3;
var hashValue = '%0' + hashToggle;
if (bridgeMode === jsToNativeModes.IFRAME_HASH_WITH_PAYLOAD) {
hashValue += iOSExec.nativeFetchMessages();
}
execHashIframe.contentWindow.location.hash = hashValue;
} else {
// Check if they've removed it from the DOM, and put it back if so.
if (execIframe && execIframe.contentWindow) {
execIframe.contentWindow.location = 'gap://ready';
} else {
execIframe = document.createElement('iframe');
execIframe.style.display = 'none';
execIframe.src = 'gap://ready';
document.body.appendChild(execIframe);
}
// Use a timer to protect against iframe being unloaded during the poke (CB-7735).
// This makes the bridge ~ 7% slower, but works around the poke getting lost
// when the iframe is removed from the DOM.
// An onunload listener could be used in the case where the iframe has just been
// created, but since unload events fire only once, it doesn't work in the normal
// case of iframe reuse (where unload will have already fired due to the attempted
// navigation of the page).
failSafeTimerId = setTimeout(function() {
if (commandQueue.length) {
pokeNative();
}
}, 50); // Making this > 0 improves performance (marginally) in the normal case (where it doesn't fire).
}
}
iOSExec.jsToNativeModes = jsToNativeModes;
iOSExec.setJsToNativeBridgeMode = function(mode) {
// Remove the iFrame since it may be no longer required, and its existence
// can trigger browser bugs.
// https://issues.apache.org/jira/browse/CB-593
if (execIframe) {
if (execIframe.parentNode) {
execIframe.parentNode.removeChild(execIframe);
}
execIframe = null;
}
bridgeMode = mode;
};
iOSExec.nativeFetchMessages = function() {
// Stop listing for window detatch once native side confirms poke.
if (failSafeTimerId) {
clearTimeout(failSafeTimerId);
failSafeTimerId = 0;
}
// Each entry in commandQueue is a JSON string already.
if (!commandQueue.length) {
return '';
}
var json = '[' + commandQueue.join(',') + ']';
commandQueue.length = 0;
return json;
};
iOSExec.nativeCallback = function(callbackId, status, message, keepCallback) {
return iOSExec.nativeEvalAndFetch(function() {
var success = status === 0 || status === 1;
var args = convertMessageToArgsNativeToJs(message);
cordova.callbackFromNative(callbackId, success, status, args, keepCallback);
});
};
iOSExec.nativeEvalAndFetch = function(func) {
// This shouldn't be nested, but better to be safe.
isInContextOfEvalJs++;
try {
func();
return iOSExec.nativeFetchMessages();
} finally {
isInContextOfEvalJs--;
}
};
module.exports = iOSExec;
});
// file: src/common/exec/proxy.js
define("cordova/exec/proxy", function(require, exports, module) {
// internal map of proxy function
var CommandProxyMap = {};
module.exports = {
// example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);
add:function(id,proxyObj) {
console.log("adding proxy for " + id);
CommandProxyMap[id] = proxyObj;
return proxyObj;
},
// cordova.commandProxy.remove("Accelerometer");
remove:function(id) {
var proxy = CommandProxyMap[id];
delete CommandProxyMap[id];
CommandProxyMap[id] = null;
return proxy;
},
get:function(service,action) {
return ( CommandProxyMap[service] ? CommandProxyMap[service][action] : null );
}
};
});
// file: src/common/init.js
define("cordova/init", function(require, exports, module) {
var channel = require('cordova/channel');
var cordova = require('cordova');
var modulemapper = require('cordova/modulemapper');
var platform = require('cordova/platform');
var pluginloader = require('cordova/pluginloader');
var utils = require('cordova/utils');
var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];
function logUnfiredChannels(arr) {
for (var i = 0; i < arr.length; ++i) {
if (arr[i].state != 2) {
console.log('Channel not fired: ' + arr[i].type);
}
}
}
window.setTimeout(function() {
if (channel.onDeviceReady.state != 2) {
console.log('deviceready has not fired after 5 seconds.');
logUnfiredChannels(platformInitChannelsArray);
logUnfiredChannels(channel.deviceReadyChannelsArray);
}
}, 5000);
// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
function replaceNavigator(origNavigator) {
var CordovaNavigator = function() {};
CordovaNavigator.prototype = origNavigator;
var newNavigator = new CordovaNavigator();
// This work-around really only applies to new APIs that are newer than Function.bind.
// Without it, APIs such as getGamepads() break.
if (CordovaNavigator.bind) {
for (var key in origNavigator) {
if (typeof origNavigator[key] == 'function') {
newNavigator[key] = origNavigator[key].bind(origNavigator);
}
else {
(function(k) {
utils.defineGetterSetter(newNavigator,key,function() {
return origNavigator[k];
});
})(key);
}
}
}
return newNavigator;
}
if (window.navigator) {
window.navigator = replaceNavigator(window.navigator);
}
if (!window.console) {
window.console = {
log: function(){}
};
}
if (!window.console.warn) {
window.console.warn = function(msg) {
this.log("warn: " + msg);
};
}
// Register pause, resume and deviceready channels as events on document.
channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onActivated = cordova.addDocumentEventHandler('activated');
channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');
// Listen for DOMContentLoaded and notify our channel subscribers.
if (document.readyState == 'complete' || document.readyState == 'interactive') {
channel.onDOMContentLoaded.fire();
} else {
document.addEventListener('DOMContentLoaded', function() {
channel.onDOMContentLoaded.fire();
}, false);
}
// _nativeReady is global variable that the native side can set
// to signify that the native code is ready. It is a global since
// it may be called before any cordova JS is ready.
if (window._nativeReady) {
channel.onNativeReady.fire();
}
modulemapper.clobbers('cordova', 'cordova');
modulemapper.clobbers('cordova/exec', 'cordova.exec');
modulemapper.clobbers('cordova/exec', 'Cordova.exec');
// Call the platform-specific initialization.
platform.bootstrap && platform.bootstrap();
// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
// The delay allows the attached modules to be defined before the plugin loader looks for them.
setTimeout(function() {
pluginloader.load(function() {
channel.onPluginsReady.fire();
});
}, 0);
/**
* Create all cordova objects once native side is ready.
*/
channel.join(function() {
modulemapper.mapModules(window);
platform.initialize && platform.initialize();
// Fire event to notify that all objects are created
channel.onCordovaReady.fire();
// Fire onDeviceReady event once page has fully loaded, all
// constructors have run and cordova info has been received from native
// side.
channel.join(function() {
require('cordova').fireDocumentEvent('deviceready');
}, channel.deviceReadyChannelsArray);
}, platformInitChannelsArray);
});
// file: src/common/init_b.js
define("cordova/init_b", function(require, exports, module) {
var channel = require('cordova/channel');
var cordova = require('cordova');
var modulemapper = require('cordova/modulemapper');
var platform = require('cordova/platform');
var pluginloader = require('cordova/pluginloader');
var utils = require('cordova/utils');
var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady];
// setting exec
cordova.exec = require('cordova/exec');
function logUnfiredChannels(arr) {
for (var i = 0; i < arr.length; ++i) {
if (arr[i].state != 2) {
console.log('Channel not fired: ' + arr[i].type);
}
}
}
window.setTimeout(function() {
if (channel.onDeviceReady.state != 2) {
console.log('deviceready has not fired after 5 seconds.');
logUnfiredChannels(platformInitChannelsArray);
logUnfiredChannels(channel.deviceReadyChannelsArray);
}
}, 5000);
// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
function replaceNavigator(origNavigator) {
var CordovaNavigator = function() {};
CordovaNavigator.prototype = origNavigator;
var newNavigator = new CordovaNavigator();
// This work-around really only applies to new APIs that are newer than Function.bind.
// Without it, APIs such as getGamepads() break.
if (CordovaNavigator.bind) {
for (var key in origNavigator) {
if (typeof origNavigator[key] == 'function') {
newNavigator[key] = origNavigator[key].bind(origNavigator);
}
else {
(function(k) {
utils.defineGetterSetter(newNavigator,key,function() {
return origNavigator[k];
});
})(key);
}
}
}
return newNavigator;
}
if (window.navigator) {
window.navigator = replaceNavigator(window.navigator);
}
if (!window.console) {
window.console = {
log: function(){}
};
}
if (!window.console.warn) {
window.console.warn = function(msg) {
this.log("warn: " + msg);
};
}
// Register pause, resume and deviceready channels as events on document.
channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onActivated = cordova.addDocumentEventHandler('activated');
channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');
// Listen for DOMContentLoaded and notify our channel subscribers.
if (document.readyState == 'complete' || document.readyState == 'interactive') {
channel.onDOMContentLoaded.fire();
} else {
document.addEventListener('DOMContentLoaded', function() {
channel.onDOMContentLoaded.fire();
}, false);
}
// _nativeReady is global variable that the native side can set
// to signify that the native code is ready. It is a global since
// it may be called before any cordova JS is ready.
if (window._nativeReady) {
channel.onNativeReady.fire();
}
// Call the platform-specific initialization.
platform.bootstrap && platform.bootstrap();
// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
// The delay allows the attached modules to be defined before the plugin loader looks for them.
setTimeout(function() {
pluginloader.load(function() {
channel.onPluginsReady.fire();
});
}, 0);
/**
* Create all cordova objects once native side is ready.
*/
channel.join(function() {
modulemapper.mapModules(window);
platform.initialize && platform.initialize();
// Fire event to notify that all objects are created
channel.onCordovaReady.fire();
// Fire onDeviceReady event once page has fully loaded, all
// constructors have run and cordova info has been received from native
// side.
channel.join(function() {
require('cordova').fireDocumentEvent('deviceready');
}, channel.deviceReadyChannelsArray);
}, platformInitChannelsArray);
});
// file: src/common/modulemapper.js
define("cordova/modulemapper", function(require, exports, module) {
var builder = require('cordova/builder'),
moduleMap = define.moduleMap,
symbolList,
deprecationMap;
exports.reset = function() {
symbolList = [];
deprecationMap = {};
};
function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) {
if (!(moduleName in moduleMap)) {
throw new Error('Module ' + moduleName + ' does not exist.');
}
symbolList.push(strategy, moduleName, symbolPath);
if (opt_deprecationMessage) {
deprecationMap[symbolPath] = opt_deprecationMessage;
}
}
// Note: Android 2.3 does have Function.bind().
exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
};
exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
};
exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
};
exports.runs = function(moduleName) {
addEntry('r', moduleName, null);
};
function prepareNamespace(symbolPath, context) {
if (!symbolPath) {
return context;
}
var parts = symbolPath.split('.');
var cur = context;
for (var i = 0, part; part = parts[i]; ++i) {
cur = cur[part] = cur[part] || {};
}
return cur;
}
exports.mapModules = function(context) {
var origSymbols = {};
context.CDV_origSymbols = origSymbols;
for (var i = 0, len = symbolList.length; i < len; i += 3) {
var strategy = symbolList[i];
var moduleName = symbolList[i + 1];
var module = require(moduleName);
// <runs/>
if (strategy == 'r') {
continue;
}
var symbolPath = symbolList[i + 2];
var lastDot = symbolPath.lastIndexOf('.');
var namespace = symbolPath.substr(0, lastDot);
var lastName = symbolPath.substr(lastDot + 1);
var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
var parentObj = prepareNamespace(namespace, context);
var target = parentObj[lastName];
if (strategy == 'm' && target) {
builder.recursiveMerge(target, module);
} else if ((strategy == 'd' && !target) || (strategy != 'd')) {
if (!(symbolPath in origSymbols)) {
origSymbols[symbolPath] = target;
}
builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
}
}
};
exports.getOriginalSymbol = function(context, symbolPath) {
var origSymbols = context.CDV_origSymbols;
if (origSymbols && (symbolPath in origSymbols)) {
return origSymbols[symbolPath];
}
var parts = symbolPath.split('.');
var obj = context;
for (var i = 0; i < parts.length; ++i) {
obj = obj && obj[parts[i]];
}
return obj;
};
exports.reset();
});
// file: src/common/modulemapper_b.js
define("cordova/modulemapper_b", function(require, exports, module) {
var builder = require('cordova/builder'),
symbolList = [],
deprecationMap;
exports.reset = function() {
symbolList = [];
deprecationMap = {};
};
function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) {
symbolList.push(strategy, moduleName, symbolPath);
if (opt_deprecationMessage) {
deprecationMap[symbolPath] = opt_deprecationMessage;
}
}
// Note: Android 2.3 does have Function.bind().
exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
};
exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
};
exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
};
exports.runs = function(moduleName) {
addEntry('r', moduleName, null);
};
function prepareNamespace(symbolPath, context) {
if (!symbolPath) {
return context;
}
var parts = symbolPath.split('.');
var cur = context;
for (var i = 0, part; part = parts[i]; ++i) {
cur = cur[part] = cur[part] || {};
}
return cur;
}
exports.mapModules = function(context) {
var origSymbols = {};
context.CDV_origSymbols = origSymbols;
for (var i = 0, len = symbolList.length; i < len; i += 3) {
var strategy = symbolList[i];
var moduleName = symbolList[i + 1];
var module = require(moduleName);
// <runs/>
if (strategy == 'r') {
continue;
}
var symbolPath = symbolList[i + 2];
var lastDot = symbolPath.lastIndexOf('.');
var namespace = symbolPath.substr(0, lastDot);
var lastName = symbolPath.substr(lastDot + 1);
var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
var parentObj = prepareNamespace(namespace, context);
var target = parentObj[lastName];
if (strategy == 'm' && target) {
builder.recursiveMerge(target, module);
} else if ((strategy == 'd' && !target) || (strategy != 'd')) {
if (!(symbolPath in origSymbols)) {
origSymbols[symbolPath] = target;
}
builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
}
}
};
exports.getOriginalSymbol = function(context, symbolPath) {
var origSymbols = context.CDV_origSymbols;
if (origSymbols && (symbolPath in origSymbols)) {
return origSymbols[symbolPath];
}
var parts = symbolPath.split('.');
var obj = context;
for (var i = 0; i < parts.length; ++i) {
obj = obj && obj[parts[i]];
}
return obj;
};
exports.reset();
});
// file: e:/cordova/cordova-ios/cordova-js-src/platform.js
define("cordova/platform", function(require, exports, module) {
module.exports = {
id: 'ios',
bootstrap: function() {
require('cordova/channel').onNativeReady.fire();
}
};
});
// file: src/common/pluginloader.js
define("cordova/pluginloader", function(require, exports, module) {
var modulemapper = require('cordova/modulemapper');
var urlutil = require('cordova/urlutil');
// Helper function to inject a <script> tag.
// Exported for testing.
exports.injectScript = function(url, onload, onerror) {
var script = document.createElement("script");
// onload fires even when script fails loads with an error.
script.onload = onload;
// onerror fires for malformed URLs.
script.onerror = onerror;
script.src = url;
document.head.appendChild(script);
};
function injectIfNecessary(id, url, onload, onerror) {
onerror = onerror || onload;
if (id in define.moduleMap) {
onload();
} else {
exports.injectScript(url, function() {
if (id in define.moduleMap) {
onload();
} else {
onerror();
}
}, onerror);
}
}
function onScriptLoadingComplete(moduleList, finishPluginLoading) {
// Loop through all the plugins and then through their clobbers and merges.
for (var i = 0, module; module = moduleList[i]; i++) {
if (module.clobbers && module.clobbers.length) {
for (var j = 0; j < module.clobbers.length; j++) {
modulemapper.clobbers(module.id, module.clobbers[j]);
}
}
if (module.merges && module.merges.length) {
for (var k = 0; k < module.merges.length; k++) {
modulemapper.merges(module.id, module.merges[k]);
}
}
// Finally, if runs is truthy we want to simply require() the module.
if (module.runs) {
modulemapper.runs(module.id);
}
}
finishPluginLoading();
}
// Handler for the cordova_plugins.js content.
// See plugman's plugin_loader.js for the details of this object.
// This function is only called if the really is a plugins array that isn't empty.
// Otherwise the onerror response handler will just call finishPluginLoading().
function handlePluginsObject(path, moduleList, finishPluginLoading) {
// Now inject the scripts.
var scriptCounter = moduleList.length;
if (!scriptCounter) {
finishPluginLoading();
return;
}
function scriptLoadedCallback() {
if (!--scriptCounter) {
onScriptLoadingComplete(moduleList, finishPluginLoading);
}
}
for (var i = 0; i < moduleList.length; i++) {
injectIfNecessary(moduleList[i].id, path + moduleList[i].file, scriptLoadedCallback);
}
}
function findCordovaPath() {
var path = null;
var scripts = document.getElementsByTagName('script');
var term = '/cordova.js';
for (var n = scripts.length-1; n>-1; n--) {
var src = scripts[n].src.replace(/\?.*$/, ''); // Strip any query param (CB-6007).
if (src.indexOf(term) == (src.length - term.length)) {
path = src.substring(0, src.length - term.length) + '/';
break;
}
}
return path;
}
// Tries to load all plugins' js-modules.
// This is an async process, but onDeviceReady is blocked on onPluginsReady.
// onPluginsReady is fired when there are no plugins to load, or they are all done.
exports.load = function(callback) {
var pathPrefix = findCordovaPath();
if (pathPrefix === null) {
console.log('Could not find cordova.js script tag. Plugin loading may fail.');
pathPrefix = '';
}
injectIfNecessary('cordova/plugin_list', pathPrefix + 'cordova_plugins.js', function() {
var moduleList = require("cordova/plugin_list");
handlePluginsObject(pathPrefix, moduleList, callback);
}, callback);
};
});
// file: src/common/pluginloader_b.js
define("cordova/pluginloader_b", function(require, exports, module) {
var modulemapper = require('cordova/modulemapper');
// Handler for the cordova_plugins.js content.
// See plugman's plugin_loader.js for the details of this object.
function handlePluginsObject(moduleList) {
// if moduleList is not defined or empty, we've nothing to do
if (!moduleList || !moduleList.length) {
return;
}
// Loop through all the modules and then through their clobbers and merges.
for (var i = 0, module; module = moduleList[i]; i++) {
if (module.clobbers && module.clobbers.length) {
for (var j = 0; j < module.clobbers.length; j++) {
modulemapper.clobbers(module.id, module.clobbers[j]);
}
}
if (module.merges && module.merges.length) {
for (var k = 0; k < module.merges.length; k++) {
modulemapper.merges(module.id, module.merges[k]);
}
}
// Finally, if runs is truthy we want to simply require() the module.
if (module.runs) {
modulemapper.runs(module.id);
}
}
}
// Loads all plugins' js-modules. Plugin loading is syncronous in browserified bundle
// but the method accepts callback to be compatible with non-browserify flow.
// onDeviceReady is blocked on onPluginsReady. onPluginsReady is fired when there are
// no plugins to load, or they are all done.
exports.load = function(callback) {
var moduleList = require("cordova/plugin_list");
handlePluginsObject(moduleList);
callback();
};
});
// file: src/common/urlutil.js
define("cordova/urlutil", function(require, exports, module) {
/**
* For already absolute URLs, returns what is passed in.
* For relative URLs, converts them to absolute ones.
*/
exports.makeAbsolute = function makeAbsolute(url) {
var anchorEl = document.createElement('a');
anchorEl.href = url;
return anchorEl.href;
};
});
// file: src/common/utils.js
define("cordova/utils", function(require, exports, module) {
var utils = exports;
/**
* Defines a property getter / setter for obj[key].
*/
utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) {
if (Object.defineProperty) {
var desc = {
get: getFunc,
configurable: true
};
if (opt_setFunc) {
desc.set = opt_setFunc;
}
Object.defineProperty(obj, key, desc);
} else {
obj.__defineGetter__(key, getFunc);
if (opt_setFunc) {
obj.__defineSetter__(key, opt_setFunc);
}
}
};
/**
* Defines a property getter for obj[key].
*/
utils.defineGetter = utils.defineGetterSetter;
utils.arrayIndexOf = function(a, item) {
if (a.indexOf) {
return a.indexOf(item);
}
var len = a.length;
for (var i = 0; i < len; ++i) {
if (a[i] == item) {
return i;
}
}
return -1;
};
/**
* Returns whether the item was found in the array.
*/
utils.arrayRemove = function(a, item) {
var index = utils.arrayIndexOf(a, item);
if (index != -1) {
a.splice(index, 1);
}
return index != -1;
};
utils.typeName = function(val) {
return Object.prototype.toString.call(val).slice(8, -1);
};
/**
* Returns an indication of whether the argument is an array or not
*/
utils.isArray = Array.isArray ||
function(a) {return utils.typeName(a) == 'Array';};
/**
* Returns an indication of whether the argument is a Date or not
*/
utils.isDate = function(d) {
return (d instanceof Date);
};
/**
* Does a deep clone of the object.
*/
utils.clone = function(obj) {
if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
return obj;
}
var retVal, i;
if(utils.isArray(obj)){
retVal = [];
for(i = 0; i < obj.length; ++i){
retVal.push(utils.clone(obj[i]));
}
return retVal;
}
retVal = {};
for(i in obj){
if(!(i in retVal) || retVal[i] != obj[i]) {
retVal[i] = utils.clone(obj[i]);
}
}
return retVal;
};
/**
* Returns a wrapped version of the function
*/
utils.close = function(context, func, params) {
return function() {
var args = params || arguments;
return func.apply(context, args);
};
};
//------------------------------------------------------------------------------
function UUIDcreatePart(length) {
var uuidpart = "";
for (var i=0; i<length; i++) {
var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
if (uuidchar.length == 1) {
uuidchar = "0" + uuidchar;
}
uuidpart += uuidchar;
}
return uuidpart;
}
/**
* Create a UUID
*/
utils.createUUID = function() {
return UUIDcreatePart(4) + '-' +
UUIDcreatePart(2) + '-' +
UUIDcreatePart(2) + '-' +
UUIDcreatePart(2) + '-' +
UUIDcreatePart(6);
};
/**
* Extends a child object from a parent object using classical inheritance
* pattern.
*/
utils.extend = (function() {
// proxy used to establish prototype chain
var F = function() {};
// extend Child from Parent
return function(Child, Parent) {
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.__super__ = Parent.prototype;
Child.prototype.constructor = Child;
};
}());
/**
* Alerts a message in any available way: alert or console.log.
*/
utils.alert = function(msg) {
if (window.alert) {
window.alert(msg);
} else if (console && console.log) {
console.log(msg);
}
};
});
window.cordova = require('cordova');
// file: src/scripts/bootstrap.js
require('cordova/init');
})();
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "remove@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
pactera_other @ c741c027
Subproject commit c741c0272baae544d9f0d902dd62d4de737a3af4
/*
* 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.
*/
/**
* Exports the ExposedJsApi.java object if available, otherwise exports the PromptBasedNativeApi.
*/
var nativeApi = this._cordovaNative || require('cordova/android/promptbasednativeapi');
var currentApi = nativeApi;
module.exports = {
get: function() { return currentApi; },
setPreferPrompt: function(value) {
currentApi = value ? require('cordova/android/promptbasednativeapi') : nativeApi;
},
// Used only by tests.
set: function(value) {
currentApi = value;
}
};
/*
* 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.
*/
/**
* Implements the API of ExposedJsApi.java, but uses prompt() to communicate.
* This is used pre-JellyBean, where addJavascriptInterface() is disabled.
*/
module.exports = {
exec: function(bridgeSecret, service, action, callbackId, argsJson) {
return prompt(argsJson, 'gap:'+JSON.stringify([bridgeSecret, service, action, callbackId]));
},
setNativeToJsBridgeMode: function(bridgeSecret, value) {
prompt(value, 'gap_bridge_mode:' + bridgeSecret);
},
retrieveJsMessages: function(bridgeSecret, fromOnlineEvent) {
return prompt(+fromOnlineEvent, 'gap_poll:' + bridgeSecret);
}
};
/*
*
* 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.
*
*/
/**
* Execute a cordova command. It is up to the native side whether this action
* is synchronous or asynchronous. The native side can return:
* Synchronous: PluginResult object as a JSON string
* Asynchronous: Empty string ""
* If async, the native side will cordova.callbackSuccess or cordova.callbackError,
* depending upon the result of the action.
*
* @param {Function} success The success callback
* @param {Function} fail The fail callback
* @param {String} service The name of the service to use
* @param {String} action Action to be run in cordova
* @param {String[]} [args] Zero or more arguments to pass to the method
*/
var cordova = require('cordova'),
nativeApiProvider = require('cordova/android/nativeapiprovider'),
utils = require('cordova/utils'),
base64 = require('cordova/base64'),
channel = require('cordova/channel'),
jsToNativeModes = {
PROMPT: 0,
JS_OBJECT: 1
},
nativeToJsModes = {
// Polls for messages using the JS->Native bridge.
POLLING: 0,
// For LOAD_URL to be viable, it would need to have a work-around for
// the bug where the soft-keyboard gets dismissed when a message is sent.
LOAD_URL: 1,
// For the ONLINE_EVENT to be viable, it would need to intercept all event
// listeners (both through addEventListener and window.ononline) as well
// as set the navigator property itself.
ONLINE_EVENT: 2
},
jsToNativeBridgeMode, // Set lazily.
nativeToJsBridgeMode = nativeToJsModes.ONLINE_EVENT,
pollEnabled = false,
bridgeSecret = -1;
var messagesFromNative = [];
var isProcessing = false;
var resolvedPromise = typeof Promise == 'undefined' ? null : Promise.resolve();
var nextTick = resolvedPromise ? function(fn) { resolvedPromise.then(fn); } : function(fn) { setTimeout(fn); };
function androidExec(success, fail, service, action, args) {
if (bridgeSecret < 0) {
// If we ever catch this firing, we'll need to queue up exec()s
// and fire them once we get a secret. For now, I don't think
// it's possible for exec() to be called since plugins are parsed but
// not run until until after onNativeReady.
throw new Error('exec() called without bridgeSecret');
}
// Set default bridge modes if they have not already been set.
// By default, we use the failsafe, since addJavascriptInterface breaks too often
if (jsToNativeBridgeMode === undefined) {
androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
}
// Process any ArrayBuffers in the args into a string.
for (var i = 0; i < args.length; i++) {
if (utils.typeName(args[i]) == 'ArrayBuffer') {
args[i] = base64.fromArrayBuffer(args[i]);
}
}
var callbackId = service + cordova.callbackId++,
argsJson = JSON.stringify(args);
if (success || fail) {
cordova.callbacks[callbackId] = {success:success, fail:fail};
}
var msgs = nativeApiProvider.get().exec(bridgeSecret, service, action, callbackId, argsJson);
// If argsJson was received by Java as null, try again with the PROMPT bridge mode.
// This happens in rare circumstances, such as when certain Unicode characters are passed over the bridge on a Galaxy S2. See CB-2666.
if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT && msgs === "@Null arguments.") {
androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT);
androidExec(success, fail, service, action, args);
androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
} else if (msgs) {
messagesFromNative.push(msgs);
// Always process async to avoid exceptions messing up stack.
nextTick(processMessages);
}
}
androidExec.init = function() {
bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode);
channel.onNativeReady.fire();
};
function pollOnceFromOnlineEvent() {
pollOnce(true);
}
function pollOnce(opt_fromOnlineEvent) {
if (bridgeSecret < 0) {
// This can happen when the NativeToJsMessageQueue resets the online state on page transitions.
// We know there's nothing to retrieve, so no need to poll.
return;
}
var msgs = nativeApiProvider.get().retrieveJsMessages(bridgeSecret, !!opt_fromOnlineEvent);
if (msgs) {
messagesFromNative.push(msgs);
// Process sync since we know we're already top-of-stack.
processMessages();
}
}
function pollingTimerFunc() {
if (pollEnabled) {
pollOnce();
setTimeout(pollingTimerFunc, 50);
}
}
function hookOnlineApis() {
function proxyEvent(e) {
cordova.fireWindowEvent(e.type);
}
// The network module takes care of firing online and offline events.
// It currently fires them only on document though, so we bridge them
// to window here (while first listening for exec()-releated online/offline
// events).
window.addEventListener('online', pollOnceFromOnlineEvent, false);
window.addEventListener('offline', pollOnceFromOnlineEvent, false);
cordova.addWindowEventHandler('online');
cordova.addWindowEventHandler('offline');
document.addEventListener('online', proxyEvent, false);
document.addEventListener('offline', proxyEvent, false);
}
hookOnlineApis();
androidExec.jsToNativeModes = jsToNativeModes;
androidExec.nativeToJsModes = nativeToJsModes;
androidExec.setJsToNativeBridgeMode = function(mode) {
if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) {
mode = jsToNativeModes.PROMPT;
}
nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT);
jsToNativeBridgeMode = mode;
};
androidExec.setNativeToJsBridgeMode = function(mode) {
if (mode == nativeToJsBridgeMode) {
return;
}
if (nativeToJsBridgeMode == nativeToJsModes.POLLING) {
pollEnabled = false;
}
nativeToJsBridgeMode = mode;
// Tell the native side to switch modes.
// Otherwise, it will be set by androidExec.init()
if (bridgeSecret >= 0) {
nativeApiProvider.get().setNativeToJsBridgeMode(bridgeSecret, mode);
}
if (mode == nativeToJsModes.POLLING) {
pollEnabled = true;
setTimeout(pollingTimerFunc, 1);
}
};
function buildPayload(payload, message) {
var payloadKind = message.charAt(0);
if (payloadKind == 's') {
payload.push(message.slice(1));
} else if (payloadKind == 't') {
payload.push(true);
} else if (payloadKind == 'f') {
payload.push(false);
} else if (payloadKind == 'N') {
payload.push(null);
} else if (payloadKind == 'n') {
payload.push(+message.slice(1));
} else if (payloadKind == 'A') {
var data = message.slice(1);
payload.push(base64.toArrayBuffer(data));
} else if (payloadKind == 'S') {
payload.push(window.atob(message.slice(1)));
} else if (payloadKind == 'M') {
var multipartMessages = message.slice(1);
while (multipartMessages !== "") {
var spaceIdx = multipartMessages.indexOf(' ');
var msgLen = +multipartMessages.slice(0, spaceIdx);
var multipartMessage = multipartMessages.substr(spaceIdx + 1, msgLen);
multipartMessages = multipartMessages.slice(spaceIdx + msgLen + 1);
buildPayload(payload, multipartMessage);
}
} else {
payload.push(JSON.parse(message));
}
}
// Processes a single message, as encoded by NativeToJsMessageQueue.java.
function processMessage(message) {
var firstChar = message.charAt(0);
if (firstChar == 'J') {
// This is deprecated on the .java side. It doesn't work with CSP enabled.
eval(message.slice(1));
} else if (firstChar == 'S' || firstChar == 'F') {
var success = firstChar == 'S';
var keepCallback = message.charAt(1) == '1';
var spaceIdx = message.indexOf(' ', 2);
var status = +message.slice(2, spaceIdx);
var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1);
var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx);
var payloadMessage = message.slice(nextSpaceIdx + 1);
var payload = [];
buildPayload(payload, payloadMessage);
cordova.callbackFromNative(callbackId, success, status, payload, keepCallback);
} else {
console.log("processMessage failed: invalid message: " + JSON.stringify(message));
}
}
function processMessages() {
// Check for the reentrant case.
if (isProcessing) {
return;
}
if (messagesFromNative.length === 0) {
return;
}
isProcessing = true;
try {
var msg = popMessageFromQueue();
// The Java side can send a * message to indicate that it
// still has messages waiting to be retrieved.
if (msg == '*' && messagesFromNative.length === 0) {
nextTick(pollOnce);
return;
}
processMessage(msg);
} finally {
isProcessing = false;
if (messagesFromNative.length > 0) {
nextTick(processMessages);
}
}
}
function popMessageFromQueue() {
var messageBatch = messagesFromNative.shift();
if (messageBatch == '*') {
return '*';
}
var spaceIdx = messageBatch.indexOf(' ');
var msgLen = +messageBatch.slice(0, spaceIdx);
var message = messageBatch.substr(spaceIdx + 1, msgLen);
messageBatch = messageBatch.slice(spaceIdx + msgLen + 1);
if (messageBatch) {
messagesFromNative.unshift(messageBatch);
}
return message;
}
module.exports = androidExec;
/*
*
* 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.
*
*/
// The last resume event that was received that had the result of a plugin call.
var lastResumeEvent = null;
module.exports = {
id: 'android',
bootstrap: function() {
var channel = require('cordova/channel'),
cordova = require('cordova'),
exec = require('cordova/exec'),
modulemapper = require('cordova/modulemapper');
// Get the shared secret needed to use the bridge.
exec.init();
// TODO: Extract this as a proper plugin.
modulemapper.clobbers('cordova/plugin/android/app', 'navigator.app');
var APP_PLUGIN_NAME = Number(cordova.platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
// Inject a listener for the backbutton on the document.
var backButtonChannel = cordova.addDocumentEventHandler('backbutton');
backButtonChannel.onHasSubscribersChange = function() {
// If we just attached the first handler or detached the last handler,
// let native know we need to override the back button.
exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [this.numHandlers == 1]);
};
// Add hardware MENU and SEARCH button handlers
cordova.addDocumentEventHandler('menubutton');
cordova.addDocumentEventHandler('searchbutton');
function bindButtonChannel(buttonName) {
// generic button bind used for volumeup/volumedown buttons
var volumeButtonChannel = cordova.addDocumentEventHandler(buttonName + 'button');
volumeButtonChannel.onHasSubscribersChange = function() {
exec(null, null, APP_PLUGIN_NAME, "overrideButton", [buttonName, this.numHandlers == 1]);
};
}
// Inject a listener for the volume buttons on the document.
bindButtonChannel('volumeup');
bindButtonChannel('volumedown');
// The resume event is not "sticky", but it is possible that the event
// will contain the result of a plugin call. We need to ensure that the
// plugin result is delivered even after the event is fired (CB-10498)
var cordovaAddEventListener = document.addEventListener;
document.addEventListener = function(evt, handler, capture) {
cordovaAddEventListener(evt, handler, capture);
if (evt === 'resume' && lastResumeEvent) {
handler(lastResumeEvent);
}
};
// Let native code know we are all done on the JS side.
// Native code will then un-hide the WebView.
channel.onCordovaReady.subscribe(function() {
exec(onMessageFromNative, null, APP_PLUGIN_NAME, 'messageChannel', []);
exec(null, null, APP_PLUGIN_NAME, "show", []);
});
}
};
function onMessageFromNative(msg) {
var cordova = require('cordova');
var action = msg.action;
switch (action)
{
// Button events
case 'backbutton':
case 'menubutton':
case 'searchbutton':
// App life cycle events
case 'pause':
// Volume events
case 'volumedownbutton':
case 'volumeupbutton':
cordova.fireDocumentEvent(action);
break;
case 'resume':
if(arguments.length > 1 && msg.pendingResult) {
if(arguments.length === 2) {
msg.pendingResult.result = arguments[1];
} else {
// The plugin returned a multipart message
var res = [];
for(var i = 1; i < arguments.length; i++) {
res.push(arguments[i]);
}
msg.pendingResult.result = res;
}
// Save the plugin result so that it can be delivered to the js
// even if they miss the initial firing of the event
lastResumeEvent = msg;
}
cordova.fireDocumentEvent(action, msg);
break;
default:
throw new Error('Unknown event action ' + action);
}
}
/*
*
* 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 = require('cordova/exec');
var APP_PLUGIN_NAME = Number(require('cordova').platformVersion.split('.')[0]) >= 4 ? 'CoreAndroid' : 'App';
module.exports = {
/**
* Clear the resource cache.
*/
clearCache:function() {
exec(null, null, APP_PLUGIN_NAME, "clearCache", []);
},
/**
* Load the url into the webview or into new browser instance.
*
* @param url The URL to load
* @param props Properties that can be passed in to the activity:
* wait: int => wait msec before loading URL
* loadingDialog: "Title,Message" => display a native loading dialog
* loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error
* clearHistory: boolean => clear webview history (default=false)
* openExternal: boolean => open in a new browser (default=false)
*
* Example:
* navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000});
*/
loadUrl:function(url, props) {
exec(null, null, APP_PLUGIN_NAME, "loadUrl", [url, props]);
},
/**
* Cancel loadUrl that is waiting to be loaded.
*/
cancelLoadUrl:function() {
exec(null, null, APP_PLUGIN_NAME, "cancelLoadUrl", []);
},
/**
* Clear web history in this web view.
* Instead of BACK button loading the previous web page, it will exit the app.
*/
clearHistory:function() {
exec(null, null, APP_PLUGIN_NAME, "clearHistory", []);
},
/**
* Go to previous page displayed.
* This is the same as pressing the backbutton on Android device.
*/
backHistory:function() {
exec(null, null, APP_PLUGIN_NAME, "backHistory", []);
},
/**
* Override the default behavior of the Android back button.
* If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired.
*
* Note: The user should not have to call this method. Instead, when the user
* registers for the "backbutton" event, this is automatically done.
*
* @param override T=override, F=cancel override
*/
overrideBackbutton:function(override) {
exec(null, null, APP_PLUGIN_NAME, "overrideBackbutton", [override]);
},
/**
* Override the default behavior of the Android volume button.
* If overridden, when the volume button is pressed, the "volume[up|down]button"
* JavaScript event will be fired.
*
* Note: The user should not have to call this method. Instead, when the user
* registers for the "volume[up|down]button" event, this is automatically done.
*
* @param button volumeup, volumedown
* @param override T=override, F=cancel override
*/
overrideButton:function(button, override) {
exec(null, null, APP_PLUGIN_NAME, "overrideButton", [button, override]);
},
/**
* Exit and terminate the application.
*/
exitApp:function() {
return exec(null, null, APP_PLUGIN_NAME, "exitApp", []);
}
};
// Platform: ios
// 49a8db57fa070d20ea7b304a53ffec3d7250c5af
/*
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.
*/
;(function() {
var PLATFORM_VERSION_BUILD_LABEL = '3.9.2';
// file: src/scripts/require.js
/*jshint -W079 */
/*jshint -W020 */
var require,
define;
(function () {
var modules = {},
// Stack of moduleIds currently being built.
requireStack = [],
// Map of module ID -> index into requireStack of modules currently being built.
inProgressModules = {},
SEPARATOR = ".";
function build(module) {
var factory = module.factory,
localRequire = function (id) {
var resultantId = id;
//Its a relative path, so lop off the last portion and add the id (minus "./")
if (id.charAt(0) === ".") {
resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2);
}
return require(resultantId);
};
module.exports = {};
delete module.factory;
factory(localRequire, module.exports, module);
return module.exports;
}
require = function (id) {
if (!modules[id]) {
throw "module " + id + " not found";
} else if (id in inProgressModules) {
var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id;
throw "Cycle in require graph: " + cycle;
}
if (modules[id].factory) {
try {
inProgressModules[id] = requireStack.length;
requireStack.push(id);
return build(modules[id]);
} finally {
delete inProgressModules[id];
requireStack.pop();
}
}
return modules[id].exports;
};
define = function (id, factory) {
if (modules[id]) {
throw "module " + id + " already defined";
}
modules[id] = {
id: id,
factory: factory
};
};
define.remove = function (id) {
delete modules[id];
};
define.moduleMap = modules;
})();
//Export for use in node
if (typeof module === "object" && typeof require === "function") {
module.exports.require = require;
module.exports.define = define;
}
// file: src/cordova.js
define("cordova", function(require, exports, module) {
// Workaround for Windows 10 in hosted environment case
// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object
if (window.cordova && !(window.cordova instanceof HTMLElement)) {
throw new Error("cordova already defined");
}
var channel = require('cordova/channel');
var platform = require('cordova/platform');
/**
* Intercept calls to addEventListener + removeEventListener and handle deviceready,
* resume, and pause events.
*/
var m_document_addEventListener = document.addEventListener;
var m_document_removeEventListener = document.removeEventListener;
var m_window_addEventListener = window.addEventListener;
var m_window_removeEventListener = window.removeEventListener;
/**
* Houses custom event handlers to intercept on document + window event listeners.
*/
var documentEventHandlers = {},
windowEventHandlers = {};
document.addEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
if (typeof documentEventHandlers[e] != 'undefined') {
documentEventHandlers[e].subscribe(handler);
} else {
m_document_addEventListener.call(document, evt, handler, capture);
}
};
window.addEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
if (typeof windowEventHandlers[e] != 'undefined') {
windowEventHandlers[e].subscribe(handler);
} else {
m_window_addEventListener.call(window, evt, handler, capture);
}
};
document.removeEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
// If unsubscribing from an event that is handled by a plugin
if (typeof documentEventHandlers[e] != "undefined") {
documentEventHandlers[e].unsubscribe(handler);
} else {
m_document_removeEventListener.call(document, evt, handler, capture);
}
};
window.removeEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
// If unsubscribing from an event that is handled by a plugin
if (typeof windowEventHandlers[e] != "undefined") {
windowEventHandlers[e].unsubscribe(handler);
} else {
m_window_removeEventListener.call(window, evt, handler, capture);
}
};
function createEvent(type, data) {
var event = document.createEvent('Events');
event.initEvent(type, false, false);
if (data) {
for (var i in data) {
if (data.hasOwnProperty(i)) {
event[i] = data[i];
}
}
}
return event;
}
var cordova = {
define:define,
require:require,
version:PLATFORM_VERSION_BUILD_LABEL,
platformVersion:PLATFORM_VERSION_BUILD_LABEL,
platformId:platform.id,
/**
* Methods to add/remove your own addEventListener hijacking on document + window.
*/
addWindowEventHandler:function(event) {
return (windowEventHandlers[event] = channel.create(event));
},
addStickyDocumentEventHandler:function(event) {
return (documentEventHandlers[event] = channel.createSticky(event));
},
addDocumentEventHandler:function(event) {
return (documentEventHandlers[event] = channel.create(event));
},
removeWindowEventHandler:function(event) {
delete windowEventHandlers[event];
},
removeDocumentEventHandler:function(event) {
delete documentEventHandlers[event];
},
/**
* Retrieve original event handlers that were replaced by Cordova
*
* @return object
*/
getOriginalHandlers: function() {
return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
},
/**
* Method to fire event from native code
* bNoDetach is required for events which cause an exception which needs to be caught in native code
*/
fireDocumentEvent: function(type, data, bNoDetach) {
var evt = createEvent(type, data);
if (typeof documentEventHandlers[type] != 'undefined') {
if( bNoDetach ) {
documentEventHandlers[type].fire(evt);
}
else {
setTimeout(function() {
// Fire deviceready on listeners that were registered before cordova.js was loaded.
if (type == 'deviceready') {
document.dispatchEvent(evt);
}
documentEventHandlers[type].fire(evt);
}, 0);
}
} else {
document.dispatchEvent(evt);
}
},
fireWindowEvent: function(type, data) {
var evt = createEvent(type,data);
if (typeof windowEventHandlers[type] != 'undefined') {
setTimeout(function() {
windowEventHandlers[type].fire(evt);
}, 0);
} else {
window.dispatchEvent(evt);
}
},
/**
* Plugin callback mechanism.
*/
// Randomize the starting callbackId to avoid collisions after refreshing or navigating.
// This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
callbackId: Math.floor(Math.random() * 2000000000),
callbacks: {},
callbackStatus: {
NO_RESULT: 0,
OK: 1,
CLASS_NOT_FOUND_EXCEPTION: 2,
ILLEGAL_ACCESS_EXCEPTION: 3,
INSTANTIATION_EXCEPTION: 4,
MALFORMED_URL_EXCEPTION: 5,
IO_EXCEPTION: 6,
INVALID_ACTION: 7,
JSON_EXCEPTION: 8,
ERROR: 9
},
/**
* Called by native code when returning successful result from an action.
*/
callbackSuccess: function(callbackId, args) {
cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
},
/**
* Called by native code when returning error result from an action.
*/
callbackError: function(callbackId, args) {
// TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
// Derive success from status.
cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
},
/**
* Called by native code when returning the result from an action.
*/
callbackFromNative: function(callbackId, isSuccess, status, args, keepCallback) {
try {
var callback = cordova.callbacks[callbackId];
if (callback) {
if (isSuccess && status == cordova.callbackStatus.OK) {
callback.success && callback.success.apply(null, args);
} else if (!isSuccess) {
callback.fail && callback.fail.apply(null, args);
}
/*
else
Note, this case is intentionally not caught.
this can happen if isSuccess is true, but callbackStatus is NO_RESULT
which is used to remove a callback from the list without calling the callbacks
typically keepCallback is false in this case
*/
// Clear callback if not expecting any more results
if (!keepCallback) {
delete cordova.callbacks[callbackId];
}
}
}
catch (err) {
var msg = "Error in " + (isSuccess ? "Success" : "Error") + " callbackId: " + callbackId + " : " + err;
console && console.log && console.log(msg);
cordova.fireWindowEvent("cordovacallbackerror", { 'message': msg });
throw err;
}
},
addConstructor: function(func) {
channel.onCordovaReady.subscribe(function() {
try {
func();
} catch(e) {
console.log("Failed to run constructor: " + e);
}
});
}
};
module.exports = cordova;
});
// file: src/common/argscheck.js
define("cordova/argscheck", function(require, exports, module) {
var utils = require('cordova/utils');
var moduleExports = module.exports;
var typeMap = {
'A': 'Array',
'D': 'Date',
'N': 'Number',
'S': 'String',
'F': 'Function',
'O': 'Object'
};
function extractParamName(callee, argIndex) {
return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];
}
function checkArgs(spec, functionName, args, opt_callee) {
if (!moduleExports.enableChecks) {
return;
}
var errMsg = null;
var typeName;
for (var i = 0; i < spec.length; ++i) {
var c = spec.charAt(i),
cUpper = c.toUpperCase(),
arg = args[i];
// Asterix means allow anything.
if (c == '*') {
continue;
}
typeName = utils.typeName(arg);
if ((arg === null || arg === undefined) && c == cUpper) {
continue;
}
if (typeName != typeMap[cUpper]) {
errMsg = 'Expected ' + typeMap[cUpper];
break;
}
}
if (errMsg) {
errMsg += ', but got ' + typeName + '.';
errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
// Don't log when running unit tests.
if (typeof jasmine == 'undefined') {
console.error(errMsg);
}
throw TypeError(errMsg);
}
}
function getValue(value, defaultValue) {
return value === undefined ? defaultValue : value;
}
moduleExports.checkArgs = checkArgs;
moduleExports.getValue = getValue;
moduleExports.enableChecks = true;
});
// file: src/common/base64.js
define("cordova/base64", function(require, exports, module) {
var base64 = exports;
base64.fromArrayBuffer = function(arrayBuffer) {
var array = new Uint8Array(arrayBuffer);
return uint8ToBase64(array);
};
base64.toArrayBuffer = function(str) {
var decodedStr = typeof atob != 'undefined' ? atob(str) : new Buffer(str,'base64').toString('binary');
var arrayBuffer = new ArrayBuffer(decodedStr.length);
var array = new Uint8Array(arrayBuffer);
for (var i=0, len=decodedStr.length; i < len; i++) {
array[i] = decodedStr.charCodeAt(i);
}
return arrayBuffer;
};
//------------------------------------------------------------------------------
/* This code is based on the performance tests at http://jsperf.com/b64tests
* This 12-bit-at-a-time algorithm was the best performing version on all
* platforms tested.
*/
var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64_12bit;
var b64_12bitTable = function() {
b64_12bit = [];
for (var i=0; i<64; i++) {
for (var j=0; j<64; j++) {
b64_12bit[i*64+j] = b64_6bit[i] + b64_6bit[j];
}
}
b64_12bitTable = function() { return b64_12bit; };
return b64_12bit;
};
function uint8ToBase64(rawData) {
var numBytes = rawData.byteLength;
var output="";
var segment;
var table = b64_12bitTable();
for (var i=0;i<numBytes-2;i+=3) {
segment = (rawData[i] << 16) + (rawData[i+1] << 8) + rawData[i+2];
output += table[segment >> 12];
output += table[segment & 0xfff];
}
if (numBytes - i == 2) {
segment = (rawData[i] << 16) + (rawData[i+1] << 8);
output += table[segment >> 12];
output += b64_6bit[(segment & 0xfff) >> 6];
output += '=';
} else if (numBytes - i == 1) {
segment = (rawData[i] << 16);
output += table[segment >> 12];
output += '==';
}
return output;
}
});
// file: src/common/builder.js
define("cordova/builder", function(require, exports, module) {
var utils = require('cordova/utils');
function each(objects, func, context) {
for (var prop in objects) {
if (objects.hasOwnProperty(prop)) {
func.apply(context, [objects[prop], prop]);
}
}
}
function clobber(obj, key, value) {
exports.replaceHookForTesting(obj, key);
var needsProperty = false;
try {
obj[key] = value;
} catch (e) {
needsProperty = true;
}
// Getters can only be overridden by getters.
if (needsProperty || obj[key] !== value) {
utils.defineGetter(obj, key, function() {
return value;
});
}
}
function assignOrWrapInDeprecateGetter(obj, key, value, message) {
if (message) {
utils.defineGetter(obj, key, function() {
console.log(message);
delete obj[key];
clobber(obj, key, value);
return value;
});
} else {
clobber(obj, key, value);
}
}
function include(parent, objects, clobber, merge) {
each(objects, function (obj, key) {
try {
var result = obj.path ? require(obj.path) : {};
if (clobber) {
// Clobber if it doesn't exist.
if (typeof parent[key] === 'undefined') {
assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
} else if (typeof obj.path !== 'undefined') {
// If merging, merge properties onto parent, otherwise, clobber.
if (merge) {
recursiveMerge(parent[key], result);
} else {
assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
}
}
result = parent[key];
} else {
// Overwrite if not currently defined.
if (typeof parent[key] == 'undefined') {
assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
} else {
// Set result to what already exists, so we can build children into it if they exist.
result = parent[key];
}
}
if (obj.children) {
include(result, obj.children, clobber, merge);
}
} catch(e) {
utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"');
}
});
}
/**
* Merge properties from one object onto another recursively. Properties from
* the src object will overwrite existing target property.
*
* @param target Object to merge properties into.
* @param src Object to merge properties from.
*/
function recursiveMerge(target, src) {
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
if (target.prototype && target.prototype.constructor === target) {
// If the target object is a constructor override off prototype.
clobber(target.prototype, prop, src[prop]);
} else {
if (typeof src[prop] === 'object' && typeof target[prop] === 'object') {
recursiveMerge(target[prop], src[prop]);
} else {
clobber(target, prop, src[prop]);
}
}
}
}
}
exports.buildIntoButDoNotClobber = function(objects, target) {
include(target, objects, false, false);
};
exports.buildIntoAndClobber = function(objects, target) {
include(target, objects, true, false);
};
exports.buildIntoAndMerge = function(objects, target) {
include(target, objects, true, true);
};
exports.recursiveMerge = recursiveMerge;
exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter;
exports.replaceHookForTesting = function() {};
});
// file: src/common/channel.js
define("cordova/channel", function(require, exports, module) {
var utils = require('cordova/utils'),
nextGuid = 1;
/**
* Custom pub-sub "channel" that can have functions subscribed to it
* This object is used to define and control firing of events for
* cordova initialization, as well as for custom events thereafter.
*
* The order of events during page load and Cordova startup is as follows:
*
* onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed.
* onNativeReady* Internal event that indicates the Cordova native side is ready.
* onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created.
* onDeviceReady* User event fired to indicate that Cordova is ready
* onResume User event fired to indicate a start/resume lifecycle event
* onPause User event fired to indicate a pause lifecycle event
*
* The events marked with an * are sticky. Once they have fired, they will stay in the fired state.
* All listeners that subscribe after the event is fired will be executed right away.
*
* The only Cordova events that user code should register for are:
* deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript
* pause App has moved to background
* resume App has returned to foreground
*
* Listeners can be registered as:
* document.addEventListener("deviceready", myDeviceReadyListener, false);
* document.addEventListener("resume", myResumeListener, false);
* document.addEventListener("pause", myPauseListener, false);
*
* The DOM lifecycle events should be used for saving and restoring state
* window.onload
* window.onunload
*
*/
/**
* Channel
* @constructor
* @param type String the channel name
*/
var Channel = function(type, sticky) {
this.type = type;
// Map of guid -> function.
this.handlers = {};
// 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
this.state = sticky ? 1 : 0;
// Used in sticky mode to remember args passed to fire().
this.fireArgs = null;
// Used by onHasSubscribersChange to know if there are any listeners.
this.numHandlers = 0;
// Function that is called when the first listener is subscribed, or when
// the last listener is unsubscribed.
this.onHasSubscribersChange = null;
},
channel = {
/**
* Calls the provided function only after all of the channels specified
* have been fired. All channels must be sticky channels.
*/
join: function(h, c) {
var len = c.length,
i = len,
f = function() {
if (!(--i)) h();
};
for (var j=0; j<len; j++) {
if (c[j].state === 0) {
throw Error('Can only use join with sticky channels.');
}
c[j].subscribe(f);
}
if (!len) h();
},
create: function(type) {
return channel[type] = new Channel(type, false);
},
createSticky: function(type) {
return channel[type] = new Channel(type, true);
},
/**
* cordova Channels that must fire before "deviceready" is fired.
*/
deviceReadyChannelsArray: [],
deviceReadyChannelsMap: {},
/**
* Indicate that a feature needs to be initialized before it is ready to be used.
* This holds up Cordova's "deviceready" event until the feature has been initialized
* and Cordova.initComplete(feature) is called.
*
* @param feature {String} The unique feature name
*/
waitForInitialization: function(feature) {
if (feature) {
var c = channel[feature] || this.createSticky(feature);
this.deviceReadyChannelsMap[feature] = c;
this.deviceReadyChannelsArray.push(c);
}
},
/**
* Indicate that initialization code has completed and the feature is ready to be used.
*
* @param feature {String} The unique feature name
*/
initializationComplete: function(feature) {
var c = this.deviceReadyChannelsMap[feature];
if (c) {
c.fire();
}
}
};
function forceFunction(f) {
if (typeof f != 'function') throw "Function required as first argument!";
}
/**
* Subscribes the given function to the channel. Any time that
* Channel.fire is called so too will the function.
* Optionally specify an execution context for the function
* and a guid that can be used to stop subscribing to the channel.
* Returns the guid.
*/
Channel.prototype.subscribe = function(f, c) {
// need a function to call
forceFunction(f);
if (this.state == 2) {
f.apply(c || this, this.fireArgs);
return;
}
var func = f,
guid = f.observer_guid;
if (typeof c == "object") { func = utils.close(c, f); }
if (!guid) {
// first time any channel has seen this subscriber
guid = '' + nextGuid++;
}
func.observer_guid = guid;
f.observer_guid = guid;
// Don't add the same handler more than once.
if (!this.handlers[guid]) {
this.handlers[guid] = func;
this.numHandlers++;
if (this.numHandlers == 1) {
this.onHasSubscribersChange && this.onHasSubscribersChange();
}
}
};
/**
* Unsubscribes the function with the given guid from the channel.
*/
Channel.prototype.unsubscribe = function(f) {
// need a function to unsubscribe
forceFunction(f);
var guid = f.observer_guid,
handler = this.handlers[guid];
if (handler) {
delete this.handlers[guid];
this.numHandlers--;
if (this.numHandlers === 0) {
this.onHasSubscribersChange && this.onHasSubscribersChange();
}
}
};
/**
* Calls all functions subscribed to this channel.
*/
Channel.prototype.fire = function(e) {
var fail = false,
fireArgs = Array.prototype.slice.call(arguments);
// Apply stickiness.
if (this.state == 1) {
this.state = 2;
this.fireArgs = fireArgs;
}
if (this.numHandlers) {
// Copy the values first so that it is safe to modify it from within
// callbacks.
var toCall = [];
for (var item in this.handlers) {
toCall.push(this.handlers[item]);
}
for (var i = 0; i < toCall.length; ++i) {
toCall[i].apply(this, fireArgs);
}
if (this.state == 2 && this.numHandlers) {
this.numHandlers = 0;
this.handlers = {};
this.onHasSubscribersChange && this.onHasSubscribersChange();
}
}
};
// defining them here so they are ready super fast!
// DOM event that is received when the web page is loaded and parsed.
channel.createSticky('onDOMContentLoaded');
// Event to indicate the Cordova native side is ready.
channel.createSticky('onNativeReady');
// Event to indicate that all Cordova JavaScript objects have been created
// and it's time to run plugin constructors.
channel.createSticky('onCordovaReady');
// Event to indicate that all automatically loaded JS plugins are loaded and ready.
// FIXME remove this
channel.createSticky('onPluginsReady');
// Event to indicate that Cordova is ready
channel.createSticky('onDeviceReady');
// Event to indicate a resume lifecycle event
channel.create('onResume');
// Event to indicate a pause lifecycle event
channel.create('onPause');
// Channels that must fire before "deviceready" is fired.
channel.waitForInitialization('onCordovaReady');
channel.waitForInitialization('onDOMContentLoaded');
module.exports = channel;
});
// file: e:/cordova/cordova-ios/cordova-js-src/exec.js
define("cordova/exec", function(require, exports, module) {
/**
* Creates a gap bridge iframe used to notify the native code about queued
* commands.
*/
var cordova = require('cordova'),
channel = require('cordova/channel'),
utils = require('cordova/utils'),
base64 = require('cordova/base64'),
// XHR mode does not work on iOS 4.2.
// XHR mode's main advantage is working around a bug in -webkit-scroll, which
// doesn't exist only on iOS 5.x devices.
// IFRAME_NAV is the fastest.
// IFRAME_HASH could be made to enable synchronous bridge calls if we wanted this feature.
jsToNativeModes = {
IFRAME_NAV: 0, // Default. Uses a new iframe for each poke.
// XHR bridge appears to be flaky sometimes: CB-3900, CB-3359, CB-5457, CB-4970, CB-4998, CB-5134
XHR_NO_PAYLOAD: 1, // About the same speed as IFRAME_NAV. Performance not about the same as IFRAME_NAV, but more variable.
XHR_WITH_PAYLOAD: 2, // Flakey, and not as performant
XHR_OPTIONAL_PAYLOAD: 3, // Flakey, and not as performant
IFRAME_HASH_NO_PAYLOAD: 4, // Not fully baked. A bit faster than IFRAME_NAV, but risks jank since poke happens synchronously.
IFRAME_HASH_WITH_PAYLOAD: 5, // Slower than no payload. Maybe since it has to be URI encoded / decoded.
WK_WEBVIEW_BINDING: 6 // Only way that works for WKWebView :)
},
bridgeMode,
execIframe,
execHashIframe,
hashToggle = 1,
execXhr,
requestCount = 0,
vcHeaderValue = null,
commandQueue = [], // Contains pending JS->Native messages.
isInContextOfEvalJs = 0,
failSafeTimerId = 0;
function shouldBundleCommandJson() {
if (bridgeMode === jsToNativeModes.XHR_WITH_PAYLOAD) {
return true;
}
if (bridgeMode === jsToNativeModes.XHR_OPTIONAL_PAYLOAD) {
var payloadLength = 0;
for (var i = 0; i < commandQueue.length; ++i) {
payloadLength += commandQueue[i].length;
}
// The value here was determined using the benchmark within CordovaLibApp on an iPad 3.
return payloadLength < 4500;
}
return false;
}
function massageArgsJsToNative(args) {
if (!args || utils.typeName(args) != 'Array') {
return args;
}
var ret = [];
args.forEach(function(arg, i) {
if (utils.typeName(arg) == 'ArrayBuffer') {
ret.push({
'CDVType': 'ArrayBuffer',
'data': base64.fromArrayBuffer(arg)
});
} else {
ret.push(arg);
}
});
return ret;
}
function massageMessageNativeToJs(message) {
if (message.CDVType == 'ArrayBuffer') {
var stringToArrayBuffer = function(str) {
var ret = new Uint8Array(str.length);
for (var i = 0; i < str.length; i++) {
ret[i] = str.charCodeAt(i);
}
return ret.buffer;
};
var base64ToArrayBuffer = function(b64) {
return stringToArrayBuffer(atob(b64));
};
message = base64ToArrayBuffer(message.data);
}
return message;
}
function convertMessageToArgsNativeToJs(message) {
var args = [];
if (!message || !message.hasOwnProperty('CDVType')) {
args.push(message);
} else if (message.CDVType == 'MultiPart') {
message.messages.forEach(function(e) {
args.push(massageMessageNativeToJs(e));
});
} else {
args.push(massageMessageNativeToJs(message));
}
return args;
}
function iOSExec() {
if (bridgeMode === undefined) {
bridgeMode = jsToNativeModes.IFRAME_NAV;
}
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.cordova && window.webkit.messageHandlers.cordova.postMessage) {
bridgeMode = jsToNativeModes.WK_WEBVIEW_BINDING;
}
var successCallback, failCallback, service, action, actionArgs, splitCommand;
var callbackId = null;
if (typeof arguments[0] !== "string") {
// FORMAT ONE
successCallback = arguments[0];
failCallback = arguments[1];
service = arguments[2];
action = arguments[3];
actionArgs = arguments[4];
// Since we need to maintain backwards compatibility, we have to pass
// an invalid callbackId even if no callback was provided since plugins
// will be expecting it. The Cordova.exec() implementation allocates
// an invalid callbackId and passes it even if no callbacks were given.
callbackId = 'INVALID';
} else {
// FORMAT TWO, REMOVED
try {
splitCommand = arguments[0].split(".");
action = splitCommand.pop();
service = splitCommand.join(".");
actionArgs = Array.prototype.splice.call(arguments, 1);
console.log('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' +
"cordova.exec(null, null, \"" + service + "\", \"" + action + "\"," + JSON.stringify(actionArgs) + ");"
);
return;
} catch (e) {}
}
// If actionArgs is not provided, default to an empty array
actionArgs = actionArgs || [];
// Register the callbacks and add the callbackId to the positional
// arguments if given.
if (successCallback || failCallback) {
callbackId = service + cordova.callbackId++;
cordova.callbacks[callbackId] =
{success:successCallback, fail:failCallback};
}
actionArgs = massageArgsJsToNative(actionArgs);
var command = [callbackId, service, action, actionArgs];
// Stringify and queue the command. We stringify to command now to
// effectively clone the command arguments in case they are mutated before
// the command is executed.
commandQueue.push(JSON.stringify(command));
if (bridgeMode === jsToNativeModes.WK_WEBVIEW_BINDING) {
window.webkit.messageHandlers.cordova.postMessage(command);
} else {
// If we're in the context of a stringByEvaluatingJavaScriptFromString call,
// then the queue will be flushed when it returns; no need for a poke.
// Also, if there is already a command in the queue, then we've already
// poked the native side, so there is no reason to do so again.
if (!isInContextOfEvalJs && commandQueue.length == 1) {
pokeNative();
}
}
}
function pokeNative() {
switch (bridgeMode) {
case jsToNativeModes.XHR_NO_PAYLOAD:
case jsToNativeModes.XHR_WITH_PAYLOAD:
case jsToNativeModes.XHR_OPTIONAL_PAYLOAD:
pokeNativeViaXhr();
break;
default: // iframe-based.
pokeNativeViaIframe();
}
}
function pokeNativeViaXhr() {
// This prevents sending an XHR when there is already one being sent.
// This should happen only in rare circumstances (refer to unit tests).
if (execXhr && execXhr.readyState != 4) {
execXhr = null;
}
// Re-using the XHR improves exec() performance by about 10%.
execXhr = execXhr || new XMLHttpRequest();
// Changing this to a GET will make the XHR reach the URIProtocol on 4.2.
// For some reason it still doesn't work though...
// Add a timestamp to the query param to prevent caching.
execXhr.open('HEAD', "/!gap_exec?" + (+new Date()), true);
if (!vcHeaderValue) {
vcHeaderValue = /.*\((.*)\)$/.exec(navigator.userAgent)[1];
}
execXhr.setRequestHeader('vc', vcHeaderValue);
execXhr.setRequestHeader('rc', ++requestCount);
if (shouldBundleCommandJson()) {
execXhr.setRequestHeader('cmds', iOSExec.nativeFetchMessages());
}
execXhr.send(null);
}
function pokeNativeViaIframe() {
// CB-5488 - Don't attempt to create iframe before document.body is available.
if (!document.body) {
setTimeout(pokeNativeViaIframe);
return;
}
if (bridgeMode === jsToNativeModes.IFRAME_HASH_NO_PAYLOAD || bridgeMode === jsToNativeModes.IFRAME_HASH_WITH_PAYLOAD) {
// TODO: This bridge mode doesn't properly support being removed from the DOM (CB-7735)
if (!execHashIframe) {
execHashIframe = document.createElement('iframe');
execHashIframe.style.display = 'none';
document.body.appendChild(execHashIframe);
// Hash changes don't work on about:blank, so switch it to file:///.
execHashIframe.contentWindow.history.replaceState(null, null, 'file:///#');
}
// The delegate method is called only when the hash changes, so toggle it back and forth.
hashToggle = hashToggle ^ 3;
var hashValue = '%0' + hashToggle;
if (bridgeMode === jsToNativeModes.IFRAME_HASH_WITH_PAYLOAD) {
hashValue += iOSExec.nativeFetchMessages();
}
execHashIframe.contentWindow.location.hash = hashValue;
} else {
// Check if they've removed it from the DOM, and put it back if so.
if (execIframe && execIframe.contentWindow) {
execIframe.contentWindow.location = 'gap://ready';
} else {
execIframe = document.createElement('iframe');
execIframe.style.display = 'none';
execIframe.src = 'gap://ready';
document.body.appendChild(execIframe);
}
// Use a timer to protect against iframe being unloaded during the poke (CB-7735).
// This makes the bridge ~ 7% slower, but works around the poke getting lost
// when the iframe is removed from the DOM.
// An onunload listener could be used in the case where the iframe has just been
// created, but since unload events fire only once, it doesn't work in the normal
// case of iframe reuse (where unload will have already fired due to the attempted
// navigation of the page).
failSafeTimerId = setTimeout(function() {
if (commandQueue.length) {
pokeNative();
}
}, 50); // Making this > 0 improves performance (marginally) in the normal case (where it doesn't fire).
}
}
iOSExec.jsToNativeModes = jsToNativeModes;
iOSExec.setJsToNativeBridgeMode = function(mode) {
// Remove the iFrame since it may be no longer required, and its existence
// can trigger browser bugs.
// https://issues.apache.org/jira/browse/CB-593
if (execIframe) {
if (execIframe.parentNode) {
execIframe.parentNode.removeChild(execIframe);
}
execIframe = null;
}
bridgeMode = mode;
};
iOSExec.nativeFetchMessages = function() {
// Stop listing for window detatch once native side confirms poke.
if (failSafeTimerId) {
clearTimeout(failSafeTimerId);
failSafeTimerId = 0;
}
// Each entry in commandQueue is a JSON string already.
if (!commandQueue.length) {
return '';
}
var json = '[' + commandQueue.join(',') + ']';
commandQueue.length = 0;
return json;
};
iOSExec.nativeCallback = function(callbackId, status, message, keepCallback) {
return iOSExec.nativeEvalAndFetch(function() {
var success = status === 0 || status === 1;
var args = convertMessageToArgsNativeToJs(message);
cordova.callbackFromNative(callbackId, success, status, args, keepCallback);
});
};
iOSExec.nativeEvalAndFetch = function(func) {
// This shouldn't be nested, but better to be safe.
isInContextOfEvalJs++;
try {
func();
return iOSExec.nativeFetchMessages();
} finally {
isInContextOfEvalJs--;
}
};
module.exports = iOSExec;
});
// file: src/common/exec/proxy.js
define("cordova/exec/proxy", function(require, exports, module) {
// internal map of proxy function
var CommandProxyMap = {};
module.exports = {
// example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);
add:function(id,proxyObj) {
console.log("adding proxy for " + id);
CommandProxyMap[id] = proxyObj;
return proxyObj;
},
// cordova.commandProxy.remove("Accelerometer");
remove:function(id) {
var proxy = CommandProxyMap[id];
delete CommandProxyMap[id];
CommandProxyMap[id] = null;
return proxy;
},
get:function(service,action) {
return ( CommandProxyMap[service] ? CommandProxyMap[service][action] : null );
}
};
});
// file: src/common/init.js
define("cordova/init", function(require, exports, module) {
var channel = require('cordova/channel');
var cordova = require('cordova');
var modulemapper = require('cordova/modulemapper');
var platform = require('cordova/platform');
var pluginloader = require('cordova/pluginloader');
var utils = require('cordova/utils');
var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];
function logUnfiredChannels(arr) {
for (var i = 0; i < arr.length; ++i) {
if (arr[i].state != 2) {
console.log('Channel not fired: ' + arr[i].type);
}
}
}
window.setTimeout(function() {
if (channel.onDeviceReady.state != 2) {
console.log('deviceready has not fired after 5 seconds.');
logUnfiredChannels(platformInitChannelsArray);
logUnfiredChannels(channel.deviceReadyChannelsArray);
}
}, 5000);
// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
function replaceNavigator(origNavigator) {
var CordovaNavigator = function() {};
CordovaNavigator.prototype = origNavigator;
var newNavigator = new CordovaNavigator();
// This work-around really only applies to new APIs that are newer than Function.bind.
// Without it, APIs such as getGamepads() break.
if (CordovaNavigator.bind) {
for (var key in origNavigator) {
if (typeof origNavigator[key] == 'function') {
newNavigator[key] = origNavigator[key].bind(origNavigator);
}
else {
(function(k) {
utils.defineGetterSetter(newNavigator,key,function() {
return origNavigator[k];
});
})(key);
}
}
}
return newNavigator;
}
if (window.navigator) {
window.navigator = replaceNavigator(window.navigator);
}
if (!window.console) {
window.console = {
log: function(){}
};
}
if (!window.console.warn) {
window.console.warn = function(msg) {
this.log("warn: " + msg);
};
}
// Register pause, resume and deviceready channels as events on document.
channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onActivated = cordova.addDocumentEventHandler('activated');
channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');
// Listen for DOMContentLoaded and notify our channel subscribers.
if (document.readyState == 'complete' || document.readyState == 'interactive') {
channel.onDOMContentLoaded.fire();
} else {
document.addEventListener('DOMContentLoaded', function() {
channel.onDOMContentLoaded.fire();
}, false);
}
// _nativeReady is global variable that the native side can set
// to signify that the native code is ready. It is a global since
// it may be called before any cordova JS is ready.
if (window._nativeReady) {
channel.onNativeReady.fire();
}
modulemapper.clobbers('cordova', 'cordova');
modulemapper.clobbers('cordova/exec', 'cordova.exec');
modulemapper.clobbers('cordova/exec', 'Cordova.exec');
// Call the platform-specific initialization.
platform.bootstrap && platform.bootstrap();
// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
// The delay allows the attached modules to be defined before the plugin loader looks for them.
setTimeout(function() {
pluginloader.load(function() {
channel.onPluginsReady.fire();
});
}, 0);
/**
* Create all cordova objects once native side is ready.
*/
channel.join(function() {
modulemapper.mapModules(window);
platform.initialize && platform.initialize();
// Fire event to notify that all objects are created
channel.onCordovaReady.fire();
// Fire onDeviceReady event once page has fully loaded, all
// constructors have run and cordova info has been received from native
// side.
channel.join(function() {
require('cordova').fireDocumentEvent('deviceready');
}, channel.deviceReadyChannelsArray);
}, platformInitChannelsArray);
});
// file: src/common/init_b.js
define("cordova/init_b", function(require, exports, module) {
var channel = require('cordova/channel');
var cordova = require('cordova');
var modulemapper = require('cordova/modulemapper');
var platform = require('cordova/platform');
var pluginloader = require('cordova/pluginloader');
var utils = require('cordova/utils');
var platformInitChannelsArray = [channel.onDOMContentLoaded, channel.onNativeReady, channel.onPluginsReady];
// setting exec
cordova.exec = require('cordova/exec');
function logUnfiredChannels(arr) {
for (var i = 0; i < arr.length; ++i) {
if (arr[i].state != 2) {
console.log('Channel not fired: ' + arr[i].type);
}
}
}
window.setTimeout(function() {
if (channel.onDeviceReady.state != 2) {
console.log('deviceready has not fired after 5 seconds.');
logUnfiredChannels(platformInitChannelsArray);
logUnfiredChannels(channel.deviceReadyChannelsArray);
}
}, 5000);
// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
function replaceNavigator(origNavigator) {
var CordovaNavigator = function() {};
CordovaNavigator.prototype = origNavigator;
var newNavigator = new CordovaNavigator();
// This work-around really only applies to new APIs that are newer than Function.bind.
// Without it, APIs such as getGamepads() break.
if (CordovaNavigator.bind) {
for (var key in origNavigator) {
if (typeof origNavigator[key] == 'function') {
newNavigator[key] = origNavigator[key].bind(origNavigator);
}
else {
(function(k) {
utils.defineGetterSetter(newNavigator,key,function() {
return origNavigator[k];
});
})(key);
}
}
}
return newNavigator;
}
if (window.navigator) {
window.navigator = replaceNavigator(window.navigator);
}
if (!window.console) {
window.console = {
log: function(){}
};
}
if (!window.console.warn) {
window.console.warn = function(msg) {
this.log("warn: " + msg);
};
}
// Register pause, resume and deviceready channels as events on document.
channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onActivated = cordova.addDocumentEventHandler('activated');
channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');
// Listen for DOMContentLoaded and notify our channel subscribers.
if (document.readyState == 'complete' || document.readyState == 'interactive') {
channel.onDOMContentLoaded.fire();
} else {
document.addEventListener('DOMContentLoaded', function() {
channel.onDOMContentLoaded.fire();
}, false);
}
// _nativeReady is global variable that the native side can set
// to signify that the native code is ready. It is a global since
// it may be called before any cordova JS is ready.
if (window._nativeReady) {
channel.onNativeReady.fire();
}
// Call the platform-specific initialization.
platform.bootstrap && platform.bootstrap();
// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
// The delay allows the attached modules to be defined before the plugin loader looks for them.
setTimeout(function() {
pluginloader.load(function() {
channel.onPluginsReady.fire();
});
}, 0);
/**
* Create all cordova objects once native side is ready.
*/
channel.join(function() {
modulemapper.mapModules(window);
platform.initialize && platform.initialize();
// Fire event to notify that all objects are created
channel.onCordovaReady.fire();
// Fire onDeviceReady event once page has fully loaded, all
// constructors have run and cordova info has been received from native
// side.
channel.join(function() {
require('cordova').fireDocumentEvent('deviceready');
}, channel.deviceReadyChannelsArray);
}, platformInitChannelsArray);
});
// file: src/common/modulemapper.js
define("cordova/modulemapper", function(require, exports, module) {
var builder = require('cordova/builder'),
moduleMap = define.moduleMap,
symbolList,
deprecationMap;
exports.reset = function() {
symbolList = [];
deprecationMap = {};
};
function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) {
if (!(moduleName in moduleMap)) {
throw new Error('Module ' + moduleName + ' does not exist.');
}
symbolList.push(strategy, moduleName, symbolPath);
if (opt_deprecationMessage) {
deprecationMap[symbolPath] = opt_deprecationMessage;
}
}
// Note: Android 2.3 does have Function.bind().
exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
};
exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
};
exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
};
exports.runs = function(moduleName) {
addEntry('r', moduleName, null);
};
function prepareNamespace(symbolPath, context) {
if (!symbolPath) {
return context;
}
var parts = symbolPath.split('.');
var cur = context;
for (var i = 0, part; part = parts[i]; ++i) {
cur = cur[part] = cur[part] || {};
}
return cur;
}
exports.mapModules = function(context) {
var origSymbols = {};
context.CDV_origSymbols = origSymbols;
for (var i = 0, len = symbolList.length; i < len; i += 3) {
var strategy = symbolList[i];
var moduleName = symbolList[i + 1];
var module = require(moduleName);
// <runs/>
if (strategy == 'r') {
continue;
}
var symbolPath = symbolList[i + 2];
var lastDot = symbolPath.lastIndexOf('.');
var namespace = symbolPath.substr(0, lastDot);
var lastName = symbolPath.substr(lastDot + 1);
var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
var parentObj = prepareNamespace(namespace, context);
var target = parentObj[lastName];
if (strategy == 'm' && target) {
builder.recursiveMerge(target, module);
} else if ((strategy == 'd' && !target) || (strategy != 'd')) {
if (!(symbolPath in origSymbols)) {
origSymbols[symbolPath] = target;
}
builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
}
}
};
exports.getOriginalSymbol = function(context, symbolPath) {
var origSymbols = context.CDV_origSymbols;
if (origSymbols && (symbolPath in origSymbols)) {
return origSymbols[symbolPath];
}
var parts = symbolPath.split('.');
var obj = context;
for (var i = 0; i < parts.length; ++i) {
obj = obj && obj[parts[i]];
}
return obj;
};
exports.reset();
});
// file: src/common/modulemapper_b.js
define("cordova/modulemapper_b", function(require, exports, module) {
var builder = require('cordova/builder'),
symbolList = [],
deprecationMap;
exports.reset = function() {
symbolList = [];
deprecationMap = {};
};
function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) {
symbolList.push(strategy, moduleName, symbolPath);
if (opt_deprecationMessage) {
deprecationMap[symbolPath] = opt_deprecationMessage;
}
}
// Note: Android 2.3 does have Function.bind().
exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
};
exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
};
exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) {
addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
};
exports.runs = function(moduleName) {
addEntry('r', moduleName, null);
};
function prepareNamespace(symbolPath, context) {
if (!symbolPath) {
return context;
}
var parts = symbolPath.split('.');
var cur = context;
for (var i = 0, part; part = parts[i]; ++i) {
cur = cur[part] = cur[part] || {};
}
return cur;
}
exports.mapModules = function(context) {
var origSymbols = {};
context.CDV_origSymbols = origSymbols;
for (var i = 0, len = symbolList.length; i < len; i += 3) {
var strategy = symbolList[i];
var moduleName = symbolList[i + 1];
var module = require(moduleName);
// <runs/>
if (strategy == 'r') {
continue;
}
var symbolPath = symbolList[i + 2];
var lastDot = symbolPath.lastIndexOf('.');
var namespace = symbolPath.substr(0, lastDot);
var lastName = symbolPath.substr(lastDot + 1);
var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
var parentObj = prepareNamespace(namespace, context);
var target = parentObj[lastName];
if (strategy == 'm' && target) {
builder.recursiveMerge(target, module);
} else if ((strategy == 'd' && !target) || (strategy != 'd')) {
if (!(symbolPath in origSymbols)) {
origSymbols[symbolPath] = target;
}
builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
}
}
};
exports.getOriginalSymbol = function(context, symbolPath) {
var origSymbols = context.CDV_origSymbols;
if (origSymbols && (symbolPath in origSymbols)) {
return origSymbols[symbolPath];
}
var parts = symbolPath.split('.');
var obj = context;
for (var i = 0; i < parts.length; ++i) {
obj = obj && obj[parts[i]];
}
return obj;
};
exports.reset();
});
// file: e:/cordova/cordova-ios/cordova-js-src/platform.js
define("cordova/platform", function(require, exports, module) {
module.exports = {
id: 'ios',
bootstrap: function() {
require('cordova/channel').onNativeReady.fire();
}
};
});
// file: src/common/pluginloader.js
define("cordova/pluginloader", function(require, exports, module) {
var modulemapper = require('cordova/modulemapper');
var urlutil = require('cordova/urlutil');
// Helper function to inject a <script> tag.
// Exported for testing.
exports.injectScript = function(url, onload, onerror) {
var script = document.createElement("script");
// onload fires even when script fails loads with an error.
script.onload = onload;
// onerror fires for malformed URLs.
script.onerror = onerror;
script.src = url;
document.head.appendChild(script);
};
function injectIfNecessary(id, url, onload, onerror) {
onerror = onerror || onload;
if (id in define.moduleMap) {
onload();
} else {
exports.injectScript(url, function() {
if (id in define.moduleMap) {
onload();
} else {
onerror();
}
}, onerror);
}
}
function onScriptLoadingComplete(moduleList, finishPluginLoading) {
// Loop through all the plugins and then through their clobbers and merges.
for (var i = 0, module; module = moduleList[i]; i++) {
if (module.clobbers && module.clobbers.length) {
for (var j = 0; j < module.clobbers.length; j++) {
modulemapper.clobbers(module.id, module.clobbers[j]);
}
}
if (module.merges && module.merges.length) {
for (var k = 0; k < module.merges.length; k++) {
modulemapper.merges(module.id, module.merges[k]);
}
}
// Finally, if runs is truthy we want to simply require() the module.
if (module.runs) {
modulemapper.runs(module.id);
}
}
finishPluginLoading();
}
// Handler for the cordova_plugins.js content.
// See plugman's plugin_loader.js for the details of this object.
// This function is only called if the really is a plugins array that isn't empty.
// Otherwise the onerror response handler will just call finishPluginLoading().
function handlePluginsObject(path, moduleList, finishPluginLoading) {
// Now inject the scripts.
var scriptCounter = moduleList.length;
if (!scriptCounter) {
finishPluginLoading();
return;
}
function scriptLoadedCallback() {
if (!--scriptCounter) {
onScriptLoadingComplete(moduleList, finishPluginLoading);
}
}
for (var i = 0; i < moduleList.length; i++) {
injectIfNecessary(moduleList[i].id, path + moduleList[i].file, scriptLoadedCallback);
}
}
function findCordovaPath() {
var path = null;
var scripts = document.getElementsByTagName('script');
var term = '/cordova.js';
for (var n = scripts.length-1; n>-1; n--) {
var src = scripts[n].src.replace(/\?.*$/, ''); // Strip any query param (CB-6007).
if (src.indexOf(term) == (src.length - term.length)) {
path = src.substring(0, src.length - term.length) + '/';
break;
}
}
return path;
}
// Tries to load all plugins' js-modules.
// This is an async process, but onDeviceReady is blocked on onPluginsReady.
// onPluginsReady is fired when there are no plugins to load, or they are all done.
exports.load = function(callback) {
var pathPrefix = findCordovaPath();
if (pathPrefix === null) {
console.log('Could not find cordova.js script tag. Plugin loading may fail.');
pathPrefix = '';
}
injectIfNecessary('cordova/plugin_list', pathPrefix + 'cordova_plugins.js', function() {
var moduleList = require("cordova/plugin_list");
handlePluginsObject(pathPrefix, moduleList, callback);
}, callback);
};
});
// file: src/common/pluginloader_b.js
define("cordova/pluginloader_b", function(require, exports, module) {
var modulemapper = require('cordova/modulemapper');
// Handler for the cordova_plugins.js content.
// See plugman's plugin_loader.js for the details of this object.
function handlePluginsObject(moduleList) {
// if moduleList is not defined or empty, we've nothing to do
if (!moduleList || !moduleList.length) {
return;
}
// Loop through all the modules and then through their clobbers and merges.
for (var i = 0, module; module = moduleList[i]; i++) {
if (module.clobbers && module.clobbers.length) {
for (var j = 0; j < module.clobbers.length; j++) {
modulemapper.clobbers(module.id, module.clobbers[j]);
}
}
if (module.merges && module.merges.length) {
for (var k = 0; k < module.merges.length; k++) {
modulemapper.merges(module.id, module.merges[k]);
}
}
// Finally, if runs is truthy we want to simply require() the module.
if (module.runs) {
modulemapper.runs(module.id);
}
}
}
// Loads all plugins' js-modules. Plugin loading is syncronous in browserified bundle
// but the method accepts callback to be compatible with non-browserify flow.
// onDeviceReady is blocked on onPluginsReady. onPluginsReady is fired when there are
// no plugins to load, or they are all done.
exports.load = function(callback) {
var moduleList = require("cordova/plugin_list");
handlePluginsObject(moduleList);
callback();
};
});
// file: src/common/urlutil.js
define("cordova/urlutil", function(require, exports, module) {
/**
* For already absolute URLs, returns what is passed in.
* For relative URLs, converts them to absolute ones.
*/
exports.makeAbsolute = function makeAbsolute(url) {
var anchorEl = document.createElement('a');
anchorEl.href = url;
return anchorEl.href;
};
});
// file: src/common/utils.js
define("cordova/utils", function(require, exports, module) {
var utils = exports;
/**
* Defines a property getter / setter for obj[key].
*/
utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) {
if (Object.defineProperty) {
var desc = {
get: getFunc,
configurable: true
};
if (opt_setFunc) {
desc.set = opt_setFunc;
}
Object.defineProperty(obj, key, desc);
} else {
obj.__defineGetter__(key, getFunc);
if (opt_setFunc) {
obj.__defineSetter__(key, opt_setFunc);
}
}
};
/**
* Defines a property getter for obj[key].
*/
utils.defineGetter = utils.defineGetterSetter;
utils.arrayIndexOf = function(a, item) {
if (a.indexOf) {
return a.indexOf(item);
}
var len = a.length;
for (var i = 0; i < len; ++i) {
if (a[i] == item) {
return i;
}
}
return -1;
};
/**
* Returns whether the item was found in the array.
*/
utils.arrayRemove = function(a, item) {
var index = utils.arrayIndexOf(a, item);
if (index != -1) {
a.splice(index, 1);
}
return index != -1;
};
utils.typeName = function(val) {
return Object.prototype.toString.call(val).slice(8, -1);
};
/**
* Returns an indication of whether the argument is an array or not
*/
utils.isArray = Array.isArray ||
function(a) {return utils.typeName(a) == 'Array';};
/**
* Returns an indication of whether the argument is a Date or not
*/
utils.isDate = function(d) {
return (d instanceof Date);
};
/**
* Does a deep clone of the object.
*/
utils.clone = function(obj) {
if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
return obj;
}
var retVal, i;
if(utils.isArray(obj)){
retVal = [];
for(i = 0; i < obj.length; ++i){
retVal.push(utils.clone(obj[i]));
}
return retVal;
}
retVal = {};
for(i in obj){
if(!(i in retVal) || retVal[i] != obj[i]) {
retVal[i] = utils.clone(obj[i]);
}
}
return retVal;
};
/**
* Returns a wrapped version of the function
*/
utils.close = function(context, func, params) {
return function() {
var args = params || arguments;
return func.apply(context, args);
};
};
//------------------------------------------------------------------------------
function UUIDcreatePart(length) {
var uuidpart = "";
for (var i=0; i<length; i++) {
var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
if (uuidchar.length == 1) {
uuidchar = "0" + uuidchar;
}
uuidpart += uuidchar;
}
return uuidpart;
}
/**
* Create a UUID
*/
utils.createUUID = function() {
return UUIDcreatePart(4) + '-' +
UUIDcreatePart(2) + '-' +
UUIDcreatePart(2) + '-' +
UUIDcreatePart(2) + '-' +
UUIDcreatePart(6);
};
/**
* Extends a child object from a parent object using classical inheritance
* pattern.
*/
utils.extend = (function() {
// proxy used to establish prototype chain
var F = function() {};
// extend Child from Parent
return function(Child, Parent) {
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.__super__ = Parent.prototype;
Child.prototype.constructor = Child;
};
}());
/**
* Alerts a message in any available way: alert or console.log.
*/
utils.alert = function(msg) {
if (window.alert) {
window.alert(msg);
} else if (console && console.log) {
console.log(msg);
}
};
});
window.cordova = require('cordova');
// file: src/scripts/bootstrap.js
require('cordova/init');
})();
cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
{
"file": "plugins/cordova-plugin-Pactera/Pactera.js",
"id": "cordova-plugin-Pactera.Pactera",
"clobbers": [
"Pactera"
]
},
{
"file": "plugins/cordova-plugin-Camera/Camera.js",
"id": "cordova-plugin-Camera.Camera",
"clobbers": [
"Camera"
]
},
{
"file": "plugins/cordova-plugin-Video/Video.js",
"id": "cordova-plugin-Video.Video",
"clobbers": [
"Video"
]
}
];
module.exports.metadata =
// TOP OF METADATA
{
"cordova-plugin-whitelist":"1.2.2",
"cordova-plugin-Pactera":"1.0.0",
"cordova-plugin-Camera":"1.0.0",
"cordova-plugin-Video":"1.0.0"
};
// BOTTOM OF METADATA
});
\ No newline at end of file
/*
* 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;
}
<!DOCTYPE html>
<html>
<head>
<title>Capture Photo</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8" src="pactera.js"></script>
<script type="text/javascript" charset="utf-8">
var destinationType;
document.addEventListener("deviceready",onDeviceReady,false);
//Cordova加载完成会触发
function onDeviceReady() {
destinationType=navigator.camera.DestinationType;
}
//语音识别
function speechButton(){
CDVOriginalPort("GetSpeechData",null,onSuccess,onError);
function onSuccess(Data){
alert(JSON.stringify(Data));
}
function onError(Data){
alert(JSON.stringify(Data));
}
}
//拍照
function takePhone(){
CDVOriginalPort("takePhoto",{attachId:"123",taskId:"123"},onSuccess,onError);
function onSuccess(Data){
alert(JSON.stringify(Data));
}
function onError(Data){
alert(JSON.stringify(Data));
}
}
function queryDbTable(){
CDVOriginalPort("queryDbTable",{attachId:"123"},onSuccess,onError);
function onSuccess(Data){
alert(JSON.stringify(Data));
}
function onError(Data){
alert(JSON.stringify(Data));
}
}
</script>
</head>
<body style="padding-bottom:50px">
<button style="font-size:23px;" type="button" onclick="speechButton();">语音识别</button>
<button style="font-size:23px;" type="button" onclick="takePhone();">拍照</button>
<button style="font-size:23px;" type="button" onclick="queryDbTable();">xxxxx</button>
<br>
</body>
</html>
\ No newline at end of file
/*
* 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() {
app.receivedEvent('deviceready');
},
// Update DOM on a Received Event
receivedEvent: function(id) {
var parentElement = document.getElementById(id);
var listeningElement = parentElement.querySelector('.listening');
var receivedElement = parentElement.querySelector('.received');
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
console.log('Received Event: ' + id);
}
};
app.initialize();
\ No newline at end of file
//对外提供的统一接口方法
function CDVOriginalPort(RequestType, RequestData, fun_callbackSuccess, fun_callbackFail) {
if (RequestType == "GetSpeechData") {//语音识别
camera_speech(RequestData, fun_callbackSuccess, fun_callbackFail);
}else if(RequestType=="goToTabActivity"){//跳转首页
pactera_goToTabActivity(RequestData,fun_callbackSuccess,fun_callbackFail)
}else if(RequestType=="goToQRCode"){//跳转扫描二维码
pactera_goToQRCode(RequestData,fun_callbackSuccess,fun_callbackFail)
}else if(RequestType == "setMenu"){//设置自定义页面title
pactera_setMenu(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "goToH5"){//跳转h5
pactera_goToH5(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "fileManage"){//跳转文件管理
pactera_fileManage(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "fileManageNew"){//跳转文件管理
pactera_fileManageNew(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "takePhoto"){//跳转照相
camera_takePhoto(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "soundRecording"){//跳转语音
pactera_soundRecording(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "takeVideo"){//跳转录像
video_takeVideo(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "saveH5Data"){//保存h5数据
pactera_saveH5Data(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "getH5Data"){//获取h5数据
pactera_getH5Data(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "clearCacheData"){//清除缓存
patera_clearCacheData(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "exit_login"){//退出登录
pactera_exit_login(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "setSystemPara"){//系统设置
pactera_setSystemPara(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "queryDbTable"){//查询本地数据库
pactera_queryDbTable(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "upload"){//上传文件
pactera_upload(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "goToOcr"){//ocr扫描
pactera_goToOcr(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "showInput"){//调用键盘
pactera_showInput(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "backToLogin"){//调用键盘
pactera_backToLogin(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "practicePlatform"){//进入练习平台
pactera_practicePlatform(RequestData,fun_callbackSuccess,fun_callbackFail);
}else if(RequestType == "exitPracticePlatform"){//退出练习平台
pactera_exitPracticePlatform(RequestData,fun_callbackSuccess,fun_callbackFail);
}
}
// 语音识别方法
function camera_speech(RequestData, fun_callbackSuccess, fun_callbackFail) {
Pactera.getSpeechData(RequestData, fun_callbackSuccess, fun_callbackFail);
}
// 跳转首页
function pactera_goToTabActivity(RequestData, fun_callbackSuccess, fun_callbackFail) {
Pactera.goToTabActivity(RequestData, fun_callbackSuccess, fun_callbackFail);
}
// 跳转扫描页面
function pactera_goToQRCode(RequestData, fun_callbackSuccess, fun_callbackFail) {
Pactera.goToQRCode(RequestData, fun_callbackSuccess, fun_callbackFail);
}
//设置页面自定义title
function pactera_setMenu(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.setMenu(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//跳转h5页面
function pactera_goToH5(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.goToH5(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//跳转文件管理
function pactera_fileManage(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.fileManage(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//跳转文件管理
function pactera_fileManageNew(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.fileManageNew(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//跳转照相
function camera_takePhoto(RequestData,fun_callbackSuccess,fun_callbackFail){
Camera.takePhoto(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//跳转语音
function pactera_soundRecording(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.soundRecording(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//跳转录像
function video_takeVideo(RequestData,fun_callbackSuccess,fun_callbackFail){
Video.takeVideo(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//存h5数据
function pactera_saveH5Data(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.saveH5Data(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//取h5数据
function pactera_getH5Data(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.getH5Data(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//清除缓存
function pactera_clearCacheData(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.clearCacheData(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//退出登录
function pactera_exit_login(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.exit_login(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//系统设置
function pactera_setSystemPara(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.setSystemPara(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//查询数据库
function pactera_queryDbTable(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.queryDbTable(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//文件上传
function pactera_upload(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.upload(RequestData,fun_callbackSuccess,fun_callbackFail);
}
//Ocr扫描
function pactera_goToOcr(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.goToOcr(RequestData,fun_callbackSuccess,fun_callbackFail);
}
function pactera_showInput(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.showInput(RequestData,fun_callbackSuccess,fun_callbackFail);
}
function pactera_backToLogin(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.backToLogin(RequestData,fun_callbackSuccess,fun_callbackFail);
}
function pactera_practicePlatform(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.practicePlatform(RequestData,fun_callbackSuccess,fun_callbackFail);
}
function pactera_exitPracticePlatform(RequestData,fun_callbackSuccess,fun_callbackFail){
Pactera.exitPracticePlatform(RequestData,fun_callbackSuccess,fun_callbackFail);
}
cordova.define("cordova-plugin-Camera.Camera", function(require, exports, module) {
var exec = require('cordova/exec');
module.exports = {
takePhoto:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Camera","takePhoto",[RequestData]);
}
};
});
\ No newline at end of file
cordova.define("cordova-plugin-Pactera.Pactera", function(require, exports, module) {
var exec = require('cordova/exec');
module.exports = {
getSpeechData:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","getSpeechData",[RequestData]);
},
goToTabActivity:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","goToTabActivity",[RequestData]);
},
goToQRCode:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","goToQRCode",[RequestData]);
},
setMenu:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","setMenu",[RequestData]);
},
goToH5:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","goToH5",[RequestData]);
},
fileManage:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","fileManage",[RequestData]);
},
fileManageNew:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","fileManageNew",[RequestData]);
},
soundRecording:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","soundRecording",[RequestData]);
},
saveH5Data:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","saveH5Data",[RequestData]);
},
getH5Data:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","getH5Data",[RequestData]);
},
clearCacheData:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","clearCacheData",[RequestData]);
},
exit_login:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","exit_login",[RequestData]);
},
setSystemPara:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","setSystemPara",[RequestData]);
},
queryDbTable:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","queryDbTable",[RequestData]);
},
upload:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","upload",[RequestData]);
},
goToOcr:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","goToOcr",[RequestData]);
},
showInput:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","showInput",[RequestData]);
},
backToLogin:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","backToLogin",[RequestData]);
},
practicePlatform:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","practicePlatform",[RequestData]);
},
exitPracticePlatform:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Pactera","exitPracticePlatform",[RequestData]);
},
};
});
cordova.define("cordova-plugin-Video.Video", function(require, exports, module) {
var exec = require('cordova/exec');
module.exports = {
takeVideo:function(RequestData,onSuccess,onError){
exec(onSuccess,onError,"Video","takeVideo",[RequestData]);
}
};
});
\ No newline at end of file
<?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.
-->
<widget xmlns = "http://www.w3.org/ns/widgets"
id = "io.cordova.helloCordova"
version = "2.0.0">
<name>Hello Cordova</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author href="http://cordova.io" email="dev@cordova.apache.org">
Apache Cordova Team
</author>
<content src="about:blank" />
<!-- Whitelist docs: https://github.com/apache/cordova-plugin-whitelist -->
<access origin="*" />
<!-- Grant certain URLs the ability to launch external applications. This
behaviour is set to match that of Cordova versions before 3.6.0, and
should be reviewed before launching an application in production. It
may be changed in the future. -->
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<!-- Preferences for iOS -->
<preference name="AllowInlineMediaPlayback" value="false" />
<preference name="BackupWebStorage" value="local" />
<preference name="DisallowOverscroll" value="false" />
<preference name="EnableViewportScale" value="false" />
<preference name="KeyboardDisplayRequiresUserAction" value="true" />
<preference name="MediaPlaybackRequiresUserAction" value="false" />
<preference name="SuppressesIncrementalRendering" value="false" />
<preference name="GapBetweenPages" value="0" />
<preference name="PageLength" value="0" />
<preference name="PaginationBreakingMode" value="page" /> <!-- page, column -->
<preference name="PaginationMode" value="unpaginated" /> <!-- unpaginated, leftToRight, topToBottom, bottomToTop, rightToLeft -->
<feature name="LocalStorage">
<param name="ios-package" value="CDVLocalStorage"/>
</feature>
<!--设备-->
<feature name="Pactera">
<param name="ios-package" value="Pactera"/>
</feature>
<feature name="Video">
<param name="ios-package" value="Video"/>
</feature>
<feature name="Camera">
<param name="ios-package" value="Camera"/>
</feature>
</widget>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment