Contract con_uw_master_5


Contract Code


  
1 import currency
2 import con_uwarriors_lst001
3
4 I = importlib
5
6 S = Hash(default_value='')
7 A = Hash(default_value='')
8 balances = Hash(default_value=0)
9 metadata = Hash(default_value=0)
10 nicks = Hash(default_value=0)
11 wp = ForeignHash(foreign_contract='con_uwarriors_lst001', foreign_name='balances')
12
13 @construct
14 def seed():
15 metadata['operator'] = ctx.caller
16 metadata['withdrawal'] = False
17 metadata['starter_pack_price'] = 1500
18 metadata['game_cost'] = 2
19 metadata['time'] = 14
20 metadata['fees'] = decimal('0.15')
21 metadata['fees_withdrawal'] = decimal('0.20')
22
23 @export
24 def set_nick_name(nickname: str):
25 caller = ctx.caller
26 assert len(nickname) <= 25, 'Nickname too long (25 chars max).'
27 assert len(nickname) > 0, 'Nickname too short.'
28 names_uid = hashlib.sha256(nickname.lower().replace(' ', ''))
29 assert not nicks['nicknames', names_uid
30 ], 'A form of this name already belongs to ' + nicks[
31 'nicknames', names_uid]
32 nicks[caller, 'nickname'] = nickname
33 nicks['nicknames', names_uid] = nickname
34
35 @export
36 def operator_transfer_thing(uid: str, new_owner: str):
37 assert ctx.caller == metadata['operator'], 'Only auction operator can transfer things from contract.'
38 transfer(uid=uid, new_owner=new_owner,contract=contract)
39 A[uid] = False
40
41 @export
42 def operator_transfer_currency(amount: str, to: float):
43 assert ctx.caller == metadata['operator'], 'Only auction operator can transfer currency from contract.'
44 con_uwarriors_lst001.transfer(amount=amount, to=to)
45
46 def get_listing_info(uid: str):
47 # Get listing info
48 listing_info = A[uid]
49 assert listing_info is not None, "Listing doesn't exist!"
50 return {
51 'start_date': A[uid, 'start_date'],
52 'end_date': A[uid, 'end_date'],
53 'current_owner': A[uid, 'current_owner'],
54 'uid': A[uid, 'uid'],
55 'reserve_price': A[uid, 'reserve_price'],
56 'current_bid': A[uid, 'current_bid'],
57 'current_winner': A[uid, 'current_winner']
58 }
59
60 @export
61 def auction_thing(contract: str, uid: str, reserve_price: float, start_date: datetime.datetime, end_date: datetime.datetime):
62 #uid: str, to: str, main_account: str, contract: str
63 transfer_from_internal(uid,ctx.this,ctx.caller,contract)
64 assert not A[uid], 'Auction has already started!'
65 assert end_date > now, "end_date is in the past"
66 assert reserve_price >= 0, "reserve_price cannot be less than 0"
67
68 A[uid, 'start_date'] = start_date
69 A[uid, 'end_date'] = end_date
70 A[uid, 'current_owner'] = ctx.caller
71 A[uid, 'uid'] = uid
72 A[uid, 'reserve_price'] = reserve_price
73 A[uid, 'current_bid'] = None
74 A[uid, 'current_winner'] = ""
75
76 # Mark as auction started
77 A[uid] = True
78
79 @export
80 def end_auction(uid: str, end_early: bool):
81 # Get listing info
82 listing_info = get_listing_info(uid=uid)
83
84 if end_early:
85 # Only the owner or the operator can end an auction early
86 assert listing_info['current_owner'] == ctx.caller or metadata['operator'] == ctx.caller, \
87 'Only thing owner or auction operator can end the auction early!'
88
89 if now < listing_info['start_date']:
90 process_auction_result_no_winner(listing_info)
91 else:
92 if (listing_info['current_bid'] or -1) < listing_info['reserve_price']:
93 process_auction_result_no_winner(listing_info)
94 else:
95 assert False, "Cannot end early. Auction started or reserve has been met."
96 else:
97 # Else, anyone can call this to complete the auction, assuming the auction is over
98 assert now > listing_info['end_date'], 'Auction is still pending!'
99 if listing_info['current_bid'] == None or listing_info['current_bid'] < listing_info['reserve_price']:
100 process_auction_result_no_winner(listing_info)
101 else:
102 process_auction_result(listing_info)
103
104 def process_auction_result_no_winner(listing_info, contract):
105 transfer(
106 uid=listing_info['uid'],
107 new_owner=listing_info['current_owner'],
108 contract=contract
109 )
110
111 # Send money back to last bidder (if there was one)
112 if listing_info['current_winner'] != "":
113 con_uwarriors_lst001.transfer(
114 to=listing_info['current_winner'],
115 amount=listing_info['current_bid']
116 )
117
118 A[listing_info['uid']] = False
119
120 def process_auction_result(listing_info, contract):
121 # transfer thing to new owner
122 transfer(
123 uid=listing_info['uid'],
124 new_owner=listing_info['current_winner'],
125 contract=contract
126 )
127
128 net_amount = listing_info['current_bid']
129
130 con_uwarriors_lst001.transfer(
131 to=listing_info['current_owner'],
132 amount=net_amount
133 )
134
135 A[listing_info['uid']] = False
136
137 @export
138 def bid(uid: str, bid_amount: float):
139 listing_info = get_listing_info(uid=uid)
140
141 current_bid = listing_info['current_bid'] or 0
142
143 assert now < listing_info['end_date'], "Auction has ended."
144 assert now > listing_info['start_date'], "Auction has not stared."
145 assert bid_amount > 0 , "Bid must be greater than zero."
146 assert bid_amount > current_bid, "Current bid of {current_bid} is higher!"
147 # Take the currency bid from the bidder
148 con_uwarriors_lst001.transfer_from(
149 main_account=ctx.caller,
150 to=ctx.this,
151 amount=bid_amount,
152 )
153 # Send the previous bidder's bid back to them
154 if listing_info['current_winner'] != "":
155 con_uwarriors_lst001.transfer(
156 to=listing_info['current_winner'],
157 amount=listing_info['current_bid']
158 )
159 # Set the new bid info
160 A[uid, 'current_bid'] = bid_amount
161 A[uid, 'current_winner'] = ctx.caller
162
163 @export
164 def play():
165 sender = ctx.caller
166 amount = metadata['game_cost']
167 operator = metadata['operator']
168 assert wp[sender] > amount , 'Not enough coins to send!'
169 con_uwarriors_lst001.transfer_from(amount, metadata['operator'], sender)
170
171 @export
172 def buy_character():
173 sender = ctx.caller
174 amount = metadata['starter_pack_price']
175 operator = metadata['operator']
176 assert wp[sender] > amount , 'Not enough coins to send!'
177 con_uwarriors_lst001.transfer_from(amount, metadata['operator'], sender)
178
179 @export
180 def change_auction(uid: str, auction: bool, contract: str):
181 assert ctx.caller == metadata['operator'], 'Only operator can set metadata!'
182 thing_info = I.import_module(contract)
183 sender = ctx.caller
184 thing_uid = thing_info.change_auction(uid, auction)
185 return thing_uid
186
187
188 @export
189 def change_thing_meta(uid: str, meta: dict, contract: str):
190 assert ctx.caller == metadata['operator'], 'Only operator can set metadata!'
191 thing_info = I.import_module(contract)
192 thing_uid = thing_info.change_meta(uid, meta)
193 return thing_uid
194
195 @export
196 def rewards(uid: str, amount: float):
197 assert ctx.caller == metadata['operator'], 'Only operator'
198
199 if metadata['withdrawal'] == True:
200 balances[uid, 'rewards'] += amount
201 balances[uid, 'total_rewards'] += amount
202 if balances[uid, 'rewards', 'time'] is None:
203 balances[uid, 'rewards', 'time'] = now
204 else:
205 balances[uid, 'total_rewards'] += amount
206 con_uwarriors_lst001.transfer_from(amount, uid, metadata['operator'])
207
208 @export
209 def withdrawal():
210 sender = ctx.caller
211 assert balances[sender, 'rewards'] > 0, 'Cannot send negative balances!'
212
213 if metadata['withdrawal'] == True:
214 if (now - balances[sender, 'rewards', 'time']).days > metadata['time']:
215 amount = balances[sender, 'rewards']
216 con_uwarriors_lst001.transfer_from(amount, sender, metadata['operator'])
217 balances[sender, 'rewards'] = 0
218 balances[uid, 'rewards', 'time'] = now
219 else:
220 con_uwarriors_lst001.transfer_from(amount - (amount * metadata['fees_withdrawal']), sender, metadata['operator'])
221 balances[sender, 'rewards'] = 0
222 balances[uid, 'rewards', 'time'] = now
223
224 @export
225 def add_meta(uid: str, meta:str, contract: str, value: Any):
226 assert ctx.caller == metadata['operator'], 'Only operator can set metadata!'
227 thing_info = I.import_module(contract)
228 thing_uid = thing_info.add_meta(uid, meta, value)
229 return thing_uid
230
231
232 @export
233 def change_metadata(key: str, value: Any):
234 assert ctx.caller == metadata['operator'], 'Only operator can set metadata!'
235 metadata[key] = value
236
237
238
239 @export
240 def create_thing(contract: str, thing_string: str, name: str, owner: str, meta: dict = {}):
241 assert ctx.caller == metadata['operator'], 'Only operator can set metadata!'
242 thing_info = I.import_module(contract)
243 sender = ctx.caller
244 thing_uid = thing_info.add_thing(thing_string, name, meta, owner)
245 return thing_uid
246
247
248 @export
249 def buy_thing(uid: str, contract:str):
250 thing_info = I.import_module(contract)
251 sender = ctx.caller
252
253 owner = thing_info.get_owner(uid)
254 creator = thing_info.get_creator(uid)
255
256 assert_already_owned(uid, sender, contract)
257
258 price_amount = thing_info.get_price_amount(uid)
259
260 assert price_amount, uid + ' is not for sale'
261 assert price_amount > 0, uid + ' is not for sale'
262
263 price_amount_pay = price_amount - (price_amount * metadata['fees'])
264
265 con_uwarriors_lst001.transfer_from(price_amount_pay, owner, sender)
266 con_uwarriors_lst001.transfer_from((price_amount * metadata['fees']), metadata['operator'], sender)
267
268 transfer_ownership(uid, sender, contract)
269
270
271 @export
272 def sell_thing(uid: str, amount: float, description: str, contract:str):
273 thing_info = I.import_module(contract)
274 auction = thing_info.get_auction(uid)
275 assert auction == False, ' is on auction'
276 assert_ownership(uid, ctx.caller, contract)
277 thing_info.set_price(uid, amount)
278
279
280 @export
281 def transfer(uid: str, new_owner: str, contract:str):
282 sender = ctx.caller
283 assert_ownership(uid, sender, contract)
284 assert_already_owned(uid, new_owner, contract)
285 transfer_ownership(uid, new_owner, contract)
286
287 @export
288 def approve(uid: str, to: str, contract:str):
289 sender = ctx.caller
290 assert_ownership(uid, sender, contract)
291 balances[sender, uid, to] = True
292
293 @export
294 def revoke(uid: str, to: str):
295 balances[ctx.caller, uid, to] = None
296
297
298 def transfer_from_internal(uid: str, to: str, main_account: str, contract: str):
299 sender = main_account
300 assert balances[main_account, uid, sender], "You have not been given approval to transfer this user's item."
301 assert_ownership(uid, main_account, contract)
302
303 # transfer
304 assert_already_owned(uid, to, contract)
305 transfer_ownership(uid, to, contract)
306
307 # revoke the approval
308 balances[main_account, uid, sender] = None
309
310
311 @export
312 def transfer_from(uid: str, to: str, main_account: str, contract: str):
313 sender = ctx.caller
314
315 assert balances[main_account, uid, sender], "You have not been given approval to transfer this user's item."
316 assert_ownership(uid, main_account, contract)
317
318 # transfer
319 assert_already_owned(uid, to, contract)
320 transfer_ownership(uid, to, contract)
321
322 # revoke the approval
323 balances[main_account, uid, sender] = None
324
325
326 def assert_already_owned(uid: str, sender: str, contract: str):
327 thing_info = I.import_module(contract)
328 owner = thing_info.get_owner(uid)
329 assert owner != sender, uid + ' already owned by ' + sender
330
331 def assert_ownership(uid: str, sender, contract: str):
332 thing_info = I.import_module(contract)
333 owner = thing_info.get_owner(uid)
334 assert owner == sender, uid + ' not owned by ' + sender
335
336
337 def transfer_ownership(uid:str, new_owner: str, contract: str):
338 thing_info = I.import_module(contract)
339 old_owner = thing_info.get_owner(uid)
340
341 thing_info.set_owner(uid, new_owner)
342 if thing_info.get_price_amount(uid) > 0:
343 thing_info.set_price(uid, 0)
344
345

