Contract con_staking_rswp_interop
Creator | 7c296eb80e379171f694a3c5be7640d16f300f09d731c99ac0a92f49c9c0c151 |
Creation Hash | 85a2e9543c0a78b119f4d814ea2adb09fcca594c628b64e03ff86c7010d5614b |
Created On | 991 days ago - 7/11/2021, 12:07:31 PM UTC+0 |
Contract Code
1
# Imports
2
3
import con_rswp_lst001
4
5
I = importlib
6
7
# Setup Tokens
8
9
STAKING_TOKEN = con_rswp_lst001
10
YIELD_TOKEN = con_rswp_lst001
11
12
# State
13
14
Owner = Variable()
15
DevRewardWallet = Variable()
16
EmissionRatePerHour = Variable()
17
DevRewardPct = Variable()
18
StartTime = Variable()
19
EndTime = Variable()
20
OpenForBusiness = Variable() # If false, users will be unable to join the pool
21
22
Deposits = Hash(default_value=False)
23
Withdrawals = Hash(default_value=0)
24
CurrentEpochIndex = Variable()
25
Epochs = Hash(default_value=False)
26
StakedBalance = Variable() # The total amount of farming token in the vault.
27
WithdrawnBalance = Variable()
28
EpochMinTime = Variable() # The minimum amount of seconds in Epoch
29
EpochMaxRatioIncrease = (
30
Variable()
31
) # The maximum ratio which the Epoch can increase by since last Epoch before incrementing.
32
meta = Hash(default_value=False)
33
decimal_converter_var = Variable()
34
TimeRampValues = Variable()
35
UseTimeRamp = Variable()
36
TrustedExporters = Variable()
37
38
# Vtoken
39
balances = Hash(default_value=0)
40
41
42
@construct
43
def seed():
44
Owner.set(ctx.caller)
45
DevRewardWallet.set(ctx.caller)
46
CurrentEpochIndex.set(0)
47
StakedBalance.set(0)
48
WithdrawnBalance.set(0)
49
EpochMaxRatioIncrease.set(1 / 2)
50
EpochMinTime.set(0)
51
UseTimeRamp.set(True)
52
TrustedExporters.set([])
53
TimeRampValues.set(
54
[
55
{"lower": 0, "upper": 1, "multiplier": 0.1},
56
{"lower": 1, "upper": 2, "multiplier": 0.2},
57
{"lower": 2, "upper": 3, "multiplier": 0.3},
58
{"lower": 3, "upper": 4, "multiplier": 0.4},
59
{"lower": 4, "upper": 5, "multiplier": 0.5},
60
{"lower": 5, "upper": 6, "multiplier": 0.6},
61
{"lower": 6, "upper": 7, "multiplier": 0.7},
62
{"lower": 7, "upper": 8, "multiplier": 0.8},
63
{"lower": 8, "upper": 9, "multiplier": 0.9},
64
{"lower": 9, "upper": 10, "multiplier": 1},
65
]
66
)
67
68
Epochs[0] = {"time": now, "staked": 0, "amt_per_hr": 2629}
69
70
meta["version"] = "0.0.2"
71
meta[
72
"type"
73
] = "staking_smart_epoch_compounding_timeramp" # staking || lp_farming || etcetera ...
74
meta["STAKING_TOKEN"] = "con_rswp_lst001"
75
meta["YIELD_TOKEN"] = "con_rswp_lst001"
76
77
EmissionRatePerHour.set(2629) # 1200000 RSWP per year = 10% of supply
78
DevRewardPct.set(1 / 10)
79
80
# The datetime from which you want to allow staking.
81
StartTime.set(datetime.datetime(year=2021, month=7, day=12, hour=0))
82
# The datetime at which you want staking to finish.
83
EndTime.set(datetime.datetime(year=2022, month=5, day=4, hour=0))
84
85
OpenForBusiness.set(True)
86
87
88
@export
89
def addStakingTokens(amount: float):
90
user = ctx.caller
91
deposit = Deposits[user]
92
93
if deposit is False:
94
return createNewDeposit(amount=amount, user_ctx="caller", from_contract=False)
95
else:
96
return increaseDeposit(amount=amount, user_ctx="caller", from_contract=False)
97
98
99
# This is called FROM the contract to which the yields will be staked.
100
# This contract name will need to be added to the "TrustedImporters" list on the foreign contract.
101
@export
102
def stakeFromContractProfits(contract: str):
103
# verify that the contract is calling it is trusted.
104
assert (
105
contract in TrustedExporters.get()
106
), "The contract is not in the trusted exporters list."
107
# import staking contract
108
yield_contract = I.import_module(contract)
109
# call withdraw function to this contract, take return value
110
amount = yield_contract.exportYieldToForeignContract()
111
# stake this value
112
user = ctx.signer
113
114
deposit = Deposits[user]
115
116
if deposit is False:
117
return createNewDeposit(amount=amount, user_ctx="caller", from_contract=True)
118
else:
119
return increaseDeposit(amount=amount, user_ctx="caller", from_contract=True)
120
121
122
def createNewDeposit(
123
amount: float, user_ctx: str, from_contract: bool
124
): # user_ctx will either be "caller" or "signer"
125
assert OpenForBusiness.get() == True, "This staking pool is not open right now."
126
assert amount > 0, "You must stake something."
127
128
user = ctx.caller
129
130
# Take the staking tokens from the user's wallet if the user has called this function via addStakingTokens
131
if from_contract is False:
132
STAKING_TOKEN.transfer_from(amount=amount, to=ctx.this, main_account=user)
133
134
# Update the Staked amount
135
staked = StakedBalance.get()
136
new_staked_amount = staked + amount
137
StakedBalance.set(new_staked_amount)
138
139
# Update the Epoch
140
epoch_index = decideIncrementEpoch(new_staked_amount=new_staked_amount)
141
142
# Create a record of the user's deposit
143
144
Deposits[user] = {"starting_epoch": epoch_index, "time": now, "amount": amount}
145
146
# mint vtoken equal to the deposit.
147
mintVToken(amount=amount)
148
return Deposits[user]
149
150
151
def increaseDeposit(
152
amount: float, user_ctx: str, from_contract: bool
153
): # user_ctx will either be "caller" or "signer"
154
155
user = ctx.caller if user_ctx is "caller" else ctx.signer
156
assert OpenForBusiness.get() == True, "This staking pool is not open right now."
157
assert amount >= 0, "You cannot stake a negative balance."
158
159
deposit = Deposits[user]
160
161
assert deposit is not False, "This user has no deposit to add to."
162
163
# Take the staking tokens from the user's wallet
164
if amount > 0 and from_contract is False:
165
STAKING_TOKEN.transfer_from(amount=amount, to=ctx.this, main_account=user)
166
167
withdrawn_yield = Withdrawals[user]
168
yield_to_harvest = 0
169
existing_stake = 0
170
user_yield_share = 0
171
172
yield_to_harvest += calculateYield(deposit=deposit)
173
deposit_start_time = deposit["time"]
174
existing_stake = deposit["amount"]
175
176
yield_to_harvest -= withdrawn_yield
177
178
if yield_to_harvest > 0:
179
180
# Take % of Yield Tokens, send it to dev fund
181
dev_share = yield_to_harvest * DevRewardPct.get()
182
if dev_share > 0:
183
YIELD_TOKEN.transfer(to=DevRewardWallet.get(), amount=dev_share)
184
185
# Send remanding Yield Tokens to user
186
user_yield_share = yield_to_harvest - dev_share
187
188
total_deposit_amount = user_yield_share + existing_stake + amount
189
global_amount_staked = StakedBalance.get()
190
new_global_staked = global_amount_staked + user_yield_share + amount
191
StakedBalance.set(new_global_staked)
192
WithdrawnBalance.set(WithdrawnBalance.get() + yield_to_harvest)
193
194
mintVToken(amount=user_yield_share + amount)
195
196
Withdrawals[user] = 0
197
Deposits[user] = {
198
"starting_epoch": decideIncrementEpoch(new_staked_amount=new_global_staked),
199
"time": deposit_start_time,
200
"amount": total_deposit_amount,
201
"step_offset": fitTimeToRange(now) - fitTimeToRange(deposit_start_time),
202
}
203
204
return Deposits[user]
205
206
207
def sendYieldToTarget(amount: float, target: str, user: str):
208
209
deposit = Deposits[user]
210
assert deposit is not False, "You have no deposit to withdraw yield from."
211
212
# Calculate how much yield is due per deposit account
213
withdrawn_yield = Withdrawals[user]
214
harvestable_yield = 0
215
216
harvestable_yield += calculateYield(deposit=deposit)
217
218
# Determine maximum amount of yield user can withdraw
219
harvestable_yield -= withdrawn_yield
220
221
yield_to_harvest = amount if amount < harvestable_yield else harvestable_yield
222
223
assert yield_to_harvest > 0, "There is no yield to harvest right now :("
224
225
# Take % of Yield Tokens, send it to dev fund
226
dev_share = yield_to_harvest * DevRewardPct.get()
227
228
if dev_share > 0:
229
YIELD_TOKEN.transfer(to=DevRewardWallet.get(), amount=dev_share)
230
231
# Send remanding Yield Tokens to user
232
user_share = yield_to_harvest - dev_share
233
YIELD_TOKEN.transfer(to=target, amount=user_share)
234
235
Withdrawals[user] = withdrawn_yield + yield_to_harvest
236
237
new_withdrawn_amount = WithdrawnBalance.get() + yield_to_harvest
238
WithdrawnBalance.set(new_withdrawn_amount)
239
240
return user_share
241
242
243
@export
244
def withdrawYield(amount: float):
245
assert amount > 0, "You cannot harvest a negative balance"
246
247
user = ctx.caller
248
return sendYieldToTarget(amount=amount, target=user, user=user)
249
250
251
@export
252
def withdrawTokensAndYield():
253
user = ctx.caller
254
deposit = Deposits[user]
255
256
assert deposit is not False, "You have no deposit to withdraw"
257
258
# Calculate how much yield is due per deposit account
259
withdrawn_yield = Withdrawals[user]
260
stake_to_return = 0
261
yield_to_harvest = 0
262
user_share = 0
263
264
yield_to_harvest += calculateYield(deposit=deposit)
265
stake_to_return += deposit["amount"]
266
267
# Send Staking Tokens to user
268
STAKING_TOKEN.transfer(to=user, amount=stake_to_return)
269
returnAndBurnVToken(amount=stake_to_return)
270
271
# check that the user has yield left to harvest (this should never be negative, but let's check here just in case)
272
yield_to_harvest -= withdrawn_yield
273
if yield_to_harvest > 0:
274
275
# Take % of Yield Tokens, send it to dev fund
276
dev_share = yield_to_harvest * DevRewardPct.get()
277
if dev_share > 0:
278
YIELD_TOKEN.transfer(to=DevRewardWallet.get(), amount=dev_share)
279
280
# Send remanding Yield Tokens to user
281
user_share = yield_to_harvest - dev_share
282
YIELD_TOKEN.transfer(to=user, amount=user_share)
283
284
# Reset User's Deposits
285
Deposits[user] = False
286
287
# Reset User's Withdrawal
288
Withdrawals[user] = 0
289
290
# Remove token amount from Staked
291
new_staked_amount = StakedBalance.get() - stake_to_return
292
StakedBalance.set(new_staked_amount)
293
new_withdrawn_amount = WithdrawnBalance.get() + yield_to_harvest
294
WithdrawnBalance.set(new_withdrawn_amount)
295
296
# Increment Epoch
297
decideIncrementEpoch(new_staked_amount=new_staked_amount)
298
299
return user_share
300
301
302
# This runs over each of the items in the user's Deposit
303
def calculateYield(deposit):
304
starting_epoch_index = deposit.get("starting_epoch")
305
deposit_start_time = deposit.get("time")
306
amount = deposit.get("amount")
307
step_offset = deposit.get("step_offset")
308
309
if step_offset is not None:
310
deposit_start_time = deposit_start_time + step_offset
311
else:
312
step_offset = now - now # now - now // 0 delta
313
314
current_epoch_index = getCurrentEpochIndex()
315
this_epoch_index = starting_epoch_index
316
317
y = 0
318
time_step_multiplier = 1
319
320
while this_epoch_index <= current_epoch_index:
321
this_epoch = Epochs[this_epoch_index]
322
next_epoch = Epochs[this_epoch_index + 1]
323
324
if UseTimeRamp.get():
325
time_ramp_delta = (
326
fitTimeToRange(now) - fitTimeToRange(this_epoch["time"]) + step_offset
327
)
328
time_step_multiplier = findTimeRampStep(time_ramp_delta.days)
329
330
delta = 0
331
332
if starting_epoch_index == current_epoch_index:
333
delta = fitTimeToRange(now) - fitTimeToRange(deposit_start_time)
334
elif this_epoch_index == starting_epoch_index:
335
delta = fitTimeToRange(next_epoch["time"]) - fitTimeToRange(
336
deposit_start_time
337
)
338
elif this_epoch_index == current_epoch_index:
339
delta = fitTimeToRange(now) - fitTimeToRange(this_epoch["time"])
340
else:
341
delta = fitTimeToRange(next_epoch["time"]) - fitTimeToRange(
342
this_epoch["time"]
343
)
344
345
pct_share_of_stake = 0
346
if amount is not 0 and this_epoch["staked"] is not 0:
347
pct_share_of_stake = amount / this_epoch["staked"]
348
349
# These two lines below were causing some problems, until I used the decimal method. get a python expert to review.
350
emission_rate_per_hour = this_epoch["amt_per_hr"]
351
global_yield_this_epoch = delta.seconds * getEmissionRatePerSecond(
352
emission_rate_per_hour
353
)
354
decimal_converter_var.set(pct_share_of_stake)
355
pct_share_of_stake = decimal_converter_var.get()
356
deposit_yield_this_epoch = (
357
global_yield_this_epoch * pct_share_of_stake * time_step_multiplier
358
)
359
y += deposit_yield_this_epoch
360
361
this_epoch_index += 1
362
363
return y
364
365
366
def fitTimeToRange(time: Any):
367
if time < StartTime.get():
368
time = StartTime.get()
369
elif time > EndTime.get():
370
time = EndTime.get()
371
return time
372
373
374
def getCurrentEpochIndex():
375
current_epoch_index = CurrentEpochIndex.get()
376
return current_epoch_index
377
378
379
def decideIncrementEpoch(new_staked_amount: float):
380
epoch_index = getCurrentEpochIndex()
381
this_epoch = Epochs[epoch_index]
382
this_epoch_staked = this_epoch["staked"]
383
delta = now - this_epoch["time"]
384
delta_seconds = delta.seconds if delta.seconds > 0 else 0
385
if (
386
delta_seconds >= EpochMinTime.get()
387
or this_epoch_staked is 0
388
or maxStakedChangeRatioExceeded(
389
new_staked_amount=new_staked_amount, this_epoch_staked=this_epoch_staked
390
)
391
):
392
epoch_index = incrementEpoch(new_staked_amount)
393
return epoch_index
394
395
396
def maxStakedChangeRatioExceeded(new_staked_amount: float, this_epoch_staked: float):
397
smaller = (
398
new_staked_amount
399
if new_staked_amount <= this_epoch_staked
400
else this_epoch_staked
401
)
402
bigger = (
403
new_staked_amount
404
if new_staked_amount >= this_epoch_staked
405
else this_epoch_staked
406
)
407
dif = bigger - smaller
408
if this_epoch_staked < 0.0001:
409
return true
410
return (dif) / this_epoch_staked >= EpochMaxRatioIncrease.get()
411
412
413
def incrementEpoch(new_staked_amount: float):
414
current_epoch = CurrentEpochIndex.get()
415
new_epoch_idx = current_epoch + 1
416
CurrentEpochIndex.set(new_epoch_idx)
417
Epochs[new_epoch_idx] = {
418
"time": now,
419
"staked": new_staked_amount,
420
"amt_per_hr": Epochs[current_epoch]["amt_per_hr"],
421
}
422
return new_epoch_idx
423
424
425
@export
426
def changeAmountPerHour(amount_per_hour: float):
427
assertOwner()
428
current_epoch = getCurrentEpochIndex()
429
new_epoch_idx = current_epoch + 1
430
CurrentEpochIndex.set(new_epoch_idx)
431
setEmissionRatePerHour(amount=amount_per_hour)
432
433
Epochs[new_epoch_idx] = {
434
"time": now,
435
"staked": StakedBalance.get(),
436
"amt_per_hr": amount_per_hour,
437
}
438
439
440
@export
441
def setEpochMinTime(min_seconds: float):
442
assertOwner()
443
assert min_seconds >= 0, "you must choose a positive value."
444
EpochMinTime.set(min_seconds)
445
446
447
@export
448
def setEpochMaxRatioIncrease(ratio: float):
449
assertOwner()
450
assert ratio > 0, "must be a positive value"
451
EpochMaxRatioIncrease.set(ratio)
452
453
454
def getEmissionRatePerSecond(emission_rate_per_hour: float):
455
emission_rate_per_minute = emission_rate_per_hour / 60
456
emission_rate_per_second = emission_rate_per_minute / 60
457
return emission_rate_per_second
458
459
460
@export
461
def setOwner(vk: str):
462
assertOwner()
463
Owner.set(vk)
464
465
466
@export
467
def setDevWallet(vk: str):
468
assertOwner()
469
DevRewardWallet.set(vk)
470
471
472
@export
473
def setDevRewardPct(amount: float):
474
assertOwner()
475
assert amount < 1 and amount >= 0, "Amount must be a value between 0 and 1"
476
DevRewardPct.set(amount)
477
478
479
def setEmissionRatePerHour(amount: float):
480
assertOwner()
481
EmissionRatePerHour.set(amount)
482
483
484
@export
485
def addToTrustedExporters(contract: str):
486
assertOwner()
487
trusted_exporters = TrustedExporters.get()
488
if contract in trusted_exporters:
489
return
490
trusted_exporters.append(contract)
491
TrustedExporters.set(trusted_exporters)
492
493
494
@export
495
def removeFromTrustedExporters(contract: str):
496
assertOwner()
497
trusted_exporters = TrustedExporters.get()
498
trusted_exporters.remove(contract)
499
TrustedExporters.set(trusted_exporters)
500
501
502
@export
503
def recoverYieldToken():
504
assertOwner()
505
staked_balance = StakedBalance.get()
506
yield_balances = ForeignHash(
507
foreign_contract=meta["YIELD_TOKEN"], foreign_name="balances"
508
)
509
total_in_contract = yield_balances[ctx.this]
510
total_available = total_in_contract - staked_balance
511
YIELD_TOKEN.transfer(amount=total_available, to=Owner.get())
512
513
514
@export
515
def allowStaking(is_open: bool):
516
assertOwner()
517
OpenForBusiness.set(is_open)
518
519
520
@export
521
def setStartTime(year: int, month: int, day: int, hour: int):
522
assertOwner()
523
time = datetime.datetime(year, month, day, hour)
524
StartTime.set(time)
525
526
527
@export
528
def setEndTime(year: int, month: int, day: int, hour: int):
529
assertOwner()
530
time = datetime.datetime(year, month, day, hour)
531
EndTime.set(time)
532
533
534
def assertOwner():
535
assert Owner.get() == ctx.caller, "You must be the owner to call this function."
536
537
538
# This is only to be called in emergencies - the user will forgo their yield when calling this FN.
539
540
541
@export
542
def emergencyReturnStake():
543
544
user = ctx.caller
545
deposit = Deposits[user]
546
547
assert Deposits[user] is not False, "This account has no deposits to return."
548
549
stake_to_return = 0
550
551
stake_to_return += deposit["amount"]
552
553
STAKING_TOKEN.transfer(to=user, amount=stake_to_return)
554
returnAndBurnVToken(amount=stake_to_return)
555
Deposits[user] = False
556
Withdrawals[user] = 0
557
558
# Remove token amount from Staked
559
new_staked_amount = StakedBalance.get() - stake_to_return
560
StakedBalance.set(new_staked_amount)
561
decideIncrementEpoch(new_staked_amount=new_staked_amount)
562
563
564
@export
565
def toggleTimeRamp(on: bool):
566
assertOwner()
567
UseTimeRamp.set(on)
568
569
570
def findTimeRampStep(days: int):
571
time_ramps = TimeRampValues.get()
572
step = None
573
for s in time_ramps:
574
if s["lower"] <= days and s["upper"] > days:
575
step = s
576
if step is None:
577
return time_ramps[len(time_ramps) - 1]["multiplier"]
578
return step["multiplier"]
579
580
581
@export
582
def setTimeRampValues(data: list):
583
assertOwner()
584
TimeRampValues.set(data)
585
586
587
# VTOKEN METHODS
588
@export
589
def transfer(amount: float, to: str):
590
assert amount > 0, "Cannot send negative balances!"
591
assert balances[ctx.caller] >= amount, "Not enough VTOKENS to send!"
592
balances[ctx.caller] -= amount
593
balances[to] += amount
594
595
596
@export
597
def approve(amount: float, to: str):
598
assert amount > 0, "Cannot send negative balances!"
599
balances[ctx.caller, to] += amount
600
601
602
@export
603
def transfer_from(amount: float, to: str, main_account: str):
604
assert amount > 0, "Cannot send negative balances!"
605
606
assert (
607
balances[main_account, ctx.caller] >= amount
608
), "Not enough coins approved to send! You have {} and are trying to spend {}".format(
609
balances[main_account, ctx.caller], amount
610
)
611
assert balances[main_account] >= amount, "Not enough coins to send!"
612
balances[main_account, ctx.caller] -= amount
613
balances[main_account] -= amount
614
balances[to] += amount
615
616
617
def returnAndBurnVToken(amount: float):
618
user = ctx.caller
619
assert (
620
balances[user] >= amount
621
), "Your VTOKEN balance is too low to unstake, recover your VTOKENS and try again."
622
balances[user] -= amount
623
624
625
def mintVToken(amount: float):
626
user = ctx.signer
627
balances[user] += amount
Byte Code
e3000000000000000000000000060000004000000073da030000640064016c005a0065015a0265005a0365005a0465056402640364048d025a0665056402640564048d025a0765056402640664048d025a0865056402640764048d025a0965056402640864048d025a0a65056402640964048d025a0b65056402640a64048d025a0c650d640b6402640c640d8d035a0e650d64006402640e640d8d035a0f65056402640f64048d025a10650d640b64026410640d8d035a1165056402641164048d025a1265056402641264048d025a1365056402641364048d025a1465056402641464048d025a15650d640b64026415640d8d035a1665056402641664048d025a1765056402641764048d025a1865056402641864048d025a1965056402641964048d025a1a650d64006402641a640d8d035a1b641b641c84005a1c651d64028301651e641d9c01641e641f840483015a1f651d64028301652064209c0164216422840483015a21651e6520652264239c036424642584045a23651e6520652264239c036426642784045a24651e6520652064289c036429642a84045a25651d64028301651e641d9c01642b642c840483015a26651d64028301642d642e840083015a27642f643084005a28652964319c016432643384045a2a6434643584005a2b651e64369c016437643884045a2c651e651e64399c02643a643b84045a2d651e64369c01643c643d84045a2e651d64028301651e643e9c01643f6440840483015a2f651d64028301651e64419c0164426443840483015a30651d64028301651e64449c0164456446840483015a31651e64479c016448644984045a32651d640283016520644a9c01644b644c840483015a33651d640283016520644a9c01644d644e840483015a34651d64028301651e641d9c01644f6450840483015a35651e641d9c016451645284045a36651d64028301652064209c0164536454840483015a37651d64028301652064209c0164556456840483015a38651d6402830164576458840083015a39651d64028301652264599c01645a645b840483015a3a651d64028301653b653b653b653b645c9c04645d645e840483015a3c651d64028301653b653b653b653b645c9c04645f6460840483015a3d6461646284005a3e651d6402830164636464840083015a3f651d64028301652264659c0164666467840483015a40653b64689c016469646a84045a41651d640283016542646b9c01646c646d840483015a43651d64028301651e6520646e9c02646f6470840483015a44651d64028301651e6520646e9c0264716472840483015a45651d64028301651e6520652064739c0364746475840483015a46651e641d9c016476647784045a47651e641d9c016478647984045a4864015300297ae9000000004eda18636f6e5f7374616b696e675f727377705f696e7465726f70da054f776e65722902da08636f6e7472616374da046e616d65da0f44657652657761726457616c6c6574da13456d697373696f6e52617465506572486f7572da0c446576526577617264506374da09537461727454696d65da07456e6454696d65da0f4f70656e466f72427573696e65737346da084465706f736974732903da0d64656661756c745f76616c756572040000007205000000da0b5769746864726177616c73da1143757272656e7445706f6368496e646578da0645706f636873da0d5374616b656442616c616e6365da1057697468647261776e42616c616e6365da0c45706f63684d696e54696d65da1545706f63684d6178526174696f496e637265617365da046d657461da15646563696d616c5f636f6e7665727465725f766172da0e54696d6552616d7056616c756573da0b55736554696d6552616d70da10547275737465644578706f7274657273da0862616c616e636573630000000000000000000000000e00000043000000737201000074006a0174026a038301010074046a0174026a038301010074056a0164018301010074066a0164018301010074076a0164018301010074086a0164248301010074096a01640183010100740a6a01640483010100740b6a01670083010100740c6a0164016402740d6405830164069c0364026403740d6407830164069c0364036408740d6409830164069c036408640a740d640b830164069c03640a640c740d640d830164069c03640c640e740d640f830164069c03640e6410740d6411830164069c0364106412740d6413830164069c0364126414740d6415830164069c0364146416640264069c03670a83010100740e6401641764189c03740f64013c0064197410641a3c00641b7410641c3c00641d7410641e3c00641d7410641f3c0074116a0164178301010074126a0164258301010074136a0174146a14642064106421640164228d048301010074156a0174146a146423640c640a640164228d048301010074166a016404830101006400530029264e7201000000e901000000e902000000547a03302e312903da056c6f776572da057570706572da0a6d756c7469706c6965727a03302e32e9030000007a03302e33e9040000007a03302e34e9050000007a03302e35e9060000007a03302e36e9070000007a03302e37e9080000007a03302e38e9090000007a03302e39e90a00000069450a00002903da0474696d65da067374616b6564da0a616d745f7065725f68727a05302e302e32da0776657273696f6eda287374616b696e675f736d6172745f65706f63685f636f6d706f756e64696e675f74696d6572616d70da0474797065da0f636f6e5f727377705f6c7374303031da0d5354414b494e475f544f4b454eda0b5949454c445f544f4b454e69e5070000e90c0000002904da0479656172da056d6f6e7468da03646179da04686f757269e607000067000000000000e03f679a9999999999b93f2917da075f5f4f776e6572da03736574da03637478da0663616c6c6572da115f5f44657652657761726457616c6c6574da135f5f43757272656e7445706f6368496e646578da0f5f5f5374616b656442616c616e6365da125f5f57697468647261776e42616c616e6365da175f5f45706f63684d6178526174696f496e637265617365da0e5f5f45706f63684d696e54696d65da0d5f5f55736554696d6552616d70da125f5f547275737465644578706f7274657273da105f5f54696d6552616d7056616c756573da07646563696d616cda036e6f77da085f5f45706f636873da065f5f6d657461da155f5f456d697373696f6e52617465506572486f7572da0e5f5f446576526577617264506374da0b5f5f537461727454696d65da086461746574696d65da095f5f456e6454696d65da115f5f4f70656e466f72427573696e657373a900724d000000724d000000da00da045f5f5f5f2e000000733a00000000010c010c010a010a010a010a010a010a010a010a011601100110010e010e010e010e010e010c01100108010801080108010a010a0118011801724f0000002901da06616d6f756e74630100000000000000030000000500000043000000733600000074006a017d0174027c0119007d027c0264016b08722474037c006402640164038d03530074047c006402640164038d0353006400530029044e46723900000029037250000000da08757365725f637478da0d66726f6d5f636f6e7472616374290572380000007239000000da0a5f5f4465706f73697473da125f5f6372656174654e65774465706f736974da115f5f696e6372656173654465706f73697429037250000000da0475736572da076465706f736974724d000000724d000000724e000000da106164645374616b696e67546f6b656e734e000000730e0000000002060108010801060108020601725800000029017204000000630100000000000000050000000500000043000000735c0000007c0074006a0183006b067314740264018301820174036a047c0083017d017c016a0583007d0274066a077d0374087c0319007d047c0464026b08724a74097c026403640464058d035300740a7c026403640464058d0353006400530029064e7a3254686520636f6e7472616374206973206e6f7420696e207468652074727573746564206578706f7274657273206c6973742e467239000000542903725000000072510000007252000000290b7241000000da03676574da0e417373657274696f6e4572726f72da0149da0d696d706f72745f6d6f64756c65da1c6578706f72745969656c64546f466f726569676e436f6e74726163747238000000da067369676e657272530000007254000000725500000029057204000000da0e7969656c645f636f6e7472616374725000000072560000007257000000724d000000724d000000724e000000da187374616b6546726f6d436f6e747261637450726f666974735a000000731600000000020e0106010a01080106010801080106010802060172600000002903725000000072510000007252000000630300000000000000070000000500000043000000738a00000074006a01830064016b02731474026402830182017c0064036b047324740264048301820174036a047d037c0264056b08724474056a067c0074036a077c0364068d03010074086a0183007d047c047c0017007d0574086a097c0583010100740a7c0564078d017d067c06740b7c0064089c03740c7c033c00740d7c0064098d010100740c7c0319005300290a4e547a2854686973207374616b696e6720706f6f6c206973206e6f74206f70656e207269676874206e6f772e72010000007a19596f75206d757374207374616b6520736f6d657468696e672e4629037250000000da02746fda0c6d61696e5f6163636f756e742901da116e65775f7374616b65645f616d6f756e742903da0e7374617274696e675f65706f63687228000000725000000029017250000000290e724c0000007259000000725a00000072380000007239000000722f000000da0d7472616e736665725f66726f6dda0474686973723c0000007237000000da165f5f646563696465496e6372656d656e7445706f636872440000007253000000da0c5f5f6d696e7456546f6b656e2907725000000072510000007252000000725600000072290000007263000000da0b65706f63685f696e646578724d000000724d000000724e00000072540000006a000000731e000000000106010e011001060108010a010801080108010a010a0104010c010a0172540000006303000000000000000e000000060000004300000073600100007c0164016b08720e74006a016e0474006a027d0374036a04830064026b02732874056403830182017c0064046b057338740564058301820174067c0319007d047c0464066b09735074056407830182017c0064046b0472727c0264066b08727274076a087c0074006a097c0364088d030100740a7c0319007d0564047d0664047d0764047d087c06740b7c0464098d0137007d067c04640a19007d097c04640b19007d077c067c0538007d067c0664046b0472e27c06740c6a04830014007d0a7c0a64046b0472da740d6a0e740f6a0483007c0a640c8d0201007c067c0a18007d087c087c0717007c0017007d0b74106a0483007d0c7c0c7c0817007c0017007d0d74106a117c0d8301010074126a1174126a0483007c0617008301010074137c087c001700640d8d0101006404740a7c033c0074147c0d640e8d017c097c0b74157416830174157c0983011800640f9c0474067c033c0074067c031900530029104e7239000000547a2854686973207374616b696e6720706f6f6c206973206e6f74206f70656e207269676874206e6f772e72010000007a24596f752063616e6e6f74207374616b652061206e656761746976652062616c616e63652e467a2354686973207573657220686173206e6f206465706f73697420746f2061646420746f2e2903725000000072610000007262000000290172570000007228000000725000000029027261000000725000000029017250000000290172630000002904726400000072280000007250000000da0b737465705f6f6666736574291772380000007239000000725e000000724c0000007259000000725a0000007253000000722f00000072650000007266000000da0d5f5f5769746864726177616c73da105f5f63616c63756c6174655969656c6472480000007230000000da087472616e73666572723a000000723c0000007237000000723d00000072680000007267000000da105f5f66697454696d65546f52616e67657244000000290e72500000007251000000725200000072560000007257000000da0f77697468647261776e5f7969656c64da107969656c645f746f5f68617276657374da0e6578697374696e675f7374616b65da10757365725f7969656c645f7368617265da126465706f7369745f73746172745f74696d65da096465765f7368617265da14746f74616c5f6465706f7369745f616d6f756e74da14676c6f62616c5f616d6f756e745f7374616b6564da116e65775f676c6f62616c5f7374616b6564724d000000724d000000724e00000072550000007c00000073440000000001140106010e0110010801100110010a01080108010401040104010e0108010801080108010c010801120108010c0108010c010a0112010e0108010201080108011201725500000029037250000000da0674617267657472560000006303000000000000000a000000040000004300000073bc00000074007c0219007d037c0364016b097318740164028301820174027c0219007d0464037d057c0574037c0364048d0137007d057c057c0438007d057c007c056b0072467c006e027c057d067c0664036b04735a74016405830182017c0674046a05830014007d077c0764036b04728074066a0774086a0583007c0764068d0201007c067c0718007d0874066a077c017c0864068d0201007c047c06170074027c023c0074096a0583007c0617007d0974096a0a7c09830101007c08530029074e467a2b596f752068617665206e6f206465706f73697420746f207769746864726177207969656c642066726f6d2e7201000000290172570000007a295468657265206973206e6f207969656c6420746f2068617276657374207269676874206e6f77203a28290272610000007250000000290b7253000000725a000000726b000000726c000000724800000072590000007230000000726d000000723a000000723d0000007237000000290a7250000000727800000072560000007257000000726f000000da116861727665737461626c655f7969656c6472700000007274000000da0a757365725f7368617265da146e65775f77697468647261776e5f616d6f756e74724d000000724d000000724e000000da135f5f73656e645969656c64546f546172676574a10000007324000000000108011001080104010e0108010c01040110010c010801120108010e010c010c010a01727c00000063010000000000000002000000050000004300000073240000007c0064016b047310740064028301820174016a027d0174037c007c017c0164038d03530029044e72010000007a25596f752063616e6e6f7420686172766573742061206e656761746976652062616c616e636529037250000000727800000072560000002904725a00000072380000007239000000727c000000290272500000007256000000724d000000724d000000724e000000da0d77697468647261775969656c64b60000007306000000000210010601727d00000063000000000000000009000000040000004300000073fa00000074006a017d0074027c0019007d017c0164016b09731e740364028301820174047c0019007d0264037d0364037d0464037d057c0474057c0164048d0137007d047c037c016405190037007d0374066a077c007c0364068d02010074087c0364078d0101007c047c0238007d047c0464036b0472b07c0474096a0a830014007d067c0664036b04729a740b6a07740c6a0a83007c0664068d0201007c047c0618007d05740b6a077c007c0564068d020100640174027c003c00640374047c003c00740d6a0a83007c0318007d07740d6a0e7c0783010100740f6a0a83007c0417007d08740f6a0e7c088301010074107c0764088d0101007c05530029094e467a1f596f752068617665206e6f206465706f73697420746f207769746864726177720100000029017257000000725000000029027261000000725000000029017250000000290172630000002911723800000072390000007253000000725a000000726b000000726c000000722f000000726d000000da155f5f72657475726e416e644275726e56546f6b656e724800000072590000007230000000723a000000723c0000007237000000723d0000007267000000290972560000007257000000726f000000da0f7374616b655f746f5f72657475726e7270000000727a00000072740000007263000000727b000000724d000000724d000000724e000000da167769746864726177546f6b656e73416e645969656c64bd0000007334000000000206010801100108010401040104010e010c010e010a01080108010c010801120108010e01080108010c010a010c010a010a01728000000063010000000000000011000000040000004300000073860100007c006a00640183017d017c006a00640283017d027c006a00640383017d037c006a00640483017d047c0464006b09723a7c027c0417007d026e087401740118007d04740283007d057c017d0664057d0764067d089001782a7c067c056b019001728074037c0619007d0974037c066406170019007d0a74046a00830072a074057401830174057c0964021900830118007c0417007d0b74067c0b6a0783017d0864057d0c7c017c056b0272be74057401830174057c02830118007d0c6e547c067c016b0272dc74057c0a64021900830174057c02830118007d0c6e367c067c056b0272fa74057401830174057c0964021900830118007d0c6e1874057c0a64021900830174057c0964021900830118007d0c64057d0d7c0364056b099001723a7c096407190064056b099001723a7c037c09640719001b007d0d7c09640819007d0e7c0c6a0874097c0e830114007d0f740a6a0b7c0d83010100740a6a0083007d0d7c0f7c0d14007c0814007d107c077c1037007d077c06640637007d06715857007c07530029094e726400000072280000007250000000726a0000007201000000721b0000007229000000722a000000290c72590000007244000000da165f5f67657443757272656e7445706f6368496e64657872450000007240000000726e000000da125f5f66696e6454696d6552616d7053746570da0464617973da077365636f6e6473da1a5f5f676574456d697373696f6e526174655065725365636f6e64da175f5f646563696d616c5f636f6e7665727465725f766172723700000029117257000000da147374617274696e675f65706f63685f696e64657872730000007250000000726a000000da1363757272656e745f65706f63685f696e646578da10746869735f65706f63685f696e646578da0179da1474696d655f737465705f6d756c7469706c696572da0a746869735f65706f6368da0a6e6578745f65706f6368da0f74696d655f72616d705f64656c7461da0564656c7461da127063745f73686172655f6f665f7374616b65da16656d697373696f6e5f726174655f7065725f686f7572da17676c6f62616c5f7969656c645f746869735f65706f6368da186465706f7369745f7969656c645f746869735f65706f6368724d000000724d000000724e000000726c000000db000000734e00000000010a010a010a010a0108010a02080106010401040104010e0108010c01080218010a0104010801120208010c010a01080116030c010c01040118010c010801060108010a0108020c0108010c01726c00000029017228000000630100000000000000010000000200000043000000732e0000007c0074006a0183006b00721674006a0183007d006e147c0074026a0183006b04722a74026a0183007d007c00530029014e290372490000007259000000724b00000029017228000000724d000000724d000000724e000000726e0000000b010000730a00000000010c010a010c010801726e000000630000000000000000010000000100000043000000730c00000074006a0183007d007c00530029014e2902723b000000725900000029017288000000724d000000724d000000724e0000007281000000130100007304000000000108017281000000290172630000006301000000000000000600000004000000430000007362000000740083007d0174017c0119007d027c02640119007d0374027c026402190018007d047c046a0364036b0472327c046a036e0264037d057c0574046a0583006b0573567c0364036b08735674067c007c0364048d02725e74077c0083017d017c01530029054e72290000007228000000720100000029027263000000da11746869735f65706f63685f7374616b656429087281000000724500000072440000007284000000723f0000007259000000da1e5f5f6d61785374616b65644368616e6765526174696f4578636565646564da105f5f696e6372656d656e7445706f6368290672630000007269000000728c0000007294000000728f000000da0d64656c74615f7365636f6e6473724d000000724d000000724e000000726700000018010000731600000000010601080108010c0114010c010a01020108010801726700000029027263000000729400000063020000000000000005000000030000004300000073480000007c007c016b01720c7c006e027c017d027c007c016b05721c7c006e027c017d037c037c0218007d047c017400640183016b007238740153007c047c011b0074026a0383006b05530029024e7a06302e3030303129047243000000da0474727565723e0000007259000000290572630000007294000000da07736d616c6c6572da06626967676572da03646966724d000000724d000000724e000000729500000026010000731000000000020c0104010c01040108010c0104017295000000630100000000000000030000000400000043000000733600000074006a0183007d017c01640117007d0274006a027c028301010074037c0074047c0119006402190064039c0374047c023c007c02530029044e721b000000722a000000290372280000007229000000722a0000002905723b000000725900000072370000007244000000724500000029037263000000da0d63757272656e745f65706f6368da0d6e65775f65706f63685f696478724d000000724d000000724e000000729600000032010000730c0000000001080108010a010401140172960000002901da0f616d6f756e745f7065725f686f75726301000000000000000300000004000000430000007340000000740083000100740183007d017c01640117007d0274026a037c028301010074047c0064028d010100740574066a0783007c0064039c0374087c023c006400530029044e721b00000029017250000000290372280000007229000000722a0000002909da0d5f5f6173736572744f776e65727281000000723b0000007237000000da185f5f736574456d697373696f6e52617465506572486f75727244000000723c000000725900000072450000002903729e000000729c000000729d000000724d000000724d000000724e000000da136368616e6765416d6f756e74506572486f75723b010000730e00000000020601060108010a010a01080172a10000002901da0b6d696e5f7365636f6e647363010000000000000001000000020000004300000073240000007400830001007c0064016b057316740164028301820174026a037c00830101006400530029034e72010000007a21796f75206d7573742063686f6f7365206120706f7369746976652076616c75652e2904729f000000725a000000723f0000007237000000290172a2000000724d000000724d000000724e000000da0f73657445706f63684d696e54696d6546010000730600000000020601100172a30000002901da05726174696f63010000000000000001000000020000004300000073240000007400830001007c0064016b047316740164028301820174026a037c00830101006400530029034e72010000007a186d757374206265206120706f7369746976652076616c75652904729f000000725a000000723e0000007237000000290172a4000000724d000000724d000000724e000000da1873657445706f63684d6178526174696f496e6372656173654d010000730600000000020601100172a50000002901729100000063010000000000000003000000020000004300000073140000007c0064011b007d017c0164011b007d027c02530029024ee93c000000724d00000029037291000000da18656d697373696f6e5f726174655f7065725f6d696e757465da18656d697373696f6e5f726174655f7065725f7365636f6e64724d000000724d000000724e000000728500000054010000730600000000010801080172850000002901da02766b630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e2903729f00000072360000007237000000290172a9000000724d000000724d000000724e000000da087365744f776e65725a01000073040000000002060172aa000000630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e2903729f000000723a0000007237000000290172a9000000724d000000724d000000724e000000da0c73657444657657616c6c65746001000073040000000002060172ab000000630100000000000000010000000200000043000000732c0000007400830001007c0064016b0072167c0064026b05731e740164038301820174026a037c00830101006400530029044e721b00000072010000007a26416d6f756e74206d75737420626520612076616c7565206265747765656e203020616e6420312904729f000000725a0000007248000000723700000029017250000000724d000000724d000000724e000000da0f73657444657652657761726450637466010000730600000000020601180172ac000000630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e2903729f0000007247000000723700000029017250000000724d000000724d000000724e00000072a00000006d01000073040000000001060172a0000000630100000000000000020000000200000043000000733200000074008300010074016a0283007d017c007c016b06721a640053007c016a037c008301010074016a047c01830101006400530029014e2905729f00000072410000007259000000da06617070656e64723700000029027204000000da11747275737465645f6578706f7274657273724d000000724d000000724e000000da15616464546f547275737465644578706f727465727372010000730c000000000206010801080104010a0172af000000630100000000000000020000000200000043000000732600000074008300010074016a0283007d017c016a037c008301010074016a047c01830101006400530029014e2905729f00000072410000007259000000da0672656d6f766572370000002902720400000072ae000000724d000000724d000000724e000000da1a72656d6f766546726f6d547275737465644578706f72746572737c01000073080000000002060108010a0172b1000000630000000000000000040000000600000043000000734a00000074008300010074016a0283007d00740374046401190064026403640464058d047d017c0174056a0619007d027c027c0018007d0374076a087c0374096a02830064068d0201006400530029074e7230000000721a0000007202000000da0e7969656c645f62616c616e6365732904da10666f726569676e5f636f6e7472616374da0c666f726569676e5f6e616d6572040000007205000000290272500000007261000000290a729f000000723c0000007259000000da0b466f726569676e486173687246000000723800000072660000007230000000726d00000072360000002904da0e7374616b65645f62616c616e6365da105f5f7969656c645f62616c616e636573da11746f74616c5f696e5f636f6e7472616374da0f746f74616c5f617661696c61626c65724d000000724d000000724e000000da117265636f7665725969656c64546f6b656e8401000073100000000002060108010801040108010a01080172ba0000002901da0769735f6f70656e630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e2903729f000000724c0000007237000000290172bb000000724d000000724d000000724e000000da0c616c6c6f775374616b696e679001000073040000000002060172bc00000029047232000000723300000072340000007235000000630400000000000000050000000500000043000000732400000074008300010074016a017c007c017c027c0383047d0474026a037c04830101006400530029014e2904729f000000724a00000072490000007237000000290572320000007233000000723400000072350000007228000000724d000000724d000000724e000000da0c736574537461727454696d6596010000730600000000020601100172bd000000630400000000000000050000000500000043000000732400000074008300010074016a017c007c017c027c0383047d0474026a037c04830101006400530029014e2904729f000000724a000000724b0000007237000000290572320000007233000000723400000072350000007228000000724d000000724d000000724e000000da0a736574456e6454696d659d010000730600000000020601100172be000000630000000000000000000000000200000043000000731a00000074006a01830074026a036b02731674046401830182016400530029024e7a2c596f75206d75737420626520746865206f776e657220746f2063616c6c20746869732066756e6374696f6e2e29057236000000725900000072380000007239000000725a000000724d000000724d000000724d000000724e000000729f000000a4010000730400000000010601729f000000630000000000000000040000000400000043000000737e00000074006a017d0074027c0019007d0174027c00190064016b097322740364028301820164037d027c027c016404190037007d0274046a057c007c0264058d02010074067c0264068d010100640174027c003c00640374077c003c0074086a0983007c0218007d0374086a0a7c0383010100740b7c0364078d0101006400530029084e467a2754686973206163636f756e7420686173206e6f206465706f7369747320746f2072657475726e2e720100000072500000002902726100000072500000002901725000000029017263000000290c723800000072390000007253000000725a000000722f000000726d000000727e000000726b000000723c000000725900000072370000007267000000290472560000007257000000727f0000007263000000724d000000724d000000724e000000da14656d657267656e637952657475726e5374616b65a9010000731a00000000020601080106010e0104010c010e010a01080108010c010a0172bf0000002901da026f6e630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e2903729f00000072400000007237000000290172c0000000724d000000724d000000724e000000da0e746f67676c6554696d6552616d70ba01000073040000000002060172c100000029017283000000630100000000000000040000000300000043000000735a00000074006a0183007d0164007d0278287c0144005d207d037c03640119007c006b0172127c03640219007c006b0472127c037d02711257007c0264006b0872527c0174027c0183016403180019006404190053007c0264041900530029054e721d000000721e000000721b000000721f000000290372420000007259000000da036c656e29047283000000da0a74696d655f72616d7073da0473746570da0173724d000000724d000000724e0000007282000000c001000073100000000001080104010a01180108010801140172820000002901da0464617461630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e2903729f00000072420000007237000000290172c6000000724d000000724d000000724e000000da1173657454696d6552616d7056616c756573cb01000073040000000002060172c7000000290272500000007261000000630200000000000000020000000400000043000000734c0000007c0064016b0473107400640283018201740174026a0319007c006b0573267400640383018201740174026a03050019007c00380003003c0074017c01050019007c00370003003c006400530029044e72010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e636573217a1b4e6f7420656e6f7567682056544f4b454e5320746f2073656e64212904725a000000da0a5f5f62616c616e63657372380000007239000000290272500000007261000000724d000000724d000000724e000000726d000000d101000073080000000002100116011201726d000000630200000000000000020000000400000043000000732a0000007c0064016b0473107400640283018201740174026a037c016602050019007c00370003003c006400530029034e72010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e636573212904725a00000072c800000072380000007239000000290272500000007261000000724d000000724d000000724e000000da07617070726f7665d901000073040000000002100172c90000002903725000000072610000007262000000630300000000000000030000000500000043000000738a0000007c0064016b047310740064028301820174017c0274026a03660219007c006b05733c740064036a0474017c0274026a03660219007c0083028301820174017c0219007c006b057350740064048301820174017c0274026a036602050019007c00380003003c0074017c02050019007c00380003003c0074017c01050019007c00370003003c006400530029054e72010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e636573217a494e6f7420656e6f75676820636f696e7320617070726f76656420746f2073656e642120596f752068617665207b7d20616e642061726520747279696e6720746f207370656e64207b7d7a194e6f7420656e6f75676820636f696e7320746f2073656e64212905725a00000072c800000072380000007239000000da06666f726d61742903725000000072610000007262000000724d000000724d000000724e0000007265000000df0100007310000000000210010c010c0114011401160110017265000000630100000000000000020000000400000043000000732e00000074006a017d0174027c0119007c006b05731a740364018301820174027c01050019007c00380003003c006400530029024e7a4e596f75722056544f4b454e2062616c616e636520697320746f6f206c6f7720746f20756e7374616b652c207265636f76657220796f75722056544f4b454e5320616e642074727920616761696e2e29047238000000723900000072c8000000725a000000290272500000007256000000724d000000724d000000724e000000727e000000eb01000073080000000001060106010e01727e000000630100000000000000020000000400000043000000731a00000074006a017d0174027c01050019007c00370003003c006400530029014e29037238000000725e00000072c8000000290272500000007256000000724d000000724d000000724e0000007268000000f201000073040000000001060172680000002949722e000000da09696d706f72746c6962725b000000722f0000007230000000da085661726961626c657236000000723a000000724700000072480000007249000000724b000000724c000000da04486173687253000000726b000000723b0000007245000000723c000000723d000000723f000000723e0000007246000000728600000072420000007240000000724100000072c8000000724f000000da085f5f6578706f7274da05666c6f61747258000000da037374727260000000da04626f6f6c72540000007255000000727c000000727d0000007280000000726c000000da03416e79726e000000728100000072670000007295000000729600000072a100000072a300000072a5000000728500000072aa00000072ab00000072ac00000072a000000072af00000072b100000072ba00000072bc000000da03696e7472bd00000072be000000729f00000072bf00000072c10000007282000000da046c69737472c7000000726d00000072c90000007265000000727e0000007268000000724d000000724d000000724d000000724e000000da083c6d6f64756c653e0100000073c800000008010401040104010c010401080104010801040108010c010c0104010801060108010601080104010801060108010401080104010801040108010401080106010801040108010401080104010801040108010601080308200601100b0601100f12121225121506011006101e08300e0808050e0e02010e0b0e090601100a06011006060110060e060601100506011005060110060e050601100906011007100c06011005060116060601160608051011060110050e0b0601100506011207060112050601140b0e07