Commit bd668bac authored by harrylee's avatar harrylee

add data swap method

parent 44887f8c
......@@ -301,77 +301,84 @@ func (client *JSONClient) QueryBlockInfo(start, end int64, isDetail bool) (*Bloc
return &res, nil
}
// 调用chaincode
func (client *JSONClient) Invoke(requst *Request, privateKey string) (*Response, error) {
// FIXME 这里需完善
if requst.Exec == storage.StorageX {
switch requst.Fcn {
case "set", "ContentStorage":
tx, err := storage.CreateContentStorageTx(client.prefix, 0, string(requst.Args[0]), nil, string(requst.Args[1]))
if err != nil {
return nil, err
}
return client.SendTransactionSync(privateKey, tx)
}
// 发布跨链事件
func (client *JSONClient) EmitDataSwapInterchainEvent(dstServiceID, args, argscb, argsrb string, privateKey string) (*Response, error) {
// FIXME 这里需完善 funcName="interchainGet,interchainSet," txType=0 表示是存在类数据交换
tx, err := broker.EmitInterchainEvent("", dstServiceID, "interchainGet,interchainSet,", args, argsrb, argsrb, 0)
if err != nil {
return nil, err
}
return nil, fmt.Errorf("not matching execution or method!")
return client.SendTransactionSync(privateKey, tx)
}
// TODO 执行请求
func (client *JSONClient) Execute(requst *Request,privateKey string) (*Response, error) {
if requst.Exec == broker.BrokerX{
func (client *JSONClient) Execute(requst *Request, privateKey string) (*Response, error) {
if requst.Exec == broker.BrokerX {
switch requst.Fcn {
case "invokeInterchain":
srcChainServiceID := string(requst.Args[0])
sequenceNum,err := strconv.ParseUint(string(requst.Args[1]), 10, 64)
sequenceNum, err := strconv.ParseUint(string(requst.Args[1]), 10, 64)
if err != nil {
return nil,fmt.Errorf("cannot parse %s to uint64", string(requst.Args[1]))
return nil, fmt.Errorf("cannot parse %s to uint64", string(requst.Args[1]))
}
targetCID := string(requst.Args[2])
reqType, err := strconv.ParseUint(string(requst.Args[3]), 10, 64)
if err != nil {
return nil,fmt.Errorf("cannot parse %s to uint64", string(requst.Args[3]))
return nil, fmt.Errorf("cannot parse %s to uint64", string(requst.Args[3]))
}
if tx, err := broker.UpdateIndex("",srcChainServiceID, targetCID,sequenceNum, reqType,nil); err == nil {
resp,err:=client.SendTransactionSync(privateKey,tx)
if err !=nil {
return resp,err
if tx, err := broker.UpdateIndex("", srcChainServiceID, targetCID, sequenceNum, reqType, nil); err == nil {
resp, err := client.SendTransactionSync(privateKey, tx)
if err != nil {
return resp, err
}
//splitedCID[1]就是合约名称
splitedCID := strings.Split(targetCID, "&")
if len(splitedCID) != 2 {
return nil,fmt.Errorf("Target chaincode id %s is not valid", targetCID)
return nil, fmt.Errorf("Target chaincode id %s is not valid", targetCID)
}
callFunc := &CallFunc{}
if err := json.Unmarshal(requst.Args[4], callFunc); err != nil {
return nil,fmt.Errorf("unmarshal call func failed for %s", requst.Args[4])
return nil, fmt.Errorf("unmarshal call func failed for %s", requst.Args[4])
}
// 调用相应链码, (链码名称,参数,通道名称)
if splitedCID[1] == storage.StorageX{
if splitedCID[1] == storage.StorageX {
//interchainGet方法是在sdk封装的,用于支持跨链之前数据的查询
switch callFunc.Func {
case "interchainGet":
return client.InterChainGet(string(callFunc.Args[0]))
case "interchainGet":
response, err := client.InterChainGet(string(callFunc.Args[0]))
if err != nil {
return resp, err
}
//携带TXhash
response.Message = resp.Message
return response, err
case "interchainSet":
//跨链set kv
return client.InterChainSet(string(callFunc.Args[0]), string(callFunc.Args[1]), privateKey)
}
}else{
return nil,fmt.Errorf("can't support exec %s",splitedCID[1])
} else {
return nil, fmt.Errorf("can't support exec %s", splitedCID[1])
}
}
}
}
return nil, nil
return nil, fmt.Errorf("not matching execution or method!")
}
//包装适配跨链插件调用
func (client *JSONClient) InterChainSet(key,value string) (*Response, error) {
return nil, nil
//包装适配跨链插件调用
func (client *JSONClient) InterChainSet(key, value, privateKey string) (*Response, error) {
tx, err := storage.CreateContentStorageTx("", 0, key, nil, value)
if err != nil {
return nil, err
}
resp, err := client.SendTransactionSync(privateKey, tx)
return resp, err
}
//包装适配跨链插件调用
func (client *JSONClient) InterChainGet(key string) (*Response, error) {
jsonraw, err := json.Marshal(&types.QueryStorage{TxHash: key})
......@@ -388,9 +395,9 @@ func (client *JSONClient) InterChainGet(key string) (*Response, error) {
if err != nil {
return nil, err
}
storage :=data.(*types.Storage)
storage := data.(*types.Storage)
//这里暂时就去明文存证内容
resp := &Response{OK:true,Message:key,Data:storage.GetContentStorage().GetContent()}
resp := &Response{OK: true, Message: key, Data: []byte(storage.GetContentStorage().GetValue())}
return resp, nil
}
......
......@@ -9,18 +9,8 @@ import (
)
// 构造发布跨链交易事件交易
func EmitInterchainEvent(paraName, dstServiceID, funcName string, args []string, txType uint64) (*types.Transaction, error) {
//目的链ID,固定格式0x000001
//string dstServiceID = 2;
////源链ID,固定格式0x000002
//string srcServiceID = 3;
////跨链交易类型 0表示storage,1表示coins,2表示token......
//uint64 type =4;
////调用方法
//string func = 5;
////参数列表
//repeated string args = 6;
payload := &types.BrokerAction{Ty: TyEmitInterchainEventAction, Value: &types.BrokerAction_EmitInterchainEvent{EmitInterchainEvent: &types.InterchainEvent{DstServiceID: dstServiceID, Type: txType, Func: funcName, Args: args}}}
func EmitInterchainEvent(paraName, dstServiceID, funcName string, args,argscb,argsrb string, txType uint64) (*types.Transaction, error) {
payload := &types.BrokerAction{Ty: TyEmitInterchainEventAction, Value: &types.BrokerAction_EmitInterchainEvent{EmitInterchainEvent: &types.InterchainEvent{DstServiceID: dstServiceID, Type: txType, Func: funcName, Args: args,Argscb:argscb,Argsrb:argsrb}}}
if paraName == "" {
tx := &types.Transaction{Execer: []byte(BrokerX), Payload: types.Encode(payload), Fee: 1e5, Nonce: rand.Int63n(time.Now().UnixNano()), To: Addr}
return tx, nil
......@@ -32,16 +22,6 @@ func EmitInterchainEvent(paraName, dstServiceID, funcName string, args []string,
// 构造更新Index交易
func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqType uint64, response *types.Response) (*types.Transaction, error) {
////当前链已经处理到的位置
//uint64 sequenceNum = 1;
////目的链服务ID,固定格式0x000001
//string dstServiceID = 2;
////源链ID,固定格式0x000002
//string srcServiceID = 3;
////请求类型 0表示信息流入 1表示信息流出 2表示回滚
//uint64 reqType =4;
////响应信息
//Response response = 5;
payload := &types.BrokerAction{Ty: TyUpdateIndexAction, Value: &types.BrokerAction_UpdateIndex{UpdateIndex: &types.UpdateIndex{DstServiceID: dstServiceID, SrcServiceID: srcServiceID, ReqType: reqType, SequenceNum: sequenceNum, Response: response}}}
if paraName == "" {
tx := &types.Transaction{Execer: []byte(BrokerX), Payload: types.Encode(payload), Fee: 1e5, Nonce: rand.Int63n(time.Now().UnixNano()), To: Addr}
......@@ -52,6 +32,3 @@ func UpdateIndex(paraName, srcServiceID, dstServiceID string, sequenceNum, reqTy
}
}
func EmitInterchainSetEvent(){
}
......@@ -52,23 +52,26 @@ message UpdateIndex {
//响应信息
Response response = 5;
}
// 跨链事件
message InterchainEvent {
//索引值,这个有系统自动生成
uint64 index = 1;
//目的链ID,固定格式0x000001
string dstServiceID = 2;
//源链ID,固定格式0x000002
string srcServiceID = 3;
//跨链交易类型 0表示storage,1表示coins,2表示token......
uint64 type =4;
//调用方法
string func = 5;
//参数列表
repeated string args = 6;
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败
int32 status = 7;
//索引值,这个有系统自动生成
uint64 index = 1;
//目的链ID,固定格式0x000001
string dstServiceID = 2;
//源链ID,固定格式0x000002
string srcServiceID = 3;
//跨链交易类型 0表示storage,1表示coins,2表示token......
uint64 type =4;
//方法集合分别表示 当前,回调,回滚方法 用,号分割 比如: "interchainGet,interchainSet,interchainRollback"
string func = 5;
//参数列表
string args = 6;
//回调参数
string argscb =7;
//回滚参数
string argsrb =8;
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败
// int32 status = 7;
}
//ReceiptBrokerLog
message ReceiptBrokerLog{
......
......@@ -422,12 +422,14 @@ type InterchainEvent struct {
SrcServiceID string `protobuf:"bytes,3,opt,name=srcServiceID,proto3" json:"srcServiceID,omitempty"`
//跨链交易类型 0表示storage,1表示coins,2表示token......
Type uint64 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"`
//调用方法
//方法集合分别表示 当前,回调,回滚方法 用,号分割 比如: "interchainGet,interchainSet,interchainRollback"
Func string `protobuf:"bytes,5,opt,name=func,proto3" json:"func,omitempty"`
//参数列表
Args []string `protobuf:"bytes,6,rep,name=args,proto3" json:"args,omitempty"`
//状态 0表示开始处理 1表示跨链成功 2表示跨链失败
Status int32 `protobuf:"varint,7,opt,name=status,proto3" json:"status,omitempty"`
Args string `protobuf:"bytes,6,opt,name=args,proto3" json:"args,omitempty"`
//回调参数
Argscb string `protobuf:"bytes,7,opt,name=argscb,proto3" json:"argscb,omitempty"`
//回滚参数
Argsrb string `protobuf:"bytes,8,opt,name=argsrb,proto3" json:"argsrb,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -493,18 +495,25 @@ func (m *InterchainEvent) GetFunc() string {
return ""
}
func (m *InterchainEvent) GetArgs() []string {
func (m *InterchainEvent) GetArgs() string {
if m != nil {
return m.Args
}
return nil
return ""
}
func (m *InterchainEvent) GetStatus() int32 {
func (m *InterchainEvent) GetArgscb() string {
if m != nil {
return m.Status
return m.Argscb
}
return 0
return ""
}
func (m *InterchainEvent) GetArgsrb() string {
if m != nil {
return m.Argsrb
}
return ""
}
//ReceiptBrokerLog
......@@ -1084,52 +1093,53 @@ func init() {
}
var fileDescriptor_f209535e190f2bed = []byte{
// 711 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4f, 0x4f, 0xdb, 0x4a,
0x10, 0x8f, 0x1d, 0x3b, 0x90, 0x49, 0x20, 0xbc, 0x85, 0x87, 0xac, 0x77, 0x78, 0x2f, 0xcf, 0xe2,
0x40, 0x5b, 0x89, 0x4a, 0x20, 0xb5, 0x55, 0xd5, 0x4b, 0x42, 0x91, 0x92, 0x0a, 0x28, 0xdd, 0xfe,
0x51, 0x7b, 0x5c, 0x9c, 0x21, 0x6c, 0x49, 0xd6, 0x66, 0xbd, 0x46, 0xf8, 0xa3, 0xf4, 0x9b, 0xf4,
0xd4, 0x4b, 0xbf, 0x58, 0xb5, 0xeb, 0x4d, 0xe2, 0x04, 0xaa, 0xaa, 0x08, 0xf5, 0x12, 0xed, 0xfc,
0x66, 0x76, 0x67, 0xf2, 0x9b, 0xf9, 0x8d, 0xa1, 0x79, 0x2a, 0xe3, 0x0b, 0x94, 0x3b, 0x89, 0x8c,
0x55, 0x4c, 0x7c, 0x95, 0x27, 0x98, 0x86, 0x5f, 0x5d, 0x68, 0x76, 0x0d, 0xde, 0x89, 0x14, 0x8f,
0x05, 0xf9, 0x1f, 0x3c, 0x2e, 0xb8, 0x0a, 0x9c, 0xb6, 0xb3, 0xdd, 0xd8, 0x6d, 0xec, 0x98, 0xb0,
0x9d, 0xbe, 0xe0, 0xaa, 0x57, 0xa1, 0xc6, 0x45, 0xba, 0xd0, 0x92, 0x38, 0xe4, 0xa9, 0x42, 0x79,
0x70, 0x8d, 0x91, 0x8a, 0x65, 0xe0, 0x9a, 0xe8, 0x4d, 0x1b, 0x4d, 0xe7, 0xbd, 0xbd, 0x0a, 0x5d,
0xbc, 0x40, 0xb6, 0xc0, 0x67, 0xd9, 0x80, 0xab, 0xa0, 0x6a, 0x6e, 0x36, 0xed, 0xcd, 0x8e, 0xc6,
0x7a, 0x15, 0x5a, 0x38, 0xc9, 0x2b, 0x58, 0xc7, 0x31, 0x57, 0x7d, 0xa1, 0x50, 0x46, 0xe7, 0x8c,
0x8b, 0x83, 0x2b, 0x14, 0x2a, 0xf0, 0xe6, 0xb2, 0x2d, 0x78, 0x7b, 0x15, 0x7a, 0xdb, 0x25, 0xf2,
0x04, 0x1a, 0x59, 0x32, 0x60, 0x0a, 0xfb, 0x62, 0x80, 0xd7, 0x81, 0x6f, 0xde, 0x20, 0xf6, 0x8d,
0xf7, 0x33, 0x4f, 0xaf, 0x42, 0xcb, 0x81, 0x64, 0x15, 0x5c, 0x95, 0x07, 0xb5, 0xb6, 0xb3, 0xed,
0x53, 0x57, 0xe5, 0xdd, 0x25, 0xf0, 0xaf, 0xd8, 0x28, 0xc3, 0xf0, 0x05, 0x78, 0x9a, 0x16, 0xb2,
0x01, 0xfe, 0xe9, 0xf5, 0x79, 0x7f, 0x60, 0x28, 0xab, 0xd3, 0xc2, 0x20, 0xff, 0x02, 0xb0, 0x24,
0xd9, 0xd7, 0xf9, 0xfb, 0x03, 0xc3, 0x4f, 0x9d, 0x96, 0x90, 0x70, 0x0f, 0x5a, 0x0b, 0x34, 0x91,
0x36, 0x34, 0xb0, 0x38, 0x1e, 0xb3, 0x31, 0xda, 0xe7, 0xca, 0x50, 0xd8, 0x01, 0xdf, 0x30, 0xf4,
0xeb, 0x50, 0xb2, 0x09, 0xb5, 0x54, 0x31, 0x95, 0xa5, 0x36, 0xb7, 0xb5, 0xc2, 0xc7, 0xd0, 0x3c,
0x89, 0x47, 0x23, 0x2e, 0x86, 0x05, 0x2d, 0xff, 0x81, 0x37, 0x46, 0xc5, 0x16, 0xfa, 0x7d, 0x84,
0x8a, 0x51, 0xe3, 0x08, 0xbf, 0x39, 0xd0, 0x28, 0xd1, 0xa3, 0x53, 0xa7, 0x78, 0x99, 0xa1, 0x88,
0xf0, 0x38, 0x1b, 0x9b, 0x7b, 0x1e, 0x2d, 0x43, 0x24, 0x84, 0xe6, 0x20, 0x55, 0x6f, 0x51, 0x5e,
0xf1, 0x08, 0xfb, 0x2f, 0x6d, 0x01, 0x73, 0x98, 0x8e, 0x49, 0x65, 0x34, 0x8b, 0xa9, 0x16, 0x31,
0x65, 0x8c, 0x04, 0xb0, 0x24, 0xf1, 0xf2, 0x5d, 0x9e, 0xa0, 0xe9, 0xb8, 0x47, 0x27, 0x26, 0x79,
0x04, 0xcb, 0x12, 0xd3, 0x24, 0x16, 0x29, 0xda, 0x46, 0xb6, 0xa6, 0xa3, 0x57, 0xc0, 0x74, 0x1a,
0x10, 0x7e, 0x77, 0xa0, 0xb5, 0x38, 0x0c, 0x1b, 0xe0, 0x73, 0x33, 0x06, 0x45, 0xf9, 0x85, 0x71,
0x6f, 0x85, 0x13, 0xf0, 0xd4, 0xac, 0x6a, 0x73, 0xd6, 0xd8, 0x59, 0x26, 0x22, 0x53, 0x6e, 0x9d,
0x9a, 0xb3, 0xc6, 0x98, 0x1c, 0xa6, 0x41, 0xad, 0x5d, 0xd5, 0x98, 0x3e, 0x97, 0xfa, 0xb6, 0x64,
0x46, 0x6e, 0xd2, 0xb7, 0x2f, 0x2e, 0xac, 0x51, 0x8c, 0x90, 0x27, 0xaa, 0xd0, 0xeb, 0x61, 0x3c,
0xbc, 0x4d, 0x89, 0xce, 0x9d, 0x95, 0xe8, 0xde, 0x41, 0x89, 0xd5, 0x7b, 0x50, 0xa2, 0xf7, 0x7b,
0x4a, 0xf4, 0x6f, 0x2a, 0x51, 0xc1, 0xc6, 0x9b, 0x0c, 0x65, 0xfe, 0x47, 0xbb, 0x1c, 0x76, 0x60,
0xdd, 0x24, 0xdc, 0x9f, 0x26, 0x3c, 0xe4, 0xa9, 0x22, 0x0f, 0xc1, 0x1b, 0xf1, 0x54, 0x2f, 0xd0,
0xea, 0xcf, 0xa9, 0xa1, 0x26, 0x26, 0x6c, 0xc1, 0x8a, 0x29, 0xfc, 0x98, 0x8f, 0x4e, 0x98, 0x64,
0xe3, 0xf0, 0x2f, 0x68, 0x19, 0xe0, 0x75, 0xa6, 0x14, 0x4a, 0xad, 0xc2, 0x70, 0x0d, 0x56, 0xed,
0x9f, 0x13, 0x16, 0xf9, 0x38, 0x45, 0x8e, 0x30, 0x4d, 0xd9, 0x10, 0xc9, 0x16, 0xac, 0x70, 0x61,
0x2b, 0x3b, 0x61, 0x5c, 0xda, 0x85, 0x30, 0x0f, 0x2e, 0x2a, 0xd7, 0xbd, 0xa1, 0xdc, 0xf0, 0xd3,
0x2c, 0xfd, 0x7d, 0x3f, 0xdd, 0x05, 0x28, 0xe6, 0xb6, 0x2f, 0xce, 0xe2, 0x3b, 0xee, 0xcc, 0xcf,
0xe0, 0x69, 0x02, 0xc8, 0x83, 0xe9, 0xce, 0xd2, 0x14, 0xff, 0x5d, 0xda, 0x59, 0xe6, 0xe7, 0x40,
0x28, 0x99, 0x17, 0xdb, 0xeb, 0x9f, 0xa7, 0x50, 0x9f, 0x42, 0x64, 0x0d, 0xaa, 0x17, 0x98, 0xdb,
0x9c, 0xfa, 0xa8, 0xeb, 0x30, 0x23, 0x64, 0x2b, 0x2e, 0x8c, 0xe7, 0xee, 0x33, 0x27, 0xfc, 0x00,
0xcb, 0x93, 0x5d, 0x52, 0xd2, 0xa4, 0x53, 0xd6, 0xa4, 0x5e, 0x50, 0xe3, 0x82, 0x26, 0x5b, 0xec,
0xc4, 0xd4, 0x9e, 0x84, 0xe5, 0xa3, 0x98, 0x0d, 0xcc, 0xe8, 0x34, 0xe9, 0xc4, 0xdc, 0x5d, 0x86,
0x5a, 0xf1, 0x1d, 0x3e, 0xad, 0x99, 0x0f, 0xf1, 0xde, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a,
0x16, 0xb7, 0x18, 0x98, 0x07, 0x00, 0x00,
// 724 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x5f, 0x4f, 0xdb, 0x48,
0x10, 0x8f, 0x1d, 0x3b, 0x24, 0x93, 0x40, 0xb8, 0x85, 0x43, 0xd6, 0x3d, 0xdc, 0x71, 0x16, 0x0f,
0xdc, 0x9d, 0xc4, 0x49, 0x20, 0xb5, 0x55, 0xd5, 0x97, 0x84, 0x22, 0x25, 0x15, 0x50, 0xba, 0xfd,
0xa3, 0xf6, 0x71, 0xe3, 0x0c, 0x61, 0x4b, 0x62, 0x9b, 0xf5, 0x1a, 0xe1, 0x8f, 0xd2, 0x6f, 0xd2,
0xa7, 0x7e, 0x91, 0x7e, 0x99, 0x6a, 0xff, 0x24, 0x71, 0x02, 0x55, 0x55, 0x84, 0xfa, 0x02, 0x3b,
0xbf, 0x99, 0xdd, 0x99, 0xfc, 0x66, 0x7e, 0x63, 0x68, 0x0d, 0x44, 0x72, 0x89, 0x62, 0x2f, 0x15,
0x89, 0x4c, 0x88, 0x2f, 0x8b, 0x14, 0xb3, 0xf0, 0xb3, 0x0b, 0xad, 0xae, 0xc6, 0x3b, 0x91, 0xe4,
0x49, 0x4c, 0xfe, 0x06, 0x8f, 0xc7, 0x5c, 0x06, 0xce, 0xb6, 0xb3, 0xdb, 0xdc, 0x6f, 0xee, 0xe9,
0xb0, 0xbd, 0x7e, 0xcc, 0x65, 0xaf, 0x42, 0xb5, 0x8b, 0x74, 0xa1, 0x2d, 0x70, 0xc4, 0x33, 0x89,
0xe2, 0xe8, 0x06, 0x23, 0x99, 0x88, 0xc0, 0xd5, 0xd1, 0x5b, 0x36, 0x9a, 0x2e, 0x7a, 0x7b, 0x15,
0xba, 0x7c, 0x81, 0xec, 0x80, 0xcf, 0xf2, 0x21, 0x97, 0x41, 0x55, 0xdf, 0x6c, 0xd9, 0x9b, 0x1d,
0x85, 0xf5, 0x2a, 0xd4, 0x38, 0xc9, 0x0b, 0xd8, 0xc0, 0x09, 0x97, 0xfd, 0x58, 0xa2, 0x88, 0x2e,
0x18, 0x8f, 0x8f, 0xae, 0x31, 0x96, 0x81, 0xb7, 0x90, 0x6d, 0xc9, 0xdb, 0xab, 0xd0, 0xbb, 0x2e,
0x91, 0x47, 0xd0, 0xcc, 0xd3, 0x21, 0x93, 0xd8, 0x8f, 0x87, 0x78, 0x13, 0xf8, 0xfa, 0x0d, 0x62,
0xdf, 0x78, 0x3b, 0xf7, 0xf4, 0x2a, 0xb4, 0x1c, 0x48, 0xd6, 0xc0, 0x95, 0x45, 0x50, 0xdb, 0x76,
0x76, 0x7d, 0xea, 0xca, 0xa2, 0xbb, 0x02, 0xfe, 0x35, 0x1b, 0xe7, 0x18, 0x3e, 0x03, 0x4f, 0xd1,
0x42, 0x36, 0xc1, 0x1f, 0xdc, 0x5c, 0xf4, 0x87, 0x9a, 0xb2, 0x06, 0x35, 0x06, 0xf9, 0x13, 0x80,
0xa5, 0xe9, 0xa1, 0xca, 0xdf, 0x1f, 0x6a, 0x7e, 0x1a, 0xb4, 0x84, 0x84, 0x07, 0xd0, 0x5e, 0xa2,
0x89, 0x6c, 0x43, 0x13, 0xcd, 0xf1, 0x94, 0x4d, 0xd0, 0x3e, 0x57, 0x86, 0xc2, 0x0e, 0xf8, 0x9a,
0xa1, 0x1f, 0x87, 0x92, 0x2d, 0xa8, 0x65, 0x92, 0xc9, 0x3c, 0xb3, 0xb9, 0xad, 0x15, 0xfe, 0x0f,
0xad, 0xb3, 0x64, 0x3c, 0xe6, 0xf1, 0xc8, 0xd0, 0xf2, 0x17, 0x78, 0x13, 0x94, 0x6c, 0xa9, 0xdf,
0x27, 0x28, 0x19, 0xd5, 0x8e, 0xf0, 0x8b, 0x03, 0xcd, 0x12, 0x3d, 0x2a, 0x75, 0x86, 0x57, 0x39,
0xc6, 0x11, 0x9e, 0xe6, 0x13, 0x7d, 0xcf, 0xa3, 0x65, 0x88, 0x84, 0xd0, 0x1a, 0x66, 0xf2, 0x35,
0x8a, 0x6b, 0x1e, 0x61, 0xff, 0xb9, 0x2d, 0x60, 0x01, 0x53, 0x31, 0x99, 0x88, 0xe6, 0x31, 0x55,
0x13, 0x53, 0xc6, 0x48, 0x00, 0x2b, 0x02, 0xaf, 0xde, 0x14, 0x29, 0xea, 0x8e, 0x7b, 0x74, 0x6a,
0x92, 0xff, 0xa0, 0x2e, 0x30, 0x4b, 0x93, 0x38, 0x43, 0xdb, 0xc8, 0xf6, 0x6c, 0xf4, 0x0c, 0x4c,
0x67, 0x01, 0xe1, 0x57, 0x07, 0xda, 0xcb, 0xc3, 0xb0, 0x09, 0x3e, 0xd7, 0x63, 0x60, 0xca, 0x37,
0xc6, 0x83, 0x15, 0x4e, 0xc0, 0x93, 0xf3, 0xaa, 0xf5, 0x59, 0x61, 0xe7, 0x79, 0x1c, 0xe9, 0x72,
0x1b, 0x54, 0x9f, 0x15, 0xc6, 0xc4, 0x28, 0xd3, 0xc3, 0xd5, 0xa0, 0xfa, 0xac, 0xfa, 0xa6, 0xfe,
0x47, 0x83, 0x60, 0xc5, 0xf4, 0xcd, 0x58, 0x53, 0x5c, 0x0c, 0x82, 0xfa, 0x1c, 0x17, 0x83, 0xf0,
0x93, 0x0b, 0xeb, 0x14, 0x23, 0xe4, 0xa9, 0x34, 0x3a, 0x3e, 0x4e, 0x46, 0x77, 0x29, 0xd4, 0xb9,
0xb7, 0x42, 0xdd, 0x7b, 0x28, 0xb4, 0xfa, 0x00, 0x0a, 0xf5, 0x7e, 0x4e, 0xa1, 0xfe, 0x6d, 0x85,
0x4a, 0xd8, 0x7c, 0x95, 0xa3, 0x28, 0x7e, 0x69, 0xf7, 0xc3, 0x0e, 0x6c, 0xe8, 0x84, 0x87, 0xb3,
0x84, 0xc7, 0x3c, 0x93, 0xe4, 0x5f, 0xf0, 0xc6, 0x3c, 0x53, 0x8b, 0xb5, 0xfa, 0x7d, 0x6a, 0xa8,
0x8e, 0x09, 0xdb, 0xb0, 0xaa, 0x0b, 0x3f, 0xe5, 0xe3, 0x33, 0x26, 0xd8, 0x24, 0xfc, 0x0d, 0xda,
0x1a, 0x78, 0x99, 0x4b, 0x89, 0x42, 0xa9, 0x33, 0x5c, 0x87, 0x35, 0xfb, 0xe3, 0x62, 0x8b, 0xbc,
0x9f, 0x21, 0x27, 0x98, 0x65, 0x6c, 0x84, 0x64, 0x07, 0x56, 0x79, 0x6c, 0x2b, 0x3b, 0x63, 0x5c,
0xd8, 0x45, 0xb1, 0x08, 0x2e, 0x2b, 0xda, 0xbd, 0xa5, 0xe8, 0xf0, 0xc3, 0x3c, 0xfd, 0x43, 0x3f,
0xdd, 0x05, 0x30, 0x73, 0xdb, 0x8f, 0xcf, 0x93, 0x7b, 0xee, 0xd2, 0x8f, 0xe0, 0x29, 0x02, 0xc8,
0x3f, 0xb3, 0x5d, 0xa6, 0x28, 0xfe, 0xbd, 0xb4, 0xcb, 0xf4, 0x9f, 0xa3, 0x58, 0x8a, 0xc2, 0x6c,
0xb5, 0x3f, 0x1e, 0x43, 0x63, 0x06, 0x91, 0x75, 0xa8, 0x5e, 0x62, 0x61, 0x73, 0xaa, 0xa3, 0xaa,
0x43, 0x8f, 0x90, 0xad, 0xd8, 0x18, 0x4f, 0xdd, 0x27, 0x4e, 0xf8, 0x0e, 0xea, 0xd3, 0x1d, 0x53,
0xda, 0xb1, 0x8e, 0x1e, 0x3e, 0x6b, 0xa9, 0xc5, 0x35, 0x31, 0x34, 0xd9, 0x62, 0xa7, 0xa6, 0xf2,
0xa4, 0xac, 0x18, 0x27, 0x6c, 0xa8, 0x47, 0xa7, 0x45, 0xa7, 0xe6, 0x7e, 0x1d, 0x6a, 0xe6, 0xfb,
0x3c, 0xa8, 0xe9, 0x0f, 0xf4, 0xc1, 0xb7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x11, 0xe4, 0xb4,
0xb0, 0x07, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
......
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