Byte Code

e3000000000000000000000000080000004000000073e2020000640064016c005a00640064016c015a0165025a03650464026403640464058d035a05650464026403640664058d035a06650464006403640764058d035a07650464006403640864058d035a08650464006403640964058d035a09650a640a64076403640b640c8d045a0b640d640e84005a0c650d64038301650e640f9c0164106411840483015a0f650d64038301650e650e64129c0264136414840483015a10650d64038301650e651164159c0264166417840483015a12650e64189c016419641a84045a13650d64038301650e650e651165146a1465146a14641b9c05641c641d840483015a15650d64038301650e6516641e9c02641f6420840483015a176421642284005a186423642484005a19650d64038301650e651164259c0264266427840483015a1a650d6403830164286429840083015a1b650d64038301642a642b840083015a1c650d64038301650e6516650e642c9c03642d642e840483015a1d650d64038301650e651e650e642f9c0364306431840483015a1f650d64038301650e651164329c0264336434840483015a20650d6403830164356436840083015a21650d64038301650e650e650e652264379c0464386439840483015a23650d64038301650e6522643a9c02643b643c840483015a24650d6403830169006601650e650e650e650e651e643d9c05643e643f840583015a25650d64038301650e650e64409c0264416442840483015a26650d64038301650e6511650e650e64439c0464446445840483015a27650d64038301650e650e650e64469c0364476448840483015a28650d64038301650e650e650e64499c03644a644b840483015a29650d64038301650e650e644c9c02644d644e840483015a2a650e650e650e650e644f9c046450645184045a2b650d64038301650e650e650e650e644f9c0464526453840483015a2c650e650e650e64549c036455645684045a2d650e650e64409c026457645884045a2e650e650e650e64469c036459645a84045a2f64015300295be9000000004eda00da0f636f6e5f75775f6d61737465725f35da01532903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da0141da0862616c616e636573da086d65746164617461da056e69636b73da14636f6e5f7577617272696f72735f6c7374303031da0277702904da10666f726569676e5f636f6e7472616374da0c666f726569676e5f6e616d6572060000007207000000630000000000000000000000000300000043000000734600000074006a01740264013c006402740264033c006404740264053c006406740264073c006408740264093c007403640a83017402640b3c007403640c83017402640d3c0064005300290e4eda086f70657261746f7246da0a7769746864726177616c69dc050000da12737461727465725f7061636b5f7072696365e902000000da0967616d655f636f7374e90e000000da0474696d657a04302e3135da04666565737a04302e3230da0f666565735f7769746864726177616c2904da03637478da0663616c6c6572da0a5f5f6d65746164617461da07646563696d616ca900721d000000721d0000007202000000da045f5f5f5f0d000000730e00000000010a0108010801080108010c01721e0000002901da086e69636b6e616d65630100000000000000030000000500000043000000738200000074006a017d0174027c00830164016b01731a740364028301820174027c00830164036b04732e740364048301820174046a057c006a0683006a0764056406830283017d02740864077c02660219000c00736674036408740864077c02660219001700830182017c0074087c01640966023c007c00740864077c0266023c0064005300290a4ee9190000007a214e69636b6e616d6520746f6f206c6f6e6720283235206368617273206d6178292e72010000007a134e69636b6e616d6520746f6f2073686f72742efa01207202000000da096e69636b6e616d65737a274120666f726d206f662074686973206e616d6520616c72656164792062656c6f6e677320746f20721f00000029097219000000721a000000da036c656eda0e417373657274696f6e4572726f72da07686173686c6962da06736861323536da056c6f776572da077265706c616365da075f5f6e69636b732903721f000000721a000000da096e616d65735f756964721d000000721d0000007202000000da0d7365745f6e69636b5f6e616d6517000000731200000000020601140114011601100106010c010c01722b0000002902da03756964da096e65775f6f776e6572630200000000000000020000000500000043000000733000000074006a017402640119006b027316740364028301820174047c007c01740564038d030100640474067c003c006400530029054e72100000007a384f6e6c792061756374696f6e206f70657261746f722063616e207472616e73666572207468696e67732066726f6d20636f6e74726163742e2903722c000000722d00000072060000004629077219000000721a000000721b0000007224000000da087472616e736665727206000000da035f5f412902722c000000722d000000721d000000721d0000007202000000da176f70657261746f725f7472616e736665725f7468696e672400000073080000000002100106010e0172300000002902da06616d6f756e74da02746f630200000000000000020000000400000043000000732800000074006a017402640119006b027316740364028301820174046a057c007c0164038d0201006400530029044e72100000007a3a4f6e6c792061756374696f6e206f70657261746f722063616e207472616e736665722063757272656e63792066726f6d20636f6e74726163742e29027231000000723200000029067219000000721a000000721b0000007224000000720c000000722e000000290272310000007232000000721d000000721d0000007202000000da1a6f70657261746f725f7472616e736665725f63757272656e63792c000000730600000000021001060172330000002901722c000000630100000000000000020000000900000043000000736400000074007c0019007d017c0164006b097318740164018301820174007c0064026602190074007c0064036602190074007c0064046602190074007c0064056602190074007c0064066602190074007c0064076602190074007c0064086602190064099c075300290a4e7a164c697374696e6720646f65736e277420657869737421da0a73746172745f64617465da08656e645f64617465da0d63757272656e745f6f776e6572722c000000da0d726573657276655f7072696365da0b63757272656e745f626964da0e63757272656e745f77696e6e65722907723400000072350000007236000000722c0000007237000000723800000072390000002902722f00000072240000002902722c000000da0c6c697374696e675f696e666f721d000000721d0000007202000000da125f5f6765745f6c697374696e675f696e666f33000000730e0000000001080110010e01120112010e01723b00000029057206000000722c00000072370000007234000000723500000063050000000000000005000000050000004300000073a600000074007c0174016a0274016a037c008304010074047c0119000c00732474056401830182017c0474066b04733474056402830182017c0264036b05734474056404830182017c0374047c01640566023c007c0474047c01640666023c0074016a0374047c01640766023c007c0174047c01640866023c007c0274047c01640966023c00640074047c01640a66023c00640b74047c01640c66023c00640d74047c013c0064005300290e4e7a1c41756374696f6e2068617320616c72656164792073746172746564217a17656e645f6461746520697320696e20746865207061737472010000007a23726573657276655f70726963652063616e6e6f74206265206c657373207468616e2030723400000072350000007236000000722c0000007237000000723800000072020000007239000000542907da185f5f7472616e736665725f66726f6d5f696e7465726e616c7219000000da0474686973721a000000722f0000007224000000da036e6f7729057206000000722c000000723700000072340000007235000000721d000000721d0000007202000000da0d61756374696f6e5f7468696e673d0000007318000000000312011201100110010c010c010e010c010c010c010c01723f0000002902722c000000da09656e645f6561726c7963020000000000000003000000030000004300000073ba00000074007c0064018d017d027c0172747c026402190074016a026b02733274036403190074016a026b027332740464048301820174057c02640519006b00724874067c028301010071b67c02640619007052640d7c02640819006b00726674067c028301010071b6640973b67404640a830182016e4274057c02640b19006b0473887404640c830182017c026406190064006b0273a47c02640619007c02640819006b0072ae74067c02830101006e0874077c028301010064005300290e4e2901722c000000723600000072100000007a3f4f6e6c79207468696e67206f776e6572206f722061756374696f6e206f70657261746f722063616e20656e64207468652061756374696f6e206561726c792172340000007238000000e9010000007237000000467a3a43616e6e6f7420656e64206561726c792e2041756374696f6e2073746172746564206f72207265736572766520686173206265656e206d65742e72350000007a1941756374696f6e206973207374696c6c2070656e64696e6721e9ffffffff2908723b0000007219000000721a000000721b0000007224000000723e000000da225f5f70726f636573735f61756374696f6e5f726573756c745f6e6f5f77696e6e6572da185f5f70726f636573735f61756374696f6e5f726573756c742903722c0000007240000000723a000000721d000000721d0000007202000000da0b656e645f61756374696f6e4e000000731e00000000020a0104011001040110010c010a0114020a020e02140112010a010a027245000000630200000000000000020000000500000043000000734800000074007c00640119007c00640219007c0164038d0301007c006404190064056b03723874016a007c00640419007c006406190064078d020100640874027c00640119003c006400530029094e722c00000072360000002903722c000000722d0000007206000000723900000072020000007238000000290272320000007231000000462903722e000000720c000000722f0000002902723a0000007206000000721d000000721d0000007202000000724300000065000000730c00000000010a010c010c010a010c017243000000630200000000000000030000000500000043000000734000000074007c00640119007c00640219007c0164038d0301007c00640419007d0274016a007c00640519007c0264068d020100640774027c00640119003c006400530029084e722c00000072390000002903722c000000722d000000720600000072380000007236000000290272320000007231000000462903722e000000720c000000722f0000002903723a0000007206000000da0a6e65745f616d6f756e74721d000000721d000000720200000072440000006e000000730c00000000010a010c0108010a01080172440000002902722c000000da0a6269645f616d6f756e7463020000000000000004000000050000004300000073b200000074007c0064018d017d027c0264021900701464037d0374017c02640419006b00732a740264058301820174017c02640619006b04733e74026407830182017c0164036b04734e74026408830182017c017c036b04735e740264098301820174036a0474056a0674056a077c01640a8d0301007c02640b1900640c6b03729474036a087c02640b19007c0264021900640d8d0201007c0174097c00640266023c0074056a0674097c00640b66023c0064005300290e4e2901722c0000007238000000720100000072350000007a1241756374696f6e2068617320656e6465642e72340000007a1741756374696f6e20686173206e6f74207374617265642e7a1e426964206d7573742062652067726561746572207468616e207a65726f2e7a2743757272656e7420626964206f66207b63757272656e745f6269647d20697320686967686572212903da0c6d61696e5f6163636f756e747232000000723100000072390000007202000000290272320000007231000000290a723b000000723e0000007224000000720c000000da0d7472616e736665725f66726f6d7219000000721a000000723d000000722e000000722f0000002904722c0000007247000000723a0000007238000000721d000000721d0000007202000000da0362696477000000731a00000000020a010c0114011401100110010c0108010c010a010c010c01724a000000630000000000000000030000000400000043000000734000000074006a017d007402640119007d017402640219007d0274037c0019007c016b04732a740464038301820174056a067c017402640219007c00830301006400530029044e721400000072100000007a194e6f7420656e6f75676820636f696e7320746f2073656e642129077219000000721a000000721b000000da045f5f77707224000000720c00000072490000002903da0673656e64657272310000007210000000721d000000721d0000007202000000da04706c617988000000730a00000000020601080108011401724d000000630000000000000000030000000400000043000000734000000074006a017d007402640119007d017402640219007d0274037c0019007c016b04732a740464038301820174056a067c017402640219007c00830301006400530029044e721200000072100000007a194e6f7420656e6f75676820636f696e7320746f2073656e642129077219000000721a000000721b000000724b0000007224000000720c00000072490000002903724c00000072310000007210000000721d000000721d0000007202000000da0d6275795f63686172616374657291000000730a00000000020601080108011401724e0000002903722c000000da0761756374696f6e7206000000630300000000000000060000000300000043000000733600000074006a017402640119006b027316740364028301820174046a057c0283017d0374006a017d047c036a067c007c0183027d057c05530029034e72100000007a1f4f6e6c79206f70657261746f722063616e20736574206d657461646174612129077219000000721a000000721b0000007224000000da0149da0d696d706f72745f6d6f64756c65da0e6368616e67655f61756374696f6e2906722c000000724f0000007206000000da0a7468696e675f696e666f724c000000da097468696e675f756964721d000000721d000000720200000072520000009a000000730c0000000002100106010a0106010c0172520000002903722c000000da046d6574617206000000630300000000000000050000000300000043000000733000000074006a017402640119006b027316740364028301820174046a057c0283017d037c036a067c007c0183027d047c04530029034e72100000007a1f4f6e6c79206f70657261746f722063616e20736574206d657461646174612129077219000000721a000000721b000000722400000072500000007251000000da0b6368616e67655f6d6574612905722c0000007255000000720600000072530000007254000000721d000000721d0000007202000000da116368616e67655f7468696e675f6d657461a4000000730a0000000002100106010a010c0172570000002902722c0000007231000000630200000000000000020000000500000043000000739600000074006a017402640119006b027316740364028301820174026403190064046b02726c74047c0064056602050019007c01370003003c0074047c0064066602050019007c01370003003c0074047c00640564076603190064006b087292740574047c006405640766033c006e2674047c0064066602050019007c01370003003c0074066a077c017c00740264011900830301006400530029084e72100000007a0d4f6e6c79206f70657261746f72721100000054da0772657761726473da0d746f74616c5f72657761726473721600000029087219000000721a000000721b0000007224000000da0a5f5f62616c616e636573723e000000720c00000072490000002902722c0000007231000000721d000000721d00000072020000007258000000ad0000007310000000000216010c0114011401120110021401725800000063000000000000000002000000050000004300000073bc00000074006a017d0074027c0064016602190064026b04731e740364038301820174046404190064056b0272b8740574027c00640164066603190018006a067404640619006b04728074027c006401660219007d0174076a087c017c0074046407190083030100640274027c00640166023c007405740274096401640666033c006e3874076a087c017c01740464081900140018007c0074046407190083030100640274027c00640166023c007405740274096401640666033c006400530029094e725800000072010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e63657321721100000054721600000072100000007218000000290a7219000000721a000000725a0000007224000000721b000000723e000000da0464617973720c0000007249000000722c0000002902724c0000007231000000721d000000721d00000072020000007211000000ba000000731c0000000002060118010c01140108010c010a0108010c0110020a0114010c0172110000002904722c00000072550000007206000000da0576616c7565630400000000000000060000000400000043000000733200000074006a017402640119006b027316740364028301820174046a057c0283017d047c046a067c007c017c0383037d057c05530029034e72100000007a1f4f6e6c79206f70657261746f722063616e20736574206d657461646174612129077219000000721a000000721b000000722400000072500000007251000000da086164645f6d6574612906722c00000072550000007206000000725c00000072530000007254000000721d000000721d0000007202000000725d000000cd000000730a0000000002100106010a010e01725d0000002902da036b6579725c000000630200000000000000020000000300000043000000732200000074006a017402640119006b02731674036402830182017c0174027c003c006400530029034e72100000007a1f4f6e6c79206f70657261746f722063616e20736574206d657461646174612129047219000000721a000000721b00000072240000002902725e000000725c000000721d000000721d0000007202000000da0f6368616e67655f6d65746164617461d60000007306000000000210010601725f00000029057206000000da0c7468696e675f737472696e677207000000da056f776e65727255000000630500000000000000080000000500000043000000733a00000074006a017402640119006b027316740364028301820174046a057c0083017d0574006a017d067c056a067c017c027c047c0383047d077c07530029034e72100000007a1f4f6e6c79206f70657261746f722063616e20736574206d657461646174612129077219000000721a000000721b000000722400000072500000007251000000da096164645f7468696e672908720600000072600000007207000000726100000072550000007253000000724c0000007254000000721d000000721d0000007202000000da0c6372656174655f7468696e67dd000000730c0000000003100106010a010601100172630000002902722c000000720600000063020000000000000008000000040000004300000073a600000074006a017c0183017d0274026a037d037c026a047c0083017d047c026a057c0083017d0574067c007c037c01830301007c026a077c0083017d067c06734a74087c0064011700830182017c0664026b04735e74087c0064011700830182017c067c06740964031900140018007d07740a6a0b7c077c047c0383030100740a6a0b7c0674096403190014007409640419007c0383030100740c7c007c037c01830301006400530029054e7a10206973206e6f7420666f722073616c65720100000072170000007210000000290d725000000072510000007219000000721a000000da096765745f6f776e6572da0b6765745f63726561746f72da165f5f6173736572745f616c72656164795f6f776e6564da106765745f70726963655f616d6f756e747224000000721b000000720c0000007249000000da145f5f7472616e736665725f6f776e6572736869702908722c00000072060000007253000000724c0000007261000000da0763726561746f72da0c70726963655f616d6f756e74da1070726963655f616d6f756e745f706179721d000000721d0000007202000000da096275795f7468696e67e8000000731a00000000020a0106010a010a010c010a011001140110010e010e010c01726c0000002904722c0000007231000000da0b6465736372697074696f6e7206000000630400000000000000060000000400000043000000734200000074006a017c0383017d047c046a027c0083017d057c0564016b027324740364028301820174047c0074056a067c03830301007c046a077c007c01830201006400530029034e467a0e206973206f6e2061756374696f6e290872500000007251000000da0b6765745f61756374696f6e7224000000da125f5f6173736572745f6f776e6572736869707219000000721a000000da097365745f70726963652906722c0000007231000000726d00000072060000007253000000724f000000721d000000721d0000007202000000da0a73656c6c5f7468696e67f9000000730a00000000020a010a0110010e0172710000002903722c000000722d0000007206000000630300000000000000040000000400000043000000732e00000074006a017d0374027c007c037c028303010074037c007c017c028303010074047c007c017c02830301006400530029014e29057219000000721a000000726f000000726600000072680000002904722c000000722d0000007206000000724c000000721d000000721d0000007202000000722e000000020100007308000000000206010c010c01722e0000002903722c00000072320000007206000000630300000000000000040000000500000043000000732400000074006a017d0374027c007c037c0283030100640174037c037c007c0166033c006400530029024e5429047219000000721a000000726f000000725a0000002904722c00000072320000007206000000724c000000721d000000721d0000007202000000da07617070726f76650a0100007306000000000206010c0172720000002902722c000000723200000063020000000000000002000000050000004300000073140000006400740074016a027c007c0166033c006400530029014e2903725a0000007219000000721a0000002902722c0000007232000000721d000000721d0000007202000000da067265766f6b65110100007302000000000272730000002904722c00000072320000007248000000720600000063040000000000000005000000050000004300000073500000007c027d0474007c027c007c0466031900731a740164018301820174027c007c027c038303010074037c007c017c038303010074047c007c017c0383030100640074007c027c007c0466033c006400530029024e7a3e596f752068617665206e6f74206265656e20676976656e20617070726f76616c20746f207472616e73666572207468697320757365722773206974656d2e2905725a0000007224000000726f000000726600000072680000002905722c000000723200000072480000007206000000724c000000721d000000721d0000007202000000723c00000016010000730e00000000020401100106010c010c010c01723c000000630400000000000000050000000500000043000000735200000074006a017d0474027c027c007c0466031900731c740364018301820174047c007c027c038303010074057c007c017c038303010074067c007c017c0383030100640074027c027c007c0466033c006400530029024e7a3e596f752068617665206e6f74206265656e20676976656e20617070726f76616c20746f207472616e73666572207468697320757365722773206974656d2e29077219000000721a000000725a0000007224000000726f000000726600000072680000002905722c000000723200000072480000007206000000724c000000721d000000721d0000007202000000724900000021010000730e00000000020601100106010c010c010c0172490000002903722c000000724c0000007206000000630300000000000000050000000300000043000000733000000074006a017c0283017d037c036a027c0083017d047c047c016b03732c74037c00640117007c011700830182016400530029024e7a1220616c7265616479206f776e656420627920290472500000007251000000726400000072240000002905722c000000724c000000720600000072530000007261000000721d000000721d000000720200000072660000002c010000730600000000010a010a017266000000630300000000000000050000000300000043000000733000000074006a017c0283017d037c036a027c0083017d047c047c016b02732c74037c00640117007c011700830182016400530029024e7a0e206e6f74206f776e656420627920290472500000007251000000726400000072240000002905722c000000724c000000720600000072530000007261000000721d000000721d0000007202000000726f00000032010000730600000000010a010a01726f000000630300000000000000050000000300000043000000733e00000074006a017c0283017d037c036a027c0083017d047c036a037c007c01830201007c036a047c00830164016b04723a7c036a057c006401830201006400530029024e72010000002906725000000072510000007264000000da097365745f6f776e6572726700000072700000002905722c000000722d00000072060000007253000000da096f6c645f6f776e6572721d000000721d0000007202000000726800000038010000730a00000000010a010a010c010e0172680000002930da0863757272656e6379720c000000da09696d706f72746c69627250000000da0448617368da035f5f53722f000000725a000000721b0000007229000000da0b466f726569676e48617368724b000000721e000000da085f5f6578706f7274da03737472722b0000007230000000da05666c6f61747233000000723b000000da086461746574696d65723f000000da04626f6f6c724500000072430000007244000000724a000000724d000000724e0000007252000000da0464696374725700000072580000007211000000da03416e79725d000000725f0000007263000000726c0000007271000000722e00000072720000007273000000723c00000072490000007266000000726f0000007268000000721d000000721d000000721d0000007202000000da083c6d6f64756c653e0100000073740000000801080104010e010e010e010e010e0104010c03080a0601100c06011207060112060e0a06010601160f0601121608090809060112101009100906011409060114080601120c1013060116080601120606021c09060112100601160806011407060114060601120406010e0a0601160a12061006