Contract con_testfarm11


Contract Code


  
1 import currency # For buy function
2
3 #NFTs are always part of a collection.
4
5 collection_name = Variable() # The name of the collection for display
6 collection_owner = Variable() # Only the owner can mint new NFTs for this collection
7 collection_nfts = Hash(default_value=0) # All NFTs of the collection
8 collection_balances = Hash(default_value=0) # All user balances of the NFTs
9 collection_balances_approvals = Hash(default_value=0) # Approval amounts of certain NFTs
10 plants = Hash(default_value=0) #store various data related to plants and growing seasons
11 metadata = Hash()
12 nicknames = Hash()
13
14 random.seed()
15
16 @construct
17 def seed():
18 collection_name.set("Test_plants") # Sets the name
19 collection_owner.set(ctx.caller) # Sets the owner
20 metadata['operator'] = ctx.caller
21
22 metadata['growing_season_length'] = 5
23 metadata['plant price'] = 2
24 metadata['event_handler'] = 'con_bbf_events_01'
25 metadata['ipfs_contract'] = 'con_testipfs1'
26
27 plants['growing_season'] = False
28 plants['growing_season_start_time'] = now
29 plants['count'] = 0
30 plants['active_generation'] = -1
31
32 nicknames = {}
33
34
35 @export
36 def change_metadata(key: str, new_value: str):
37 assert ctx.caller == metadata['operator'], "only operator can set metadata"
38 metadata[key] = new_value
39
40 # function to mint a new NFT
41 def mint_nft(name: str, description: str, ipfs_image_url: str, nft_metadata: dict, amount: int):
42 assert name != "", "Name cannot be empty"
43 assert collection_nfts[name] == 0, "Name already exists"
44 assert amount > 0, "You cannot transfer negative amounts"
45
46 collection_nfts[name] = {"description": description, "ipfs_image_url": ipfs_image_url, "nft_metadata": f"See collection_nfts[{name},'nft_metadata']", "amount": amount} # Adds NFT to collection with all details
47 collection_nfts[name,"nft_metadata"] = nft_metadata
48 collection_balances[ctx.caller, name] = amount # Mints the NFT
49
50 # standard transfer function
51 @export
52 def transfer(name: str, amount:int, to: str):
53 assert amount > 0, "You cannot transfer negative amounts"
54 assert name != "", "Please specify the name of the NFT you want to transfer"
55 assert collection_balances[ctx.caller, name] >= amount, "You don't have enough NFTs to send"
56
57 collection_balances[ctx.caller, name] -= amount # Removes amount from sender
58 collection_balances[to, name] += amount # Adds amount to receiver
59
60 # allows other account to spend on your behalf
61 @export
62 def approve(amount: int, name: str, to: str):
63 assert amount > 0, "Cannot approve negative amounts"
64
65 collection_balances_approvals[ctx.caller, to, name] += amount # Approves certain amount for spending by another account
66
67 # transfers on your behalf
68 @export
69 def transfer_from(name:str, amount:int, to: str, main_account: str):
70 assert amount > 0, 'Cannot send negative balances!'
71
72 assert collection_balances_approvals[main_account, to, name] >= amount, "Not enough NFTs approved to send! You have {} and are trying to spend {}"\
73 .format(collection_balances_approvals[main_account, to, name], amount)
74 assert collection_balances[main_account, name] >= amount, "Not enough NFTs to send!"
75
76 collection_balances_approvals[main_account, to, name] -= amount # Removes Approval Amount
77 collection_balances[main_account, name] -= amount # Removes amount from sender
78
79 collection_balances[to, name] += amount # Adds amount to receiver
80
81 @export
82 def start_growing_season():
83 assert collection_owner.get() == ctx.caller, "Only the owner can start a growing season."
84 grow_season = plants['growing_season']
85 assert grow_season == False, "It is already growing season."
86 growing_season_length = metadata['growing_season_length']
87 active_gen = plants['active_generation']
88 active_gen += 1
89 plants['growing_season'] = True
90 plants['growing_season_start_time'] = now
91 plants['growing_season_end_time'] = now + datetime.timedelta(minutes = growing_season_length)
92 plants['finalize_time'] = now + datetime.timedelta(minutes = growing_season_length + 3)
93 plants['active_generation'] = active_gen
94 plants[active_gen, 'total_berries'] = 0
95 plants[active_gen, 'sellable_berries'] = 0
96 plants[active_gen, 'total_tau'] = 0
97 plants[active_gen, 'claimable_tau'] = 0
98 plants[active_gen,'stale_claim_time'] = now + datetime.timedelta(minutes = growing_season_length + 30)
99
100
101 @export
102 def buy_plant(nick : str):
103 assert plants['growing_season'] == True, 'The growing season has not started, so you cannot buy a plant.'
104 #assert plants['growing_season_end_time'] >= now + datetime.timedelta(days = 25), "It's too far into the growing season and you cannot buy a plant now."
105 assert not nick.isdigit(), "The plant nickname can't be an integer."
106 assert bool(collection_nfts[nick]) == False, "This nickname already exists."
107 assert nick.isalnum() == True, "Only alphanumeric characters allowed."
108 assert nick != "", "Name cannot be empty"
109 assert len(nick) >= 3, "The minimum length is 3 characters."
110 plant_generation = plants['active_generation']
111
112 plant_data = {
113 "current_water": (random.randint(50, 80)),
114 "current_bugs" : (random.randint(5, 25)),
115 "current_photosynthesis" : 0,
116 "current_nutrients" : (random.randint(50, 80)),
117 "current_weeds" : (random.randint(5, 25)),
118 "current_toxicity" : 0,
119 "current_weather" : 1,
120 "last_interaction" : now,
121 "last_daily" : now,
122 "last_calc" : now,
123 "alive" : True,
124 "last_squash_weed" : (now + datetime.timedelta(days = -1)),
125 "last_grow_light" : (now + datetime.timedelta(days = -1)),
126 "burn_amount" : 0
127 }
128
129 plant_calc_data = {
130 "previous_water": plant_data["current_water"],
131 "previous_bugs" : plant_data["current_bugs"],
132 "previous_nutrients" : plant_data["current_nutrients"],
133 "previous_weeds" : plant_data["current_weeds"],
134 "total_water": 0,
135 "total_bugs" : 0,
136 "total_nutrients" : 0,
137 "total_weeds": 0
138 }
139
140 p_count = plants['count'] + 1
141 name = f"Gen_{plant_generation}_{p_count}"
142 collection_nfts[nick] = [plant_generation , p_count]
143 payment(plant_generation, metadata['plant price'])
144
145 ipfs_c = importlib.import_module(metadata['ipfs_contract'])
146 ipfs_image_url = ipfs_c.pick_random()
147 mint_nft(name,'This is a blueberry plant. Keep it alive and healthy by tending to it during growing season.' , ipfs_image_url , plant_data,1)
148 collection_nfts[name,'plant_calc_data'] = plant_calc_data
149 plants['count'] = p_count
150 return [plant_data,ipfs_image_url]
151
152 def action_setup(plant_generation : int, plant_number : int):
153 active_generation = plants['active_generation']
154 assert plant_generation == active_generation, f'The plant you are trying to interact with is not part of the current generation. The current generation is {active_generation}.'
155 name = f'Gen_{plant_generation}_{plant_number}'
156 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
157 assert now <= plants['growing_season_end_time'], 'The growing season is not active, so you cannot interact with your plant.'
158 if ctx.caller.startswith('con_'): return
159 plant_data = collection_nfts[name,"nft_metadata"]
160 assert plant_data["alive"] == True, 'Your plant is dead due to neglect and you must buy a new plant to try again. Try not to kill it too.'
161
162 #interaction idle check. If idle too long, plant gets penalized.
163 if now > plant_data['last_interaction'] + datetime.timedelta(hours = 12):
164 plant_data["current_water"] -= (random.randint(5, 15))
165 plant_data["current_bugs"] += (random.randint(5, 15))
166 plant_data["current_nutrients"] -= (random.randint(5, 15))
167 plant_data["current_weeds"] += (random.randint(5, 15))
168
169 plant_data = daily_conditions(plant_data)
170 plant_data = totalizer_calc(plant_data,name)
171
172 #if (random.randint(1, 10)) == 10 : #10% chance of an event happening #RANDOM EVENTS NOT WORKING. COMMENTING OUT UNTIL FIXED
173 # event_contract = importlib.import_module(metadata['event_handler'])
174 # plant_data = event_contract.event(plant_data)
175
176 plant_data = dead_check(plant_data)
177 plant_data['last_interaction'] = now #resets the interaction time
178
179 plant_all = {
180 'plant_data' : plant_data,
181 'name' : name
182 }
183
184 return plant_all
185
186 def daily_conditions(plant_data):
187 while now - plant_data["last_daily"] > datetime.timedelta(days = 1): #Loops through to calculate changes to plant if it's been more than a day since the last day's changes. Does multiple days worth too if needed
188 current_weather = random.randint(1, 3) # 1=sunny 2=cloudy 3=rainy
189 if current_weather == 1:
190 plant_data["current_water"] -= (random.randint(10, 20)) #how much water is lost each sunny day
191 plant_data["current_photosynthesis"] += (random.randint(4, 6)) #How much photosynthesis increases each sunny day
192 if current_weather == 2:
193 plant_data["current_water"] -= (random.randint(5, 15)) #how much water is lost each cloudy day
194 plant_data["current_photosynthesis"] += (random.randint(2, 4)) #How much photosynthesis increases each cloudy day
195 if current_weather == 3:
196 plant_data["current_water"] += (random.randint(5, 25)) #how much water is gained each rainy day
197 plant_data["current_photosynthesis"] += (random.randint(1, 2)) #How much photosynthesis increases each rainy day
198
199 plant_data["current_bugs"] += (random.randint(5, 20)) #how many bugs are added each day
200 plant_data["current_nutrients"] -= (random.randint(5, 10)) #how many nutrients are consumed each day
201 plant_data["current_weeds"] += (random.randint(5, 20)) #how many weeds grow each day
202 plant_data["last_daily"] += datetime.timedelta(days = 1)
203 plant_data["current_weather"] = current_weather
204 plant_data['current_toxicity'] -= (random.randint(0, 2))
205
206 if plant_data['current_toxicity'] < 0:
207 plant_data['current_toxicity'] = 0
208
209 if plant_data['current_water'] > 100 : #water can't be above 100%
210 plant_data['current_water'] = 100
211
212 if plant_data['current_water'] < 0 : #water can't be below 0
213 plant_data['current_water'] = 0
214
215 if plant_data["current_photosynthesis"] > 100 :
216 plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
217 plant_data["current_photosynthesis"] = 100
218
219 return plant_data
220
221 def totalizer_calc(plant_data,name):
222 if now > plant_data['last_calc'] + datetime.timedelta(hours = 3):
223 delta = now - plant_data['last_calc']
224 delta_d = (delta.seconds / 86400)
225 plant_calc_data = collection_nfts[name,'plant_calc_data']
226 #This sections performs an integral on the various properties for use in determining total berries produced.
227 plant_calc_data["total_water"] += (delta_d**2*((plant_data["current_water"]/100-plant_calc_data["previous_water"]/100)/(delta_d))/2)+plant_calc_data["previous_water"]/100*delta_d
228 plant_calc_data["total_bugs"] += (delta_d**2*(((1-plant_data["current_bugs"]/100)-(1-plant_calc_data["previous_bugs"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_bugs"]/100)*delta_d
229 plant_calc_data["total_nutrients"] += (delta_d**2*((plant_data["current_nutrients"]/100-plant_calc_data["previous_nutrients"]/100)/(delta_d))/2)+plant_calc_data["previous_nutrients"]/100*delta_d
230 plant_calc_data["total_weeds"] += (delta_d**2*(((1-plant_data["current_weeds"]/100)-(1-plant_calc_data["previous_weeds"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_weeds"]/100)*delta_d
231 plant_data['last_calc'] = now
232 #Updates previous values for next calculation period.
233 plant_calc_data["previous_water"] = plant_data["current_water"]
234 plant_calc_data["previous_bugs"] = plant_data["current_bugs"]
235 plant_calc_data["previous_nutrients"] = plant_data["current_nutrients"]
236 plant_calc_data["previous_weeds"] = plant_data["current_weeds"]
237
238 collection_nfts[name,'plant_calc_data'] = plant_calc_data
239
240 return plant_data
241
242 def dead_check(plant_data):
243 if plant_data["current_toxicity"] >= 100 or plant_data["current_bugs"] >= 100 or plant_data["current_weeds"] >= 100:
244 plant_data["alive"] = False
245 if plant_data["current_water"] <= 0 or plant_data["current_nutrients"] <= 0:
246 plant_data["alive"] = False
247 return plant_data
248
249 @export
250 def water(plant_generation : int, plant_number : int, num_times : int = 1):
251 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
252 plant_data = plant_all['plant_data']
253 name = plant_all['name']
254
255 for x in range(0, num_times):
256 plant_data['current_water'] += (random.randint(5, 15))
257 if plant_data['current_water'] > 100 : #water can't be above 1
258 plant_data['current_water'] = 100
259
260 collection_nfts[name,"nft_metadata"] = plant_data
261 return plant_data
262
263 @export
264 def squash(plant_generation : int, plant_number : int):
265 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
266 plant_data = plant_all['plant_data']
267 name = plant_all['name']
268
269 t_delta = plant_data["last_squash_weed"] + datetime.timedelta(minutes = 5)
270 assert now > t_delta, f"You are still squashing bugs or pulling weeds. Try again at {t_delta}."
271
272 plant_data['current_bugs'] -= (random.randint(2, 5))
273 if plant_data['current_bugs'] < 0 :
274 plant_data['current_bugs'] = 0
275
276 plant_data["last_squash_weed"] = now
277 collection_nfts[name,"nft_metadata"] = plant_data
278 return plant_data
279
280 @export
281 def spraybugs(plant_generation : int, plant_number : int):
282 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
283 plant_data = plant_all['plant_data']
284 name = plant_all['name']
285
286 plant_data['current_toxicity'] += (random.randint(1, 3))
287
288 plant_data['current_bugs'] -= (random.randint(10, 20))
289 if plant_data['current_bugs'] < 0 :
290 plant_data['current_bugs'] = 0
291
292 payment(plant_generation, 5)
293 collection_nfts[name,"nft_metadata"] = plant_data
294 return plant_data
295
296 @export
297 def growlights(plant_generation : int, plant_number : int):
298 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
299 plant_data = plant_all['plant_data']
300 name = plant_all['name']
301
302 t_delta = plant_data["last_grow_light"] + datetime.timedelta(days = 1)
303 assert now > t_delta, f"You have used a grow light or shade too recently. Try again at {t_delta}."
304
305 payment(plant_generation, 5)
306 plant_data['current_photosynthesis'] += (random.randint(3, 5))
307 plant_data["last_grow_light"] = now
308
309 if plant_data["current_photosynthesis"] > 100 :
310 plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
311 plant_data["current_photosynthesis"] = 100
312
313 collection_nfts[name,"nft_metadata"] = plant_data
314 return plant_data
315
316 @export
317 def shade(plant_generation : int, plant_number : int):
318 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
319 plant_data = plant_all['plant_data']
320 name = plant_all['name']
321
322 t_delta = plant_data["last_grow_light"] + datetime.timedelta(days = 1)
323 assert now > t_delta, f"You have used a grow light or shade too recently. Try again at {t_delta}."
324
325 plant_data['current_photosynthesis'] -= (random.randint(3, 5))
326 plant_data["last_grow_light"] = now
327
328 if plant_data["current_photosynthesis"] > 100 :
329 plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
330 plant_data["current_photosynthesis"] = 100
331
332 collection_nfts[name,"nft_metadata"] = plant_data
333 return plant_data
334
335 @export
336 def fertilize(plant_generation : int, plant_number : int, num_times : int = 1): #increases nutrients of the plant
337 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
338 plant_data = plant_all['plant_data']
339 name = plant_all['name']
340
341 for x in range(0, num_times):
342 plant_data['current_nutrients'] += (random.randint(4, 6))
343
344 if plant_data['current_nutrients'] > 100 :
345 plant_data["burn_amount"] += (plant_data['current_nutrients']-100)
346 plant_data['current_nutrients'] = 100
347
348 collection_nfts[name,"nft_metadata"] = plant_data
349 return plant_data
350
351 @export
352 def pullweeds(plant_generation : int, plant_number : int): #reduces current weeds in plant and takes 5 minutes to do. Share's a timer.
353
354 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
355 plant_data = plant_all['plant_data']
356 name = plant_all['name']
357
358 t_delta = plant_data["last_squash_weed"] + datetime.timedelta(minutes = 5)
359 assert now > t_delta, f"You are still squashing bugs or pulling weeds. Try again at {t_delta}."
360
361 plant_data['current_weeds'] -= (random.randint(2, 5))
362 if plant_data['current_weeds'] < 0 :
363 plant_data['current_weeds'] = 0
364
365 plant_data["last_squash_weed"] = now
366 collection_nfts[name,"nft_metadata"] = plant_data
367 return plant_data
368
369 @export
370 def sprayweeds(plant_generation : int, plant_number : int):
371 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
372 plant_data = plant_all['plant_data']
373 name = plant_all['name']
374
375 plant_data['current_toxicity'] += (random.randint(1, 3))
376
377 plant_data['current_weeds'] -= (random.randint(10, 20))
378 if plant_data['current_weeds'] < 0 :
379 plant_data['current_weeds'] = 0
380
381 collection_nfts[name,"nft_metadata"] = plant_data
382 return plant_data
383
384 @export
385 def finalize(plant_generation : int, plant_number : int): #Finalizes your plant at the end of growing season to deterimine your berry yield.
386 active_generation = plants['active_generation']
387 assert plant_generation == active_generation, f'The plant you are trying to interact with is not part of the current generation. The current generation is {active_generation}.'
388 name = f'Gen_{plant_generation}_{plant_number}'
389 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
390 assert collection_nfts[name,'finalized'] == False, 'This plant has already been finalized.'
391 end_time = plants['growing_season_end_time']
392 assert now <= plants['finalize_time'] and now >= end_time, 'It is not time to finalize your plant.'
393 if ctx.caller.startswith('con_'): return
394 plant_data = collection_nfts[name,"nft_metadata"]
395 assert plant_data["alive"] == True, 'Your plant is dead due to neglect and you must buy a new plant to try again. Try not to kill it too.'
396
397 if plants['growing_season'] == True :
398 plants['growing_season'] = False
399
400 delta = end_time - plant_data['last_calc']
401 delta_d = (delta.seconds / 86400)
402
403 plant_calc_data = collection_nfts[name,'plant_calc_data']
404 #This sections performs an integral on the various properties for use in determining total berries produced.
405 plant_calc_data["total_water"] += (delta_d**2*((plant_data["current_water"]/100-plant_calc_data["previous_water"]/100)/(delta_d))/2)+plant_calc_data["previous_water"]/100*delta_d
406 plant_calc_data["total_bugs"] += (delta_d**2*(((1-plant_data["current_bugs"]/100)-(1-plant_calc_data["previous_bugs"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_bugs"]/100)*delta_d
407 plant_calc_data["total_nutrients"] += (delta_d**2*((plant_data["current_nutrients"]/100-plant_calc_data["previous_nutrients"]/100)/(delta_d))/2)+plant_calc_data["previous_nutrients"]/100*delta_d
408 plant_calc_data["total_weeds"] += (delta_d**2*(((1-plant_data["current_weeds"]/100)-(1-plant_calc_data["previous_weeds"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_weeds"]/100)*delta_d
409
410 collection_nfts[name,'plant_calc_data'] = plant_calc_data
411
412 plant_data['last_calc'] = now
413 collection_nfts[name,"nft_metadata"] = plant_data
414
415 length = metadata['growing_season_length']
416 berries = int(1000000000000000000000000000000 * ((plant_calc_data["total_water"]*plant_calc_data["total_bugs"]*plant_calc_data["total_nutrients"]*plant_calc_data["total_weeds"])/(length**4))*(1-plant_data['current_toxicity']/100)*(plant_data["current_photosynthesis"]/100)*(1-plant_data["burn_amount"]/100))
417 collection_nfts[name,'berries'] = berries
418 collection_nfts[name,'final_score'] = berries
419 plants[plant_generation,'total_berries'] += berries
420
421 if plants[plant_generation, 'claimable_tau'] == 0:
422 plants[plant_generation, 'claimable_tau'] = plants[plant_generation, 'total_tau']
423
424 collection_nfts[name,'finalized'] == True
425 return berries
426
427 @export
428 def sellberries(plant_generation : int, plant_number : int): #redeem berries for TAU. Must be done after plant finalize time is over.
429 name = f'Gen_{plant_generation}_{plant_number}'
430 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
431 berries = collection_nfts[name,'berries']
432 assert berries > 0, "You don't have any berries to sell."
433 assert now >= plants['finalize_time'], f"You can't sell yet. Try again after {plants['finalize_time']} but do not wait too long."
434 sell_price = plants[plant_generation, 'total_tau'] / plants[plant_generation,'total_berries']
435 proceeds = sell_price * berries
436 currency.transfer(amount=proceeds, to=ctx.caller)
437 collection_nfts[name,'berries'] = 0
438 plants[plant_generation, 'claimable_tau'] -= proceeds
439 return proceeds
440
441 def payment(plant_generation, amount): #used to process payments
442 dev_reward = 0.05
443 currency.transfer_from(amount=amount*(1-dev_reward), to=ctx.this, main_account=ctx.caller)
444 currency.transfer_from(amount=amount*dev_reward, to=metadata['operator'], main_account=ctx.caller)
445 plants[plant_generation, 'total_tau'] += amount*(1-dev_reward)
446
447 @export
448 def manual_reward_add(plant_generation : int, amount : int): #used to manually add more tau to the prize pool
449 currency.transfer_from(amount=amount, to=ctx.this, main_account=ctx.caller)
450 plants[plant_generation, 'total_tau'] += amount
451
452 @export
453 def stale_claims(plant_generation : int): #used by the operator to claim tau from a plant generation that ended at least 30 days prior. This allows players aple time to sell their berries
454 assert metadata['operator'] == ctx.caller, "Only the operator can claim stale tau."
455 stale_claim_time = plants[plant_generation,'stale_claim_time']
456 assert now >= stale_claim_time, f"The tau is not stale yet and cannot be claimed. Try again after {stale_claim_time}"
457 stale_tau = plants[plant_generation, 'claimable_tau']
458 assert stale_tau > 0, "There is no stale tau to claim."
459 currency.transfer(amount=stale_tau, to=ctx.caller)
460
461 @export
462 def update_nickname(plant_generation : int, plant_number : int, nick : str):
463 name = f'Gen_{plant_generation}_{plant_number}'
464 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
465 assert not nick.isdigit(), "The plant nickname can't be an integer."
466 assert bool(collection_nfts[nick]) == False, "This nickname already exists."
467 assert nick.isalnum() == True, "Only alphanumeric characters allowed."
468 assert nick != "", "Name cannot be empty"
469 assert len(nick) >= 3, "The minimum length is 3 characters."
470 payment(plant_generation, 25)
471 collection_nfts[nick] = [plant_generation , plant_number]
472
473 @export
474 def nickname_interaction(nickname : str, function_name :str):
475 nick = collection_nfts[nickname]
476
477 function_names = {
478 'water' : water,
479 'squash' : squash,
480 'spraybugs' : spraybugs,
481 'growlights' : growlights,
482 'shade' : shade,
483 'fertilize' : fertilize,
484 'pullweeds' : pullweeds,
485 'sprayweeds' : sprayweeds,
486 'finalize' : finalize,
487 'sellberries' : sellberries
488 }
489
490 return function_names[function_name](nick[0],nick[1])
491
492
493 @export
494 def emergency_withdraw(amount:float): #temporary function used in testing. will be removed from final contract.
495 assert metadata['operator'] == ctx.caller, "Only the operator can claim tau."
496 currency.transfer(amount=amount, to=ctx.caller)
497
498 @export
499 def manual_season_end():
500 assert metadata['operator'] == ctx.caller, "Only the operator can do this."
501 assert now > plants['growing_season_end_time'], "You can't end the season before the end_time."
502 plants['growing_season'] = False

Byte Code

e3000000000000000000000000060000004000000073d6020000640064016c005a0065016402640364048d025a0265016402640564048d025a03650464006402640664078d035a05650464006402640864078d035a06650464006402640964078d035a07650464006402640a64078d035a0865046402640b64048d025a0965046402640c64048d025a0a650b6a0c83000100640d640e84005a0d650e64028301650f650f640f9c0264106411840483015a10650f650f650f6511651264129c056413641484045a13650e64028301650f6512650f64159c0364166417840483015a14650e640283016512650f650f64189c036419641a840483015a15650e64028301650f6512650f650f641b9c04641c641d840483015a16650e64028301641e641f840083015a17650e64028301650f64209c0164216422840483015a186512651264239c026424642584045a196426642784005a1a6428642984005a1b642a642b84005a1c650e640283016455651265126512642d9c03642e642f840583015a1d650e640283016512651264239c0264306431840483015a1e650e640283016512651264239c0264326433840483015a1f650e640283016512651264239c0264346435840483015a20650e640283016512651264239c0264366437840483015a21650e640283016456651265126512642d9c0364386439840583015a22650e640283016512651264239c02643a643b840483015a23650e640283016512651264239c02643c643d840483015a24650e640283016512651264239c02643e643f840483015a25650e640283016512651264239c0264406441840483015a266442644384005a27650e640283016512651264449c0264456446840483015a28650e64028301651264479c0164486449840483015a29650e6402830165126512650f644a9c03644b644c840483015a2a650e64028301650f650f644d9c02644e644f840483015a2b650e64028301652c64509c0164516452840483015a2d650e6402830164536454840083015a2e640153002957e9000000004eda0e636f6e5f746573746661726d3131da0f636f6c6c656374696f6e5f6e616d652902da08636f6e7472616374da046e616d65da10636f6c6c656374696f6e5f6f776e6572da0f636f6c6c656374696f6e5f6e6674732903da0d64656661756c745f76616c756572040000007205000000da13636f6c6c656374696f6e5f62616c616e636573da1d636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c73da06706c616e7473da086d65746164617461da096e69636b6e616d6573630000000000000000010000000300000043000000736800000074006a0164018301010074026a0174036a048301010074036a04740564023c006403740564043c006405740564063c006407740564083c0064097405640a3c00640b7406640c3c0074077406640d3c00640e7406640f3c006412740664113c0069007d006400530029134eda0b546573745f706c616e7473da086f70657261746f72e905000000da1567726f77696e675f736561736f6e5f6c656e677468e9020000007a0b706c616e74207072696365da11636f6e5f6262665f6576656e74735f3031da0d6576656e745f68616e646c6572da0d636f6e5f746573746970667331da0d697066735f636f6e747261637446da0e67726f77696e675f736561736f6eda1967726f77696e675f736561736f6e5f73746172745f74696d657201000000da05636f756e74e901000000da116163746976655f67656e65726174696f6ee9ffffffff2908da115f5f636f6c6c656374696f6e5f6e616d65da03736574da125f5f636f6c6c656374696f6e5f6f776e6572da03637478da0663616c6c6572da0a5f5f6d65746164617461da085f5f706c616e7473da036e6f772901da0b5f5f6e69636b6e616d6573a9007226000000da00da045f5f5f5f11000000731800000000010a010c010a010801080108010801080108010801080172280000002902da036b6579da096e65775f76616c7565630200000000000000020000000300000043000000732200000074006a017402640119006b02731674036402830182017c0174027c003c006400530029034e720f0000007a1e6f6e6c79206f70657261746f722063616e20736574206d657461646174612904722000000072210000007222000000da0e417373657274696f6e4572726f7229027229000000722a000000722600000072260000007227000000da0f6368616e67655f6d65746164617461200000007306000000000210010601722c00000029057205000000da0b6465736372697074696f6eda0e697066735f696d6167655f75726cda0c6e66745f6d65746164617461da06616d6f756e74630500000000000000050000000500000043000000736c0000007c0064016b037310740064028301820174017c00190064036b02732474006404830182017c0464036b04733474006405830182017c017c0264067c009b0064079d037c0464089c0474017c003c007c0374017c00640966023c007c04740274036a047c0066023c0064005300290a4e72270000007a144e616d652063616e6e6f7420626520656d70747972010000007a134e616d6520616c7265616479206578697374737a24596f752063616e6e6f74207472616e73666572206e6567617469766520616d6f756e74737a1453656520636f6c6c656374696f6e5f6e6674735b7a102c276e66745f6d65746164617461275d2904722d000000722e000000722f0000007230000000722f0000002905722b000000da115f5f636f6c6c656374696f6e5f6e667473da155f5f636f6c6c656374696f6e5f62616c616e6365737220000000722100000029057205000000722d000000722e000000722f0000007230000000722600000072260000007227000000da0a5f5f6d696e745f6e667427000000731000000000021001140110010201020116010c017233000000290372050000007230000000da02746f63030000000000000003000000040000004300000073680000007c0164016b04731074006402830182017c0064036b0373207400640483018201740174026a037c00660219007c016b05733a7400640583018201740174026a037c006602050019007c01380003003c0074017c027c006602050019007c01370003003c006400530029064e72010000007a24596f752063616e6e6f74207472616e73666572206e6567617469766520616d6f756e747372270000007a37506c65617365207370656369667920746865206e616d65206f6620746865204e465420796f752077616e7420746f207472616e736665727a22596f7520646f6e2774206861766520656e6f756768204e46547320746f2073656e642904722b0000007232000000722000000072210000002903720500000072300000007234000000722600000072260000007227000000da087472616e7366657233000000730c0000000002100110010c010e01160172350000002903723000000072050000007234000000630300000000000000030000000400000043000000732c0000007c0064016b0473107400640283018201740174026a037c027c016603050019007c00370003003c006400530029034e72010000007a1f43616e6e6f7420617070726f7665206e6567617469766520616d6f756e74732904722b000000da1f5f5f636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c73722000000072210000002903723000000072050000007234000000722600000072260000007227000000da07617070726f76653d00000073040000000002100172370000002904720500000072300000007234000000da0c6d61696e5f6163636f756e7463040000000000000004000000060000004300000073960000007c0164016b047310740064028301820174017c037c027c00660319007c016b05733c740064036a0274017c037c027c00660319007c0183028301820174037c037c00660219007c016b057354740064048301820174017c037c027c006603050019007c01380003003c0074037c037c006602050019007c01380003003c0074037c027c006602050019007c01370003003c006400530029054e72010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e636573217a484e6f7420656e6f756768204e46547320617070726f76656420746f2073656e642120596f752068617665207b7d20616e642061726520747279696e6720746f207370656e64207b7d7a184e6f7420656e6f756768204e46547320746f2073656e64212904722b0000007236000000da06666f726d6174723200000029047205000000723000000072340000007238000000722600000072260000007227000000da0d7472616e736665725f66726f6d430000007312000000000210010c010c0114010a010e0116011401723a00000063000000000000000003000000040000004300000073da00000074006a01830074026a036b02731674046401830182017405640219007d007c0064036b02732e74046404830182017406640519007d017405640619007d027c02640737007d026408740564023c007407740564093c00740774086a097c01640a8d0117007405640b3c00740774086a097c01640c1700640a8d0117007405640d3c007c02740564063c00640e74057c02640f66023c00640e74057c02641066023c00640e74057c02641166023c00640e74057c02641266023c00740774086a097c0164131700640a8d01170074057c02641466023c006400530029154e7a2a4f6e6c7920746865206f776e65722063616e20737461727420612067726f77696e6720736561736f6e2e7217000000467a1d497420697320616c72656164792067726f77696e6720736561736f6e2e7211000000721b000000721a0000005472180000002901da076d696e75746573da1767726f77696e675f736561736f6e5f656e645f74696d65e903000000da0d66696e616c697a655f74696d657201000000da0d746f74616c5f62657272696573da1073656c6c61626c655f62657272696573da09746f74616c5f746175da0d636c61696d61626c655f746175e91e000000da107374616c655f636c61696d5f74696d65290a721f000000da0367657472200000007221000000722b000000722300000072220000007224000000da086461746574696d65da0974696d6564656c74612903da0b67726f775f736561736f6e7211000000da0a6163746976655f67656e722600000072260000007227000000da1473746172745f67726f77696e675f736561736f6e500000007328000000000206011001080110010801080108010801080106010e010601120108010c010c010c010c010601724a0000002901da046e69636b630100000000000000080000001000000043000000737601000074006401190064026b02731474016403830182017c006a0283000c0073267401640483018201740374047c001900830164056b02733e74016406830182017c006a05830064026b02735274016407830182017c0064086b037362740164098301820174067c008301640a6b0573767401640b830182017400640c19007d0174076a08640d640e830274076a08640f64108302641174076a08640d640e830274076a08640f641083026411641274097409740964027409740a6a0b642164138d0117007409740a6a0b642264138d011700641164149c0e7d027c02641519007c02641619007c02641719007c0264181900641164116411641164199c087d037400641a1900641217007d04641b7c019b00641c7c049b009d047d057c017c04670274047c003c00740c7c01740d641d190083020100740e6a0f740d641e190083017d067c066a1083007d0774117c05641f7c077c026412830501007c0374047c05642066023c007c047400641a3c007c027c076702530029234e7217000000547a3e5468652067726f77696e6720736561736f6e20686173206e6f7420737461727465642c20736f20796f752063616e6e6f7420627579206120706c616e742e7a2754686520706c616e74206e69636b6e616d652063616e277420626520616e20696e74656765722e467a1d54686973206e69636b6e616d6520616c7265616479206578697374732e7a254f6e6c7920616c7068616e756d65726963206368617261637465727320616c6c6f7765642e72270000007a144e616d652063616e6e6f7420626520656d707479723d0000007a23546865206d696e696d756d206c656e677468206973203320636861726163746572732e721b000000e932000000e9500000007210000000e9190000007201000000721a0000002901da0464617973290eda0d63757272656e745f7761746572da0c63757272656e745f62756773da1663757272656e745f70686f746f73796e746865736973da1163757272656e745f6e75747269656e7473da0d63757272656e745f7765656473da1063757272656e745f746f786963697479da0f63757272656e745f77656174686572da106c6173745f696e746572616374696f6eda0a6c6173745f6461696c79da096c6173745f63616c63da05616c697665da106c6173745f7371756173685f77656564da0f6c6173745f67726f775f6c69676874da0b6275726e5f616d6f756e7472500000007251000000725300000072540000002908da0e70726576696f75735f7761746572da0d70726576696f75735f62756773da1270726576696f75735f6e75747269656e7473da0e70726576696f75735f7765656473da0b746f74616c5f7761746572da0a746f74616c5f62756773da0f746f74616c5f6e75747269656e7473da0b746f74616c5f77656564737219000000da0447656e5fda015f7a0b706c616e7420707269636572160000007a5c54686973206973206120626c7565626572727920706c616e742e204b65657020697420616c69766520616e64206865616c7468792062792074656e64696e6720746f20697420647572696e672067726f77696e6720736561736f6e2eda0f706c616e745f63616c635f64617461721c000000721c00000029127223000000722b000000da0769736469676974da04626f6f6c7231000000da076973616c6e756dda036c656eda0672616e646f6dda0772616e64696e74722400000072460000007247000000da095f5f7061796d656e747222000000da09696d706f72746c6962da0d696d706f72745f6d6f64756c65da0b7069636b5f72616e646f6d72330000002908724b000000da10706c616e745f67656e65726174696f6eda0a706c616e745f646174617268000000da07705f636f756e747205000000da06697066735f63722e000000722600000072260000007227000000da096275795f706c616e74680000007344000000000206010e0112010a010e0114011001140108010a010c010a010e01060110010e01080106010601080108010a010c0110010c010e010e010801040102010a010c010801727700000029027273000000da0c706c616e745f6e756d62657263020000000000000006000000060000004300000073380100007400640119007d027c007c026b027320740164027c029b0064039d038301820164047c009b0064057c019b009d047d03740274036a047c036602190064066b02734a740164078301820174057400640819006b01735e740164098301820174036a046a06640a8301726e6400530074077c03640b660219007d047c04640c1900640d6b02738e7401640e8301820174057c04640f190074086a09641064118d0117006b04900172087c04641205001900740a6a0b641364148302380003003c007c04641505001900740a6a0b641364148302370003003c007c04641605001900740a6a0b641364148302380003003c007c04641705001900740a6a0b641364148302370003003c00740c7c0483017d04740d7c047c0383027d04740e7c0483017d0474057c04640f3c007c047c0364189c027d057c05530029194e721b0000007a6b54686520706c616e7420796f752061726520747279696e6720746f20696e7465726163742077697468206973206e6f742070617274206f66207468652063757272656e742067656e65726174696f6e2e205468652063757272656e742067656e65726174696f6e20697320da012e72660000007267000000721a0000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e723c0000007a495468652067726f77696e6720736561736f6e206973206e6f74206163746976652c20736f20796f752063616e6e6f7420696e746572616374207769746820796f757220706c616e742eda04636f6e5f722f000000725a000000547a64596f757220706c616e7420697320646561642064756520746f206e65676c65637420616e6420796f75206d757374206275792061206e657720706c616e7420746f2074727920616761696e2e20547279206e6f7420746f206b696c6c20697420746f6f2e7257000000e90c0000002901da05686f75727372500000007210000000e90f000000725100000072530000007254000000290272740000007205000000290f7223000000722b0000007232000000722000000072210000007224000000da0a73746172747377697468723100000072460000007247000000726d000000726e000000da125f5f6461696c795f636f6e646974696f6e73da105f5f746f74616c697a65725f63616c63da0c5f5f646561645f636865636b290672730000007278000000721b00000072050000007274000000da09706c616e745f616c6c722600000072260000007227000000da0e5f5f616374696f6e5f73657475708e000000732e00000000010801180110010c010e010e0106010c0104010c0106010e011a01180118011801180108010a01080108010a01728300000063010000000000000002000000060000004300000073c8010000900178c074007c0064011900180074016a02640264038d016b04900172c274036a046402640483027d017c0164026b0272627c0064050500190074036a04640664078302380003003c007c0064080500190074036a046409640a8302370003003c007c01640b6b02729a7c0064050500190074036a04640c640d8302380003003c007c0064080500190074036a04640b64098302370003003c007c0164046b0272d27c0064050500190074036a04640c640e8302370003003c007c0064080500190074036a046402640b8302370003003c007c00640f0500190074036a04640c64078302370003003c007c0064100500190074036a04640c64068302380003003c007c0064110500190074036a04640c64078302370003003c007c0064010500190074016a02640264038d01370003003c007c017c0064123c007c0064130500190074036a046414640b8302380003003c007c006413190064146b009001726864147c0064133c007c006405190064156b049001727e64157c0064053c007c006405190064146b009001729464147c0064053c007c006408190064156b0472047c006416050019007c006408190064151800370003003c0064157c0064083c00710457007c00530029174e7258000000721a0000002901724f000000723d0000007250000000e90a000000e9140000007252000000e904000000e90600000072120000007210000000727d000000724e000000725100000072530000007254000000725600000072550000007201000000e964000000725d0000002905722400000072460000007247000000726d000000726e000000290272740000007256000000722600000072260000007227000000727f000000a8000000733800000000011e010c010801180118010801180118010801180118011801180118011801080118010e0108010e0108010e0108010c010e010a010c01727f00000063020000000000000005000000080000004300000073ac01000074007c006401190074016a02640264038d0117006b04900172a874007c006401190018007d027c026a0364041b007d0374047c016405660219007d047c046406050019007c03640713007c006408190064091b007c04640a190064091b0018007c031b00140064071b007c04640a190064091b007c0314001700370003003c007c04640b050019007c0364071300640c7c00640d190064091b001800640c7c04640e190064091b00180018007c031b00140064071b00640c7c04640e190064091b0018007c0314001700370003003c007c04640f050019007c03640713007c006410190064091b007c046411190064091b0018007c031b00140064071b007c046411190064091b007c0314001700370003003c007c046412050019007c0364071300640c7c006413190064091b001800640c7c046414190064091b00180018007c031b00140064071b00640c7c046414190064091b0018007c0314001700370003003c0074007c0064013c007c00640819007c04640a3c007c00640d19007c04640e3c007c00641019007c0464113c007c00641319007c0464143c007c0474047c01640566023c007c00530029154e7259000000723d0000002901727c000000698051010072680000007262000000721200000072500000007288000000725e0000007263000000721a0000007251000000725f0000007264000000725300000072600000007265000000725400000072610000002905722400000072460000007247000000da077365636f6e64737231000000290572740000007205000000da0564656c7461da0764656c74615f6472680000007226000000722600000072270000007280000000c7000000732e00000000011a010c010a010c0108022601160108023c010c0108022601160108023c010c0108010c010c010c010c010c01728000000063010000000000000001000000030000004300000073500000007c006401190064026b0573247c006403190064026b0573247c006404190064026b05722c64057c0064063c007c006407190064086b0173447c006409190064086b01724c64057c0064063c007c005300290a4e725500000072880000007251000000725400000046725a0000007250000000720100000072530000007226000000290172740000007226000000722600000072270000007281000000e5000000730e00000000011201120108011201060108017281000000721a000000290372730000007278000000da096e756d5f74696d6573630300000000000000070000000700000043000000736a00000074007c007c0183027d037c03640119007d047c03640219007d05782a740164037c02830244005d1c7d067c0464040500190074026a03640564068302370003003c00712657007c046404190064076b04725a64077c0464043c007c0474047c05640866023c007c04530029094e72740000007205000000720100000072500000007210000000727d0000007288000000722f00000029057283000000da0572616e6765726d000000726e0000007231000000290772730000007278000000728c000000728200000072740000007205000000da0178722600000072260000007227000000da057761746572ef000000731200000000020a010801080110011c010c0108010c01728f000000630200000000000000060000000600000043000000738a00000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d03830182017c0364080500190074056a06640964048302380003003c007c0364081900640a6b007272640a7c0364083c0074037c0364033c007c0374077c04640b66023c007c035300290c4e72740000007205000000725b00000072100000002901723b0000007a3c596f7520617265207374696c6c20737175617368696e672062756773206f722070756c6c696e672077656564732e2054727920616761696e206174207279000000725100000072120000007201000000722f00000029087283000000724600000072470000007224000000722b000000726d000000726e0000007231000000290672730000007278000000728200000072740000007205000000da07745f64656c7461722600000072260000007227000000da06737175617368fc000000731600000000020a01080108011401180118010c01080108010c017291000000630200000000000000050000000600000043000000737800000074007c007c0183027d027c02640119007d037c02640219007d047c0364030500190074016a02640464058302370003003c007c0364060500190074016a02640764088302380003003c007c036406190064096b00725e64097c0364063c0074037c00640a830201007c0374047c04640b66023c007c035300290c4e727400000072050000007255000000721a000000723d00000072510000007284000000728500000072010000007210000000722f00000029057283000000726d000000726e000000726f0000007231000000290572730000007278000000728200000072740000007205000000722600000072260000007227000000da097370726179627567730b010000731400000000020a0108010801180118010c0108010a010c01729200000063020000000000000006000000060000004300000073ac00000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d038301820174057c006408830201007c0364090500190074066a07640a64088302370003003c0074037c0364033c007c0364091900640b6b04729c7c03640c050019007c0364091900640b1800370003003c00640b7c0364093c007c0374087c04640d66023c007c035300290e4e72740000007205000000725c000000721a0000002901724f0000007a3f596f752068617665207573656420612067726f77206c69676874206f7220736861646520746f6f20726563656e746c792e2054727920616761696e20617420727900000072100000007252000000723d0000007288000000725d000000722f00000029097283000000724600000072470000007224000000722b000000726f000000726d000000726e00000072310000002906727300000072780000007282000000727400000072050000007290000000722600000072260000007227000000da0a67726f776c696768747319010000731a00000000020a0108010801140118010a01180108010c01180108010c01729300000063020000000000000006000000060000004300000073a200000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d03830182017c0364080500190074056a066409640a8302380003003c0074037c0364033c007c0364081900640b6b0472927c03640c050019007c0364081900640b1800370003003c00640b7c0364083c007c0374077c04640d66023c007c035300290e4e72740000007205000000725c000000721a0000002901724f0000007a3f596f752068617665207573656420612067726f77206c69676874206f7220736861646520746f6f20726563656e746c792e2054727920616761696e2061742072790000007252000000723d00000072100000007288000000725d000000722f00000029087283000000724600000072470000007224000000722b000000726d000000726e00000072310000002906727300000072780000007282000000727400000072050000007290000000722600000072260000007227000000da0573686164652a010000731800000000020a010801080114011801180108010c01180108010c017294000000630300000000000000070000000700000043000000738200000074007c007c0183027d037c03640119007d047c03640219007d05782a740164037c02830244005d1c7d067c0464040500190074026a03640564068302370003003c00712657007c046404190064076b0472727c046408050019007c046404190064071800370003003c0064077c0464043c007c0474047c05640966023c007c045300290a4e7274000000720500000072010000007253000000728600000072870000007288000000725d000000722f00000029057283000000728d000000726d000000726e0000007231000000290772730000007278000000728c000000728200000072740000007205000000728e000000722600000072260000007227000000da0966657274696c697a653a010000731400000000020a010801080110011c010c01180108010c017295000000630200000000000000060000000600000043000000738a00000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d03830182017c0364080500190074056a06640964048302380003003c007c0364081900640a6b007272640a7c0364083c0074037c0364033c007c0374077c04640b66023c007c035300290c4e72740000007205000000725b00000072100000002901723b0000007a3c596f7520617265207374696c6c20737175617368696e672062756773206f722070756c6c696e672077656564732e2054727920616761696e206174207279000000725400000072120000007201000000722f00000029087283000000724600000072470000007224000000722b000000726d000000726e00000072310000002906727300000072780000007282000000727400000072050000007290000000722600000072260000007227000000da0970756c6c776565647348010000731600000000020a01080108011401180118010c01080108010c017296000000630200000000000000050000000600000043000000736e00000074007c007c0183027d027c02640119007d037c02640219007d047c0364030500190074016a02640464058302370003003c007c0364060500190074016a02640764088302380003003c007c036406190064096b00725e64097c0364063c007c0374037c04640a66023c007c035300290b4e727400000072050000007255000000721a000000723d0000007254000000728400000072850000007201000000722f00000029047283000000726d000000726e0000007231000000290572730000007278000000728200000072740000007205000000722600000072260000007227000000da0a7370726179776565647357010000731200000000020a0108010801180118010c0108010c0172970000006302000000000000000b000000080000004300000073fe0200007400640119007d027c007c026b027320740164027c029b0064039d038301820164047c009b0064057c019b009d047d03740274036a047c036602190064066b02734a740164078301820174057c0364086602190064096b0273627401640a830182017400640b19007d0474067400640c19006b01727e74067c046b0573867401640d8301820174036a046a07640e830172966400530074057c03640f660219007d057c056410190064116b0273b6740164128301820174006413190064116b0272ca6409740064133c007c047c056414190018007d067c066a0864151b007d0774057c036416660219007d087c086417050019007c07641813007c0564191900641a1b007c08641b1900641a1b0018007c071b00140064181b007c08641b1900641a1b007c0714001700370003003c007c08641c050019007c076418130064067c05641d1900641a1b00180064067c08641e1900641a1b00180018007c071b00140064181b0064067c08641e1900641a1b0018007c0714001700370003003c007c08641f050019007c07641813007c0564201900641a1b007c0864211900641a1b0018007c071b00140064181b007c0864211900641a1b007c0714001700370003003c007c086422050019007c076418130064067c0564231900641a1b00180064067c0864241900641a1b00180018007c071b00140064181b0064067c0864241900641a1b0018007c0714001700370003003c007c0874057c03641666023c0074067c0564143c007c0574057c03640f66023c007409642519007d09740a64267c08641719007c08641c190014007c08641f190014007c086422190014007c09642713001b00140064067c0564281900641a1b00180014007c0564291900641a1b00140064067c05642a1900641a1b001800140083017d0a7c0a74057c03642b66023c007c0a74057c03642c66023c0074007c00642d6602050019007c0a370003003c0074007c00642e66021900642f6b02900272ea74007c0064306602190074007c00642e66023c0074057c0364086602190064116b0201007c0a530029314e721b0000007a6b54686520706c616e7420796f752061726520747279696e6720746f20696e7465726163742077697468206973206e6f742070617274206f66207468652063757272656e742067656e65726174696f6e2e205468652063757272656e742067656e65726174696f6e20697320727900000072660000007267000000721a0000007a1a596f7520646f206e6f74206f776e207468697320706c616e742eda0966696e616c697a6564467a265468697320706c616e742068617320616c7265616479206265656e2066696e616c697a65642e723c000000723e0000007a264974206973206e6f742074696d6520746f2066696e616c697a6520796f757220706c616e742e727a000000722f000000725a000000547a64596f757220706c616e7420697320646561642064756520746f206e65676c65637420616e6420796f75206d757374206275792061206e657720706c616e7420746f2074727920616761696e2e20547279206e6f7420746f206b696c6c20697420746f6f2e72170000007259000000698051010072680000007262000000721200000072500000007288000000725e00000072630000007251000000725f00000072640000007253000000726000000072650000007254000000726100000072110000006c0700000000000000a937a733044d93652703728600000072550000007252000000725d000000da0762657272696573da0b66696e616c5f73636f7265723f000000724200000072010000007241000000290b7223000000722b00000072320000007220000000722100000072310000007224000000727e00000072890000007222000000da03696e74290b72730000007278000000721b0000007205000000da08656e645f74696d657274000000728a000000728b0000007268000000da066c656e6774687299000000722600000072260000007227000000da0866696e616c697a6564010000735c00000000020801180110010c010e010a010e0108010c0110010c0104010c0106010e010c0108010c010a010c0108023c0108023c010c0108022601160108023c010c010c0108010c01080102044e010c010c010c0114011201020112011001729e00000063020000000000000006000000040000004300000073ba00000064017c009b0064027c019b009d047d02740074016a027c026602190064036b02732a740364048301820174047c026405660219007d037c0364066b047346740364078301820174057406640819006b057366740364097406640819009b00640a9d038301820174067c00640b6602190074067c00640c660219001b007d047c047c0314007d0574076a087c0574016a02640d8d020100640674047c02640566023c0074067c00640e6602050019007c05380003003c007c055300290f4e72660000007267000000721a0000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e729900000072010000007a23596f7520646f6e2774206861766520616e79206265727269657320746f2073656c6c2e723e0000007a24596f752063616e27742073656c6c207965742e2054727920616761696e206166746572207a1a2062757420646f206e6f74207761697420746f6f206c6f6e672e7241000000723f00000029027230000000723400000072420000002909723200000072200000007221000000722b000000723100000072240000007223000000da0863757272656e6379723500000029067273000000727800000072050000007299000000da0a73656c6c5f7072696365da0870726f6365656473722600000072260000007227000000da0b73656c6c626572726965739d010000731c000000000210010c010e010c0110010e0112010c010c01080110010c01140172a2000000630200000000000000030000000600000043000000735e0000007400640183017d0274016a027c0164027c021800140074036a0474036a0564038d03010074016a027c017c02140074066404190074036a0564038d03010074077c0064056602050019007c0164027c0218001400370003003c006400530029064e7a04302e3035721a0000002903723000000072340000007238000000720f00000072410000002908da07646563696d616c729f000000723a0000007220000000da0474686973722100000072220000007223000000290372730000007230000000da0a6465765f726577617264722600000072260000007227000000726f000000af010000730c0000000001080112010a010c010e01726f000000290272730000007230000000630200000000000000020000000500000043000000732c00000074006a017c0174026a0374026a0464018d03010074057c0064026602050019007c01370003003c006400530029034e290372300000007234000000723800000072410000002906729f000000723a000000722000000072a400000072210000007223000000290272730000007230000000722600000072260000007227000000da116d616e75616c5f7265776172645f616464b801000073040000000002140172a600000029017273000000630100000000000000030000000400000043000000736800000074006401190074016a026b027316740364028301820174047c006403660219007d0174057c016b057338740364047c019b009d028301820174047c006405660219007d027c0264066b047354740364078301820174066a077c0274016a0264088d0201006400530029094e720f0000007a264f6e6c7920746865206f70657261746f722063616e20636c61696d207374616c65207461752e72440000007a4054686520746175206973206e6f74207374616c652079657420616e642063616e6e6f7420626520636c61696d65642e2054727920616761696e20616674657220724200000072010000007a1f5468657265206973206e6f207374616c652074617520746f20636c61696d2e2902723000000072340000002908722200000072200000007221000000722b00000072230000007224000000729f0000007235000000290372730000007244000000da097374616c655f746175722600000072260000007227000000da0c7374616c655f636c61696d73be010000730e0000000002060110010c0116010c01100172a8000000290372730000007278000000724b00000063030000000000000004000000040000004300000073a600000064017c009b0064027c019b009d047d03740074016a027c036602190064036b02732a74036404830182017c026a0483000c00733c7403640583018201740574067c021900830164066b02735474036407830182017c026a07830064086b02736874036409830182017c02640a6b0373787403640b8301820174087c028301640c6b05738c7403640d8301820174097c00640e830201007c007c01670274067c023c0064005300290f4e72660000007267000000721a0000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e7a2754686520706c616e74206e69636b6e616d652063616e277420626520616e20696e74656765722e467a1d54686973206e69636b6e616d6520616c7265616479206578697374732e547a254f6e6c7920616c7068616e756d65726963206368617261637465727320616c6c6f7765642e72270000007a144e616d652063616e6e6f7420626520656d707479723d0000007a23546865206d696e696d756d206c656e677468206973203320636861726163746572732e724e000000290a723200000072200000007221000000722b0000007269000000726a0000007231000000726b000000726c000000726f000000290472730000007278000000724b0000007205000000722600000072260000007227000000da0f7570646174655f6e69636b6e616d65c90100007316000000000210010c010e0112010a010e011401100114010a0172a90000002902da086e69636b6e616d65da0d66756e6374696f6e5f6e616d65630200000000000000040000000b00000043000000733800000074007c0019007d02740174027403740474057406740774087409740a64019c0a7d037c037c0119007c02640219007c02640319008302530029044e290a728f0000007291000000729200000072930000007294000000729500000072960000007297000000729e00000072a20000007201000000721a000000290b7231000000728f0000007291000000729200000072930000007294000000729500000072960000007297000000729e00000072a2000000290472aa00000072ab000000724b000000da0e66756e6374696f6e5f6e616d6573722600000072260000007227000000da146e69636b6e616d655f696e746572616374696f6ed8010000730c000000000208010401060106010a0172ad00000029017230000000630100000000000000010000000400000043000000732a00000074006401190074016a026b027316740364028301820174046a057c0074016a0264038d0201006400530029044e720f0000007a204f6e6c7920746865206f70657261746f722063616e20636c61696d207461752e2902723000000072340000002906722200000072200000007221000000722b000000729f000000723500000029017230000000722600000072260000007227000000da12656d657267656e63795f7769746864726177e2010000730600000000020601100172ae000000630000000000000000000000000300000043000000733600000074006401190074016a026b027316740364028301820174047405640319006b04732a74036404830182016405740564063c006400530029074e720f0000007a1e4f6e6c7920746865206f70657261746f722063616e20646f20746869732e723c0000007a2d596f752063616e277420656e642074686520736561736f6e206265666f72652074686520656e645f74696d652e4672170000002906722200000072200000007221000000722b000000722400000072230000007226000000722600000072260000007227000000da116d616e75616c5f736561736f6e5f656e64e9010000730a0000000002060110010e01060172af0000002901721a0000002901721a000000292f729f000000da085661726961626c65721d000000721f000000da0448617368723100000072320000007236000000722300000072220000007225000000726d000000da04736565647228000000da085f5f6578706f7274da03737472722c000000da0464696374729b000000723300000072350000007237000000723a000000724a00000072770000007283000000727f00000072800000007281000000728f0000007291000000729200000072930000007294000000729500000072960000007297000000729e00000072a2000000726f00000072a600000072a800000072a900000072ad000000da05666c6f617472ae00000072af0000007226000000722600000072260000007227000000da083c6d6f64756c653e01000000737e00000008010c0104010801060108010601080104010a010e010c010c010803080f060112060601100b06011409060114050601160c101806011025101a081f081e080a0601160c0601120e0601120d060112100601120f0601160d0601120e0601120c06011238060112110809060112050601100a0601140e0601120906011006