import 'dart:convert'; import 'dart:math'; import 'package:flustars/flustars.dart' as FlutterStars; import 'package:flutter/material.dart'; import 'package:flutter_alipay/flutter_alipay.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:fluwx/fluwx.dart' as fluwx; // import 'package:image/image.dart'; import 'package:liftmanager/common/common.dart'; import 'package:liftmanager/internal/bbs/bbs_router.dart'; import 'package:liftmanager/net/api_service.dart'; import 'package:liftmanager/res/resources.dart'; import 'package:liftmanager/routers/fluro_navigator.dart'; import 'package:liftmanager/utils/fast_notification.dart'; import 'package:liftmanager/utils/theme_utils.dart'; import 'package:liftmanager/utils/time_format.dart'; import 'package:liftmanager/utils/toast.dart'; import 'package:liftmanager/widgets/app_bar.dart'; import 'package:liftmanager/widgets/load_image.dart'; import 'package:shared_preferences/shared_preferences.dart'; class BuyService extends StatefulWidget { BuyService(this.id); final String id; @override State createState() { return BuyServiceState(); } } class BuyServiceState extends State { // ExpertListState({Key key}) : super(key: key); bool sortBool = true; String couponChiose = '请选择'; String redChiose = '请选择'; String typeName = "卡券"; String questionType; int typeIdssCoupon; int typeIdssRed; double priceCoupon = 0.0; double priceRed = 0.0; double priceTotal = 0.0; int dataId; String expertName; double expertFee; double apiExpertFee = 0.0; dynamic _wxPay; @override initState() { super.initState(); setSchema(); _initFluwx(); getDataId(); getType(); getCoupon(); getExpertName(); getExpertFee(); indexNow = 0; } _initFluwx() async { await fluwx.registerWxApi( appId: "wx0f10e6386fb9969e", doOnAndroid: true, doOnIOS: true, universalLink: "https://www.edtyun.com/"); var result = await fluwx.isWeChatInstalled(); setState(() {}); } void setSchema() async { // await FlutterAlipay.setIosUrlSchema("tytylift"); await FlutterAlipay.setIosUrlSchema("com.tyty.lift.managers"); } void getDataId() async { SharedPreferences prefs = await SharedPreferences.getInstance(); dataId = prefs.getInt("dataId"); } void getType() async { SharedPreferences prefs = await SharedPreferences.getInstance(); questionType = prefs.getString("questionType"); } void getExpertName() async { SharedPreferences prefs = await SharedPreferences.getInstance(); expertName = prefs.getString("expertName"); } void getExpertFee() async { SharedPreferences prefs = await SharedPreferences.getInstance(); if (prefs.getDouble("expertFee") != null) { expertFee = prefs.getDouble("expertFee"); } else { expertFee = 0.0; } setState(() {}); print(expertFee); print(6666543); // priceTotal = expertFee; if (expertFee == 0.0) { getApiFee(); } else { priceTotal = expertFee; } } List couponList = []; Future getCouponList(type) async { couponList = []; await NewApiService().getCouponListNoPage( type, expertFee != null && expertFee != 0.0 ? expertFee.toString() : apiExpertFee.toString(), onSuccess: (res) { if (res != null) { couponList = res; print(jsonEncode(res)); print(111222); setState(() {}); } }, onError: (code, msg) { toasts(msg); }); } Future getApiFee() async { await NewApiService().getFee(onSuccess: (res) { if (res != null) { apiExpertFee = res; priceTotal = apiExpertFee; setState(() {}); print(res); print(6666544); } }, onError: (code, msg) { toasts(msg); }); } //余额支付 Future lastMoneyPay(orders) async { int liftCaseType; String payType; questionType == "1" ? liftCaseType = 1 : liftCaseType = 2; questionType == "1" ? payType = "CASE" : payType = "CALL"; await NewApiService().getAlipayBalanceApp({ "payType": payType, "orders": orders, "liftCaseType": liftCaseType, "userId": FlutterStars.SpUtil.getString(Constant.userId), }, onSuccess: (res) { // moneyList = res; upDataMoney(); getRoom(); }, onError: (code, msg) { toasts(msg); }); } // 根据orderNo获取支付宝订单信息 Future getAlipayOrderInfo(ordersNo) async { int liftCaseType; questionType == "1" ? liftCaseType = 1 : liftCaseType = 2; await NewApiService().aliPay( payway: 'alipay', orders: ordersNo, liftCaseType: liftCaseType, onSuccess: (res) { callAlipay(res); }, onError: (code, msg) { toasts(msg); }); } // 根据orderNo获取wx订单信息 Future getWxOrderInfo(ordersNo) async { int liftCaseType; questionType == "1" ? liftCaseType = 1 : liftCaseType = 2; await NewApiService().wxPay( payway: 'wx', orders: ordersNo, liftCaseType: liftCaseType, onSuccess: (res) { wxMethod(res); }, onError: (code, msg) { toasts(msg); }); } wxMethod(_payInfo) { print(_payInfo["appid"]); fluwx .payWithWeChat( appId: _payInfo["appid"], partnerId: _payInfo["partnerid"], prepayId: _payInfo["prepayid"], packageValue: _payInfo["package"], nonceStr: _payInfo["noncestr"], timeStamp: int.parse(_payInfo["timestamp"]), sign: _payInfo["sign"]) .then((data) { print(data); }); _wxPay?.cancel(); _wxPay = fluwx.responseFromPayment .listen((fluwx.WeChatPaymentResponse response) async { print("WeChatPaymentResponse" + response.errCode.toString()); if (response.errCode == -2) { //支付取消 toasts("支付取消"); } else if (response.errCode == -1) { //支付失败 toasts("支付失败"); } else if (response.errCode == 0) { //支付成功 upDataMoney(); getRoom(); } }); } //根据专家Id和诊单Id获取orderId 0:余额 1:支付宝 Future generateOrder(int type) async { await NewApiService().generateOrder({ "id": dataId, "chargerId": widget.id, "couponId": typeIdssCoupon, "packetId": typeIdssRed }, onSuccess: (res) { print(res); if (res != null) { if (type == 0) { lastMoneyPay(res); } else if (type == 1) { getAlipayOrderInfo(res); } else if (type == 2) { getWxOrderInfo(res); } } print(555); }, onError: (code, msg) { toasts(msg); }); } upDataMoney() { String initThisUserMoney = randomInt(1111, 9999).toString() + DateTime.now().millisecondsSinceEpoch.toString(); FastNotification.push("initUserMoney", initThisUserMoney); } randomInt(int min, int max) { return new Random().nextInt(max) % (max - min + 1) + min; } //根据orderId来判断支付完成 // Future getPayType(orderId) async { // await NewApiService().getTestAlipayNotify(orderId, onSuccess: (res) { // print(res); // print(666); // getRoom(); // }, onError: (code, msg) { // toasts(msg); // }); // } //支付完成后用诊单Id获取房间号 Future getRoom() async { await NewApiService().findOne(dataId, onSuccess: (res) { print(res); String roomId = res.sessionid; // toasts("支付成功,即将进入聊天室!"); toasts("支付成功,即将进入聊天室!"); NavigatorUtils.push(context, "${BbsRouter.chatRoom}?id=$roomId&type=someToOne&toUserId=''"); // toasts("欢迎使用,请在使用过程中注意个人信息及财产安全!"); print(666); }, onError: (code, msg) { toasts(msg); }); } void setExpertFee(double expertFee) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setDouble("expertFee", expertFee); } @override void dispose() { setExpertFee(0.0); super.dispose(); } void callAlipay(String _payInfo) async { AlipayResult payResult; try { print("The pay info is : " + _payInfo); payResult = await FlutterAlipay.pay(_payInfo); } on Exception catch (e) { payResult = null; } print(payResult); if (payResult != null) { if (payResult.resultStatus == "9000") { upDataMoney(); getRoom(); } else { toasts(payResult.memo); } } else { toasts("支付异常"); } } String balance = '0'; Future getCoupon() async { await NewApiService().getUserCoupons(onSuccess: (res) { if (res != null) { balance = res["balance"].toString(); setState(() {}); print(6666544); } }, onError: (code, msg) { toasts(msg); }); } static const payType = [ { "icon": "tab_first/pay_yue", "title": "账户余额", "price": "0", }, { "icon": "tab_first/pay_zhifubao", "title": "支付宝", }, { "icon": "tab_first/pay_winxin", "title": "微信", }, ]; int indexNow = 999; String checkFalse = "tab_first/check_false"; String checkTrue = "tab_first/check_true"; @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; double height = MediaQuery.of(context).size.height; return Container( child: Scaffold( appBar: MyAppBar( centerTitle: "购买服务", ), body: Container( child: Stack( children: [ Container( // padding: EdgeInsets.only(top:70), child: ListView(children: [ Container( padding: EdgeInsets.all(ScreenUtil().setWidth(15)), decoration: BoxDecoration( border: Border( bottom: BorderSide( width: 5, color: ThemeUtils.getDialogTextFieldColor(context)), ), ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( questionType == "1" ? "问诊服务" : "出诊服务", style: TextStyle( fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), ]), Row( children: [ Container( child: Text( (expertFee != null && expertFee != 0.0 ? expertName : "平台指定专家") + '-' + (questionType == "1" ? "问诊服务" : "出诊服务"), style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), ), Expanded(child: Container()), Container( child: Text( // "¥${expertFee != null ? expertFee.toString() : '0.0'}", "¥${expertFee != null && expertFee != 0.0 ? expertFee.toString() : apiExpertFee.toString()}", style: TextStyle( color: Colors.red, fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.end, ), ) ], ) ])), // ChioseThis(list: quanListChiose,label: "优惠券",labelText: '无可用优惠券',value:quanChiose,fun:(index){ // setState(() { // quanChiose = quanListChiose[index]; // }); // Navigator.maybePop(context); // }), ChioseThisRight( label: "优惠券", labelText: '无可用优惠券', value: couponChiose, fun: () { setState(() { // brandChiose = brandListChiose[index]; typeName = "卡券"; sortBool = false; print(5656333); }); getCouponList(1); // Navigator.maybePop(context); }), ChioseThisRight( label: "红包", labelText: '无可用红包', value: redChiose, fun: () { setState(() { // brandChiose = brandListChiose[index]; typeName = "红包"; sortBool = false; print(5656333); }); getCouponList(2); // Navigator.maybePop(context); }), // ChioseThis(list: redListChiose,label: "红包",labelText: '无可用红包',value:redChiose,fun:(index){ // setState(() { // redChiose = redListChiose[index]; // }); // Navigator.maybePop(context); // }), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( top: BorderSide( width: 5, color: ThemeUtils.getDialogTextFieldColor(context)), bottom: BorderSide( width: 5, color: ThemeUtils.getDialogTextFieldColor(context)), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "共需支付", style: TextStyle(fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), Text( "¥${priceTotal != null ? priceTotal.toStringAsFixed(2).toString() : '0.0'}", style: TextStyle( color: Colors.red, fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ]), ), Container( padding: EdgeInsets.only( // left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Color(0xfff5f5f5)), ), ), child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( height: 13, width: 2, color: Colours.blue_app_main, ), SizedBox( width: 13, ), Text( "选择支付方式", style: TextStyle(fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ]), ), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15)), child: Column( children: payType.asMap().keys.map((i) { return Container( decoration: BoxDecoration( border: Border( bottom: BorderSide( width: 0.5, color: Color(0xfff5f5f5)), ), ), height: 60, child: InkWell( onTap: () { setState(() { indexNow = i; }); print(indexNow); }, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ LoadAssetImage( // image: AssetImage(i['img']), payType[i]["icon"], width: ScreenUtil().setWidth(20), height: ScreenUtil().setWidth(20), // alignment: Alignment.centerLeft, ), Container(width: 5, child: null), Text( payType[i]["title"], style: TextStyle( fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), Container(width: 5, child: null), Text( payType[i]["price"] != null ? "¥$balance" : "", style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), ], ), Container( // padding: EdgeInsets.only(top:10,left:5,right:5,bottom:10), child: LoadAssetImage( // image: AssetImage(i['img']), indexNow == i ? checkTrue : checkFalse, width: ScreenUtil().setWidth(18), height: ScreenUtil().setWidth(18), // alignment: Alignment.centerLeft, ), ), ])), ); }).toList(), )) ]), ), Positioned( bottom: 0, left: 0, child: Container( width: width, padding: EdgeInsets.only( top: ScreenUtil().setWidth(15), bottom: ScreenUtil().setWidth(15), left: ScreenUtil().setWidth(25), right: ScreenUtil().setWidth(25)), color: ThemeUtils.getDialogTextFieldColor(context), child: Container( height: ScreenUtil().setWidth(44), decoration: BoxDecoration( borderRadius: BorderRadius.circular(22.0), color: Colours.blue_app_main // gradient: const LinearGradient( // colors: [Color(0xFF00D9FF), Color(0xFF0287FF)]), ), child: FlatButton( // padding: EdgeInsets.all(15.0), child: Text("立即购买"), textColor: Colors.white, onPressed: () { // NavigatorUtils.push(context, "${BbsRouter.chatRoom}?id=1111"); if (priceTotal <= 0 && indexNow != 0) { toasts("支付金额为0,请使用余额支付!"); return; } if (indexNow == 0) { showAlert( context, "提示", "确定支付?", "确定", () { generateOrder(0); NavigatorUtils.goBack(context); }, txt2: "取消", onPre2: () { NavigatorUtils.goBack(context); }, ); // NavigatorUtils.push(context, BbsRouter.chatRoom); } else if (indexNow == 1) { generateOrder(1); // NewApiService().aliPayOrder(orders, // onSuccess: (res) { // callAlipay(res); // }, onError: (code, msg) { // toasts(msg); // }); } else if (indexNow == 2) { generateOrder(2); } else { toasts("选择支付方式"); } }, ), ), )), !sortBool ? Positioned( top: 0, left: 0, child: GestureDetector( onTap: () { setState(() { sortBool = true; }); }, child: Container( width: width, height: height, color: Color.fromRGBO(0, 0, 0, 0.5)), ), ) : Container(child: null), !sortBool ? Positioned( top: 0, right: 0, child: Container( width: width / 4 * 3, height: height, color: ThemeUtils.getTabsBg(context), padding: EdgeInsets.all(10), child: ListView( children: [ Container( padding: EdgeInsets.only( left: 5, top: 5, bottom: 10), child: Text( typeName, style: TextStyle( color: Color(0xff666666), fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), ), InkWell( onTap: () { print(priceCoupon); print(priceRed); print(33333333333); setState(() { expertFee != null && expertFee != 0.0 ? priceTotal = expertFee : priceTotal = apiExpertFee; sortBool = true; if (typeName == "卡券") { priceCoupon = 0.0; couponChiose = '请选择'; typeIdssCoupon = null; } else if (typeName == "红包") { priceRed = 0.0; redChiose = '请选择'; typeIdssRed = null; } print(priceCoupon); print(priceRed); print(123465798); if ((priceTotal - priceCoupon - priceRed) < 0) { priceTotal = 0; } else { priceTotal = priceTotal - priceCoupon - priceRed; } couponList = []; }); }, child: Container( // width: width / 4 - 17, padding: EdgeInsets.only( bottom: ScreenUtil().setWidth(10), left: ScreenUtil().setWidth(10), right: ScreenUtil().setWidth(10), top: ScreenUtil().setWidth(10)), margin: EdgeInsets.only( left: 5, right: 5, bottom: 5, top: 5), decoration: BoxDecoration( // border: Border( // bottom: BorderSide(width: 0.5, color: Colours.line), // ), color: ThemeUtils.getDialogTextFieldColor( context)), child: Text( "不选择$typeName", style: TextStyle( fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.center, ), ), ), couponList != null && couponList.length > 0 ? Container( child: Column( children: couponList .asMap() .keys .map((index) { return hongbaoCell(index); }).toList(), )) : Center(child: Text("暂无")), ], ))) : Container(child: null), ], ))), ); } Widget loadCircle() { return Container( padding: EdgeInsets.only(top: 10, bottom: 10), color: ThemeUtils.getTabsBg(context), child: Center( child: SpinKitFadingCircle( color: Colors.blueAccent, size: 30.0, ), ), ); } getScenario(int type) { String str; if (type == 0) { str = "全场通用"; } else if (type == 1) { str = "出诊问诊服务"; } else if (type == 2) { str = "题库"; } else if (type == 3) { str = "视频"; } return str; } hongbaoCell(index) { // typeName == "卡券" return InkWell( onTap: () { setState(() { expertFee != null && expertFee != 0.0 ? priceTotal = expertFee : priceTotal = apiExpertFee; sortBool = true; if (typeName == "卡券") { priceCoupon = couponList[index].coupon.discount; couponChiose = couponList[index].coupon.name ?? ""; typeIdssCoupon = couponList[index].id; } else if (typeName == "红包") { priceRed = couponList[index].coupon.price; redChiose = couponList[index].coupon.name ?? ""; typeIdssRed = couponList[index].id; } if ((priceTotal - priceCoupon - priceRed) < 0) { priceTotal = 0; } else { priceTotal = priceTotal - priceCoupon - priceRed; } couponList = []; }); }, child: typeName == "红包" ? Container( margin: EdgeInsets.only(left: 0, right: 0, bottom: 5, top: 5), child: Stack( children: [ Container( height: 80, width: 300, // color: Colors.red, child: LoadAssetImage( "hongbaoBg", fit: BoxFit.fill, ), ), Container( height: 80, width: 300, // width: width / 4 - 17, padding: EdgeInsets.only( bottom: ScreenUtil().setWidth(10), left: ScreenUtil().setWidth(10), right: ScreenUtil().setWidth(10), top: ScreenUtil().setWidth(10)), margin: EdgeInsets.only(left: 5, right: 5, bottom: 5, top: 5), child: Row( children: [ Text('¥${couponList[index].coupon.price}', style: TextStyle(color: Colors.red, fontSize: 25)), Text(' ¥${couponList[index].coupon.name}', style: TextStyle(color: Colors.red, fontSize: 13)), Expanded(child: Container()), Text('立即使用', style: TextStyle(color: Colors.red, fontSize: 14)), ], )), Positioned( top: 0, left: 0, child: Container( color: Color(0xFFDDD9), child: Text(' 通用红包 ', style: TextStyle(color: Colors.red)), )) ], )) : Container( margin: EdgeInsets.only(left: 0, right: 0, bottom: 5, top: 5), child: Stack( children: [ Positioned( top: 0, left: -10, // right: -30, child: Container( width: 300, height: 122, child: LoadAssetImage( // image: AssetImage(i['img']), "youhuijuanBg", fit: BoxFit.fill, // alignment: Alignment.centerLeft, ), )), Container( // decoration: BoxDecoration( // border:Border.all( // width:2, // color:Colors.red // ) // ), width: 300, height: 90, child: Row( children: [ Container( // padding: EdgeInsets.only(right: 10, left: 15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: 100, child: Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( '¥', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(16), color: Colors.white), ), Text( // '999.0', '${couponList[index].coupon?.discount ?? ''}', // couponList[index].coupon?.discount ?? // '', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(20), color: Colors.white, fontWeight: FontWeight.bold), ), SizedBox( width: 20, ) ], ), ), Container( margin: EdgeInsets.only(left: 20), padding: EdgeInsets.fromLTRB(5, 1, 5, 1), child: Text( // getScenario(provider // .list[index] // .coupon // ?.scenario ?? // 0), '代金劵', textAlign: TextAlign.center, style: TextStyle( fontSize: ScreenUtil().setSp(11), color: Colors.white), ), decoration: new BoxDecoration( //背景 // color: Colors.white, //设置四周圆角 角度 borderRadius: BorderRadius.all( Radius.circular(4.0)), //设置四周边框 border: Border.all( width: 1, color: Colors.white), ), ), ]), ), Container( padding: EdgeInsets.only(top: 30), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '${getScenario(couponList[index].coupon?.scenario ?? 0)}${couponList[index].coupon?.name ?? ""}', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(14), color: Color(0xff333333), ), ), Text( '有效时间: ' + DateUtils.instance.getFormartData( timeSamp: couponList[index] .coupon ?.validity ?? 0, format: "yyyy.MM.dd HH:mm"), textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(11), color: Color(0xff9F9C9F), ), ), SizedBox(height: 5), Container( width: 230 * 0.5, height: 0.5, color: Color(0xffeeeeee), child: null, ), SizedBox(height: 3), Text( couponList[index].coupon?.remark ?? "", textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(11), color: Color(0xff9F9C9F), ), ), ])), ], )), ], )), ); } } class ChioseThisRight extends StatelessWidget { ChioseThisRight({Key key, this.value, this.label, this.fun, this.labelText}) : super(key: key); String value; String label; Function fun; String labelText; @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; return InkWell( onTap: () { fun(); }, child: Container( padding: EdgeInsets.only( top: ScreenUtil().setWidth(15), bottom: ScreenUtil().setWidth(15)), margin: EdgeInsets.only(left: ScreenUtil().setWidth(15)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Colours.line), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( label, style: TextStyle(fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), value.isEmpty ? Container( child: Row(children: [ Text( labelText, style: TextStyle( color: Color(0xffcccccc), // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only(top: 3), child: Icon( Icons.keyboard_arrow_right, size: 20.0, color: Color(0xffcccccc), ), ), SizedBox(width: 10) ]), ) : Container( padding: EdgeInsets.only(right: ScreenUtil().setWidth(15)), child: Row(children: [ Text( value, style: TextStyle(fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ]), ), ]), ), ); } }