以下列出的是MADP2.0 产品库MADCore里内置实现的weex插件。
默认的产品MADCore库是不提供下列插件的。
项目上如果要使用下列某些插件,要提前跟MADP产品组说明,然后产品组针对该项目定制打开所需插件开关,提供定制的产品库MADPCore给项目上使用。
自定义Component插件,继承weexSDK里的基类WXComponent,所以可以使用的公共属性如下:
ref
style
ariaHidden
ariaLabel
role
accessible
accessibilityHint
groupAccessibilityChildren
testId
备注:此组件请对照科蓝公司密码控件文档阅读。
password-input
关于LetterAndNumber选项:
1、iOS科蓝密码控件其实没有LetterAndNumber这个选项,前端传入这个选项iOS的MADP SDK将被视作"Full"处理;
2、Android科蓝密码控件,提供给项目上,有的有LetterAndNumber这个选项,有的没有这个选项,请注意查询项目提供的Android密码控件文档。如果Android密码控件没有这个选项但是前端组件设了这个选项,密码键盘将显示不出来。
getKbdLength(callback)
获取输入内容长度,异步回调形式返回结果。 结果类型string。
getKbdContent(callback)
获取输入内容摘要(32位MD5),异步回调形式返回结果。用于比较两个输入框输入内容是否一致。
getKbdContentType(callback)
获取输入内容类型判断值,异步回调形式返回结果。
结果类型int。
getKbdContentType返回值含义:
0
:内容为空(0这个情况是Android的API文档里有的,iOS文档没写0这种情况。或者干脆不判断0的情况,用getKbdLength(callback)方法也可以判断出内容为空的情况)1
:只有数字2
:只有字母3
:字母和数字组合4
:只有特殊字符5
:数字和特殊字符组合6
:字母和特殊字符组合7
:数字,字母和特殊字符组合
getValue(callback)
获取密文,异步回调形式返回结果。注意,有的项目经定制有可能使用的是getValue(timestamp,publickey,callback)
kbdColse()
隐藏键盘
show()
显示键盘
clear()
清空密码控件输入框内容,同时清空密码控件内的密文
verify(callback)
点击功能业务页面“下一步”按钮之时,可调用此方法验证accepts属性设置的正则表达式。回调结果类型int.
verify返回值含义:
0
:合法-1
:内容为空-2
:输入小于最小长度-3
:输入字符不可接受
举例:
component名字: weex-lockview
clear()
清除手势面板上的手势轨迹
error()
显示错误轨迹,前提是已有轨迹
component名字: weex-chart-pie
[
{
"color":"#757575",颜色:#757575
"percent":0.1 百分比:取值范围[0~1]
},
{
"color":"#757575",颜色:#757575
"percent":0.1 百分比:取值范围[0~1]
}
]
refresh()
刷新饼状图
component名字: weex-document
src
filename
filetype
save
自定义了多个Component和Module一块组合使用。
1、相关的Component名称如下:
weex-amap
weex-amap-marker
weex-amap-polyline
weex-amap-polygon
weex-amap-circle
weex-amap-info-window
2、相关的Module名称: amap
与高德地图类似(可查看百度地图官方文档)。
1、相关的Component名称如下:
weex-bmap
weex-bmap-marker
weex-bmap-polyline
weex-bmap-polygon
weex-bmap-circle
weex-bmap-info-window
2、相关的Module名称: bmap
module名字: fingerprint
identify(callback)
获取验证结果。回调返回值为字符串格式,如果为”1”,则表示验证成功 否则返回错误信息。
isHardwareEnable(callback)
检测手机设备是否支持指纹验证。回调返回值为字符串格式,“0"为不支持,“1"为支持。
警告:指纹API只是调用系统指纹硬件,因系统指纹硬件属于系统安全层次,故无法真实获取用户的指纹数据,即相当于只能拿到通过与不通过的结果,在作为指纹登录使用时,建议做好相关免密登录的接口安全设计。
module名字: qr-code
scanQRcode(callback)
扫描二维码。回调返回:扫码结果字符串。申请权限被拒绝和按返回取消操作时返回空字符串””
createQRCode(string,callback)
生成二维码。固定宽高为200x200
入参:string,要生成在二维码里的字符串。
回调:返回json字符串形式,含有字段:base64(二维码图片的base64)、path(二维码图片的本地存放路径)例如:
{"base64":"ASFJLSDFK=SDF=SAFJJJMJSAF",filePath,"path":"/var/.../xx.png"}
createQRCodeWithSize(string,side,callback)
生成二维码,可指定宽高。
入参:string,要生成在二维码里的字符串;side, 指定二维码宽度,int整型,高默认等同于宽。
回调:返回json字符串形式,含有字段:base64(二维码图片的base64)、path(二维码图片的本地存放路径)例如:
{"base64":"ASFJLSDFK=SDF=SAFJJJMJSAF",filePath,"path":"/var/.../xx.png"}
createBarCode(string,callback)
生成条形码。固定宽高600x240。
入参:string,要生成在条形码里的字符串
回调:返回json字符串形式,含有字段:base64(条形码图片的base64)、path(条形码图片的本地存放路径)。例如:
{"base64":"ASFJLSDFK=SDF=SAFJJJMJSAF",filePath,"path":"/var/.../xx.png"}
createBarCodeWithSize(string,width,height,callback)
生成条形码,可指定宽高。
入参:string,要生成在条形码里的字符串。width, 指定宽度。height,指定高度。
回调:返回json字符串形式,含有字段:base64(条形码图片的base64)、path(条形码图片的本地存放路径)。例如:
{"base64":"ASFJLSDFK=SDF=SAFJJJMJSAF",filePath,"path":"/var/.../xx.png"}
Module名字: system-share
share(params)
分享。
入参params 为json字符串。例如:
{"title":"文字","image":"图片的base64", "url":"网址"}
(三个键值对,可以任选,不一定都需要,看需求)
shareWithCallback(params,callback)
分享,带回调。
入参:params 为json字符串。例如:
{"title":"文字","image":"图片的base64", "url":"网址"}
(三个键值对,可以任选,不一定都需要,看需求)
回调:回传一个空字符串""。
Module名字: nav-map
openMap(params)
打开导航。 入参params为json形式字符串。 例如:
{ "mode":"0", //可选 "0" 驾车(默认)"1"(公交) "2"(步行) "3"(骑行) "origin":{ "lat":"11",//纬度(必输) lon":"11",//经度(必输) "name":"起点名称"//(可选) }, destination":{ "lat":"11",//纬度(必输) "lon":"11",//经度(必输) name":"终点名称"//(可选) } }
Module名字: weex-contacts
requestContactAuthor (callback)
选择系统通讯录联系人。
说明:
1)成功,回调返回json形式字符串,例如:{"name":"Lili","phone":"13188888888"}
2)失败,回调返回空字符串""。 例如访问通讯录没有被授权属于失败。
Module名字: weex-camera
注意: iOS平台,最好在mounted方法里用setTimeOut方法做一下延迟再调用下述方法。
startCamera(callback)
调起相机拍照获取图片。
说明:
1)成功,回调返回json形式字符串,例如:{ "isSuccess":"1", //是否成功, 1成功, 0失败 "imgBase64":"图片base64形式字符串", "imgPath":"在手机本地的图片路径" }
2)失败,回调返回json形式字符串,例如:
{ <br>"isSuccess":"0", //是否成功, 1成功, 0失败 <br>"error":"错误描述" }
startGallery(callback)
调起相册选择图片。
说明:回调返回格式,同上。
savePhotoToCamera(baseImgStr,callback)
保存图片到系统相册
说明:
入参: baseImgStr: 图片的标准base64字符串
1)成功,回调返回字符串,例如:"success"
2)失败,回调返回字符串,例如:"fail"
module名字: ocr
备注:ocr采自云从科技
ocrOpenCamera(jsonString,callback)
用于开启ocr摄像头识别。
参数形式:json 格式字符串
参数:ocr_flag, 值:front(正面),back(反面) 默认front;例如:{"ocr_flag":"front"}
返回值形式:json字符串
返回值返回方式:异步回调
返回json字符串数据含字段:path(拍摄后的图片存储路径)、base64(图片base64).结果例如返回:{ "path":"/storage/emulated/0/Android/data/com.csii.www.jzctb/cache/temphoto/20171212165023.jpg", "base64":"JKSJIJYUHSJHDJHS...JDJSDHSDHDDSUYYU==" }
setLicence(licenceString)
设定licence,项目组可采用云从科技提供的。
module名字: face
备注:采自云从科技
setLicence(licenceString)
设定licence,项目组可采用云从科技提供的(安卓和iOS目前为统一licence).
startAliveCheck(callback)
回调返回最佳人脸照片。
返回json字符串格式,例如:{"base64":"KSJIJYUHSJHDJHS...JDJSDHSDHDDSU"}
Module名字: iflymsc
setAppid(appid)
设置appid参数。
入参格式:json形式字符串,含有android和ios两个字段,例如:{ "android":"5a9e5a06", "ios":"5a9e5f22" }
iflyTTS(text)
在线语音合成(文字转语音)。
入参text
格式:字符串,测试时不能传入空字符串。
iflyIAT(callback)
音识别(语音转文字)。不带界面的语音听写。
回调数据类型(Map类型,即字典对象,json对象)。
注意,这里是长期活跃的回调,可多次回调。
回调返回数据会有下边3种情况:
1)录音开始回调{"func":"begin"}
2)录音正在录制回调{"func":"record","result":"录音生成的字符串"}
3)录音结束回调{"func":"end"}
Module名字: etop-ocr
setLicence(licenceFileName)
设置证书文件的名字,就只要文件名(不带.lic后缀)。需要把译图科技后缀为.lic文件放在应用层(安卓和iOS目前为统一licence).
bankCardScan(callback)
扫描银行卡。
扫描银行卡,回调返回结果为json形式字符串数据,如:{ "cardNo":"62179001828338372", "bankName":"浦发银行", "cardName":"轻松理财卡", "bankCode":"03100000", "cardType":"借记卡" }
dCardScan(callback)
扫描身份证。
1)扫描身份证正面,回调返回结果为json形式字符串数据,如:{ "name":"zhangshan", "sex":"nan", "nation":"tujia", "birth":"20171806", "address":"hainan", "idno":"20182737484548548548" }
2)扫描身份证背面(带国徽面)返回结果为json形式字符串数据,如:
{ "sign":"公安局", "validaty":"20230415" }
Module名字: techshino
start(params,callback)
开始人脸识别。
说明:在应用层要放置pem证书。
1)入参params为json形式字符串,例如:{ "faceCfg":"", //人脸拍摄配置,服务端获取 "customInfo":"", //证件号,当前是终端号:12位限制 "serialno":"" //业务流水号,当前是token号:10位限制 }
2)回调返回json形式字符串,例如:
{ "resultMsg":"",//状态码描述信息 "version":"",//控件版本号(非必传) "camType":""//摄像头类型,预留属性(默认值“01”)(非必传) "cryptKey":""//加密因子,预留属性(默认值“37010519660902167800”)(非必传) "imgBase64":""//图像的 base64 数据(加密或不加密)(非必传) "returnCode":"",//状态码 0操作成功,-1抓取人脸超时,-2检测未通过,-3获取 Mac 地址失败,-4参数错误,-5没有发现设备,-6打开设备错误,-7设备断开,-8设备忙 }
用户行为分析,也叫埋点。
此用户行为分析模块,是科蓝公司自己研发的一个产品功能。
使用注意事项:
需要在场景配置文件repo.json中,对要埋点的场景配置参数x-funcType和x-funcName,例如:
"transfer": {
"name": "转账",
"module": "web",
"path": "./vx/index.html#/transfer",
"params": {
"x-fullscreen": "yes"
"x-funcType": "1",
"x-funcName": "行内转账"
},
"preferences": {},
"icon": "icon.png",
"auth_check": []
}
Module名字: countly
enterfunc (funcName,funcType)
进入功能页。
入参说明:
- funcName: 功能名称
- funcType: 字符串类型(“0"查询类, “1"转账类, “2"存款类, “3"理财类, “4"缴费类, ““5其他)
quitfunc (funcName,funcType)
退出功能页。
入参说明:
- funcName: 功能名称
- funcType: 字符串类型(
0
查询类、1
转账类、2
存款类、3
理财类、4
缴费类、5
其他)
recordUserDetails (trsId, userInfo)
登录后传入用户信息。 入参说明:
- trsId: 交易名。
- userInfo: 用户信息, json形式字符串,例如:
{"name":"科蓝","cifno":"1232323","phone":"110"}
字段可选含:name、email、 birthYear 、gender、 phone、cifno
Module名字: yunmai-ocr
ocrBankCard (callback)
扫描银行卡。
说明:回调返回结果为json形式字符串数据,不限正反面,扫描正面会返回正面的相关数据,反面返回反面的相关数据,如:{ "status": "success",//状态码。成功success,失败fail "BankCardInfo": {//银行卡信息 "Num": "4984513037734377",//卡号 "BankName": "浦东发展银行(03100000)",//银行名称 "CardName": "VISA白金信用卡",//卡名称 "CardType": "贷记卡",//卡类型 "IMGPath":"/sdcard/abankcard.jpg"//拍照图片地址 }, "errMsg": "" }
ocrIDCard (callback)
扫描身份证。
说明:回调返回结果为json形式字符返回,不限正反面,扫描正面会返回正面的相关数据,反面返回反面的相关数据,如:{ "status": "success",//状态码。成功success,失败fail "IdCardInfo": {//身份证信息 "Name": "王富强",//姓名 "Sex": "男",//性别 "Folk": "汉",//民族 "Birt": "1993年07月27日",//出生日期 "Addr": "山东省荣成市港湾街道办事处张家小区418号楼2单元503室",//地址 "Num": "37108219930727xxxx",//身份证号 "Issue": "",//颁发机构 "Valid": "",//有效期 "Type": "正面", "Cover": "无遮挡", "IMGPath": "/sdcard/IMG1539143093595.jpg",//拍照图片地址 "HEADPath": "/sdcard/HEAD.jpg"//身份证头像图片地址 }, "errMsg": ""//错误描述,如引擎过期,拍照错误等错误描述,fail会返回该字段 }
Module名字: cfca-fido
isDeviceSupportFIDO(callback)
判断手机硬件设备是否支持FIDO。
说明:回调返回结果为json形式字符串,如:{ "isSupport":"Y" //Y支持 N不支持 }
checkPolicy(uafProtocolMessage, callback)
检查是否开启了FIDO认证,即检查用户开启了哪种类型的认证。
说明:回调返回结果为json形式字符串。
(1)成功时返回:{ "result":"success", "fingerOpenType":"close", // 可能值: close指纹认证关闭, pay支付指纹认证开启, login登录指纹认证开启, all所有都开启 "FIDOCode":"Fido的错误码" //成功时也返回该字段,有助于调试分析错误类型 }
(2) 错误时返回:
{ "result":"fail", "errMessage":"原生自己转义的fido错误码描述", "FIDOCode":"Fido的错误码" }
processUAFOperation(uafProtocolMessage, completeCallback, errorCallback)
处理uafProtocolMessage。
说明:回调返回结果为json形式字符串。
需要两个回调,如:
- completeCallback返回:
{ "uafProtocolMessage":"uafProtocolMessage数据", "additionalData":"additionalData数据" }
- errorCallback返回:
{ FIDOCode":"Fido的错误码", "errMessage":"module转义的fido错误码描述" }
Module名字: weex-cfcahke
getRandomStr(params, callBack)
获取随机数。
1、入参说明:入参params传入是json字符串, 需含有如下这些字段:
- name //姓名
- type //证件类型 “0”为身份证
- idnum //证件号码
- mobile //手机号
- deviceID //手机设备ID
- encryptedSensitiveKey // 密钥。根据项目方案来决定是否启用密钥,不用的话值默认为”"。
- authInfo //意思就是userIndentity,值默认为””
- orgID //机构码, SDK厂商分配
- appID //app码, SDK厂商分配
- serviceType //服务器类型,值为三种:“0"代表生产,“1"代表test,“2"代表debug
- userInfo // 此字段可不写。写的话值的格式,例如:
{ "EnterpriseInfo":{"operator":""},//操作员 "IFAA":{"deviceInfo":""} }
2、回调说明:回调返回数据是json字符串。
1)错误时返回字段:
- type //“0” 失败
- msg // 错误描述字符串
2)成功时返回字段:
- type //“1” 成功
- serverRandom //随机数
auth(randomSignature, callBack)
身份认证。
入参说明:入参randomSignature //随机数签名,即机构服务器用机构证书对随机数的签名。
回调说明:回调数据是json字符串。
1、错误回调返回字段:
- type //“0” 失败
- msg // 错误描述字符串
2、成功回调, 有两种情况: 1)有证书的情况,返回:
- type //“1” 成功
- state // 写死“1”, 表示本地有证书
- PinState // API返回的PIN状态码,string形式
- msg // 值写死“本地有证书”
2)无证书的情况,
- type //“1” 成功
- state // 写死“2”, 表示需下载证书
- PinState // API返回的PIN状态码,string形式
- msg //描述信息,值:“没有证书请下载”或"证书已过期请重新下载”或"本地证书已失效请重新下载”
downloadCertificate(callBack)
证书下载。
说明:回调数据是json字符串。
错误回调返回字段:
- type //“0” 失败
- msg // 错误描述字符串
成功回调返回字段:
- type //“1” 成功
- msg //描述信息, 值:“证书下载成功”
- CertSn //证书序列号
- CertApplyDate //证书申请日期,日期格式 yyyy-MM-dd HH:mm:ss
- CertEndDate //证书到期日期
doSign(params, callBack)
业务签名(无PIN码)。
1、入参说明:
入参params传入是json字符串, 需含有如下这些字段:{ "orgContent": "签名原文", //符合云证通要求拼装的JSON字符串。签名原文是在机构服务器(银行服务器)上完成拼装的 "signValue": "签名结果" //银行服务器将拼装的JSON原文发往云证通服务器得到的签名结果,再下发给客户端 }
2、回调说明:回调数据是json字符串。 1)错误回调返回字段:
- type //“0” 失败
- msg // 错误描述字符串
2)成功回调返回字段:
- type //“1” 成功
- msg //签名结果(JSON形式的签名原文里的businessText字段值是真正的业务原文, SDK这里就是对这个businessText字段值进行签名的结果)
pwdDoSign(params, encryptedSignPassword, encryptedClientRandom, callBack)
业务签名(有PIN码)。
1、入参说明:
入参params传入是json字符串, 需含有如下这个字段:{ "orgContent":"签名原文", //符合云证通要求拼装的JSON字符串。签名原文是在机构服务器上完成拼装然后下发给客户端,由客户端传入SDK "signValue": "签名结果" //对拼装的JSON原文的签名 }
其他入参:
encryptedSignPassword //使用云证通安全控件加密的加密密码(Base64格式)
encryptedClientRandom //使用云证通安全控件加密的加密客户端随机数(Base64格式)
2、回调说明:回调数据是json字符串。
1)错误回调返回字段:
- type //“0” 失败
- msg // 错误描述字符串
2)成功回调返回字段:
- type //“1” 成功
- msg //签名结果(JSON形式的签名原文里的businessText字段值是真正的业务原文, SDK这里就是对这个businessText字段值进行签名的结果)
Module名字: meg-live
startAliveCheck(callBack)
活体检测
说明:回调返回结果为json形式字符串数据
成功返回字段:
- status:”success”
- imgPath://图片路径
- imgBase64:图片base64
失败返回字段:
- status:”fail”
- errMsg://错误信息
Module名字: device-info
getCommType (callBack)
获取设备接入点名称
说明:回调返回结果为String形式数据,成功返回字段:“WIFI”
getScreenSize (callBack)
获取屏幕分辨率
说明:回调返回结果为String形式数据,成功返回字段:“1080x1920”
getDeviceVersion (callBack)
获取设备系统版本
说明:回调返回结果为String形式数据,成功返回字段:“Android 8.0.0”
getClientVersion (callBack)
获取App版本
说明:回调返回结果为String形式数据,成功返回字段:“1.1”
getDeviceType (callBack)
获取设备类型
说明:回调返回结果为String形式数据,成功返回字段:“Android”
getModel(callBack)
获取机型
说明:回调返回结果为String形式数据,成功返回字段:“SM-G9500”
getBrand (callBack)
获取厂商
说明:回调返回结果为String形式数据,成功返回字段:“samsung”
getMAC (callBack)
获取MAC
说明:回调返回结果为String形式数据,成功返回字段:“02:00:00:00:00:00”<
getIMEI (callBack)
获取IMEI
说明:回调返回结果为String形式数据,成功返回字段:“123456789012345”
Module名字: umeng-share
initKey (json)
友盟和第三方平台的授权码
入参说明:json字符串{ "UMKey": "友盟key", "WeiXinID": "微信ID", "WeiXinKey": "微信授权key", "QQID": "QQid", "QQKey": "QQ授权key", "SINAID": "新浪id", "SINAKey": "新浪授权key", "SINAUrl": "http://sns.whalecloud.com" }
shareText (shareContent,share_media,callBack)
分享文本
入参说明:
- shareContent:分享文本内容;
- share_media:分享平台(
- SMS:短信
- SINA:新浪微博
- QZONE:QQ空间
- QQ:QQ好友
- WEIXIN:微信好友
- WEIXIN_CIRCLE:微信朋友圈
- WEIXIN_FAVORITE:微信收藏);
回调返回结果为json字符串 成功返回字段:
- status : success
- errMsg : 分享成功
失败返回字段:
- status : fail
- errMsg : 分享失败
shareUMImg (img64,share_media,callBack)
分享图片
入参说明:
- img64:分享图片的base64字符串;
- share_media:分享平台(详情参考shareText)
回调返回结果为json字符串 成功返回字段:
- status : success
- errMsg : 分享成功
失败返回字段:
- status : fail
- errMsg : 分享失败
shareWeb (json,share_media,callBack)
分享链接
入参说明:json字符串分享内容,格式为:{ "title": "标题", "content": "内容", "url": "分享链接", "img64": "缩略图的base64(不设置缩略图,会使用桌面启动图标作为缩略图)" }
share_media
分享平台(详情参考shareText)
回调返回结果为json字符串 成功返回字段:
- status : success
- errMsg : 分享成功
失败返回字段:
- status : fail
- errMsg : 分享失败
Module名字: galaxy-ocr
checkCameraOcrWithParams (json,callback)
相机拍照识别
入参说明:json字符串{ "type": "1", }
checkScanOcrWithParams (json,callback)
扫描识别 入参说明:json字符串
{ "type": "1", }
checkPhotoAlbumOcrWithParams (json,callback)
相册识别 入参说明:json字符串
{ "type": "1", }
type | 说明 |
---|---|
1 | 身份证人像 |
2 | 身份证国徽 |
3 | 银行卡 |
4 | 社保卡 |
5 | 营业执照 |
6 | 车牌号 |
7 | 驾驶证 |
8 | 行驶证 |
9 | 护照 |
10 | 结婚证 |
11 | 军官证 |
{ "resultType":resultType, "name":name, "sex":sex, "nation":nation, "birthday":birthday, "address":address, "address1":address1, "address2":address2, "idCardNo":idCardNo, "img":imgBase64 }
{ "resultType":resultType, "issue":issue, "expiryDate":expiryDate, "img":imgBase64 }
{ "resultType":resultType, "bankName":bankName, "bankCardNo":bankCardNo, "img":imgBase64 }
{ "resultType":resultType, "bankName":bankName, "name":name, "socialSecurityNumber":socialSecurityNumber, "cardNumber":cardNumber, "issuingDate":issuingDate, "bankCardNo":bankCardNo, "img":imgBase64 }
{ "resultType":resultType, "licenseCode":licenseCode, "registCode":registCode, "companyName":companyName, "mainType":mainType, "type":type, "address":address, "place":place, "directorName":directorName, "operators":operators, "director":director, "date":date, "businessTerm":businessTerm, "registerCapital":registerCapital, "businessRange":businessRange, "licenseRange":licenseRange, "img":imgBase64 }
{ "resultType":resultType, "carNumber":carNumber, "img":imgBase64 }
Android调用友盟分享注意事项:
Key申请网站
QQ回调配置
在AndroidManifest.xml的application节点中添加以下内容:
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent100424468" />
</intent-filter>
</activity>
scheme的格式为tencent+(QQ开发者平台申请的ID),如tencent123456789
签名文件配置 在app的build.gradle文件中配置签名 如:
android{
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
buildTypes {
debug {
signingConfig signingConfigs. debug
}
}
}