Skip to content

Instantly share code, notes, and snippets.

@zwegner
Last active September 7, 2020 08:36
Show Gist options
  • Save zwegner/d17c27067b3a7a449567f46476739d56 to your computer and use it in GitHub Desktop.
Save zwegner/d17c27067b3a7a449567f46476739d56 to your computer and use it in GitHub Desktop.
A tool for measuring the performance of false dependencies in store forwarding
# Test address matching in store forwarding
#
# This tests a mechanism discussed in these references:
#
# * US Patent 2008/0082765 A1
# https://patentimages.storage.googleapis.com/73/b9/bf/b258f3e3985f47/US20080082765A1.pdf
# * Fallout: Leaking Data on Meltdown-resistant CPUs
# https://mdsattacks.com/files/fallout.pdf
# * Stack Overflow: What are the microarchitectural details behind MSBDS (Fallout)?
# https://stackoverflow.com/a/56213609
#
# To get precise performance numbers, we want to set up a test harness that
# has a fairly rigid/deterministic latency, but allows us to control how many
# outstanding stores are in the store buffer.
#
# We do this by combining a chain of long-but-constant latency instructions (here
# a chain of vsqrtpd's, run on zero input) with a series of stores. The stores
# come after the sqrts in the loop, and should all hit the L1D. They will remain in
# the store buffer until the sqrts retire, though, after which they should
# generally retire at 1/cycle. This happens "asynchronously", so as long as the
# store buffer isn't full (causing a stall if another store executes), these
# instructions aren't usually part of the dependency chain.
#
# To tie this all together, and make one long dependency chain across iterations of
# a loop, we add to an address based on the results of the sqrt chain (always
# zero), load from the address into a vector register (giving zero again), and
# use that result for the next chain.
#
# This technique is a variation on/inspired by Henry Wong's technique for measuring
# on-chip buffers: http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/
# Though without the dual pointer-chasing used in his method, this ends up looking
# pretty different, and more like a traditional dependency chain latency test.
# Additionally, I got the idea of using vpsqrtd from Paul Khuong in this tweet:
# https://mobile.twitter.com/pkhuong/status/1265433916791558146
#
# Now that we have the setup, the 'payload' is the pattern of addresses stored to,
# along with the address of the single load in the dependency chain. To measure
# the behavior described in the references above, we want to generate a bunch
# of stores that match the "loosenet" but not the "finenet". For each store in
# the store buffer, a load will try to match with the most recent store that
# has the same low 12 bits. The high address bits are then compared for a
# match, otherwise the load is re-dispatched to match the next older store. The
# number of stores, and their size/scalarity, are controlled by knobs below.
#
# Within this group of stores, we put a single store that does in fact match
# the eventual load from [rbp]. By doing this we can control how many
# re-dispatches take place.
# Number of sqrts in each iteration of the main dependency chain. This number
# times the latency of vsqrtpd(0) in cycles should be larger than the size of
# the store buffer divided by the number of stores per cycle (usually one)
N_SQRTS = 5
# Offset of a falsely-dependent address
# Negative since we store to the stack, which grows downwards
ALIAS_OFFSET = -4096
SCALAR = 1
SIZE = 4
# Compensation factor for rdtsc not counting actual cycles:
# Turbo frequency / base (rdtsc) frequency
# Probably need to change this for other machines...
DETURBO = 2.9 / 2.4
# How many stores to insert (all in the range are tested)
# This should have many values both above and below the size of the store buffer
STORE_COUNTS = range(1, 65, 1)
# How many stores back to put a matching, forward-able store
FWD_INDICES = range(1, 8)
# Generate a C file that calls each function in the assembly
with open('_run.c', 'w') as f:
f.write('#include <stdint.h>\n')
f.write('#include <stdio.h>\n')
f.write('\n')
f.write('const uint64_t count = 1 << 8;\n')
f.write('const uint64_t n_iters = 1 << 11;\n')
f.write('\n')
f.write('int main() {\n')
for n_stores in STORE_COUNTS:
f.write('printf("%02d");\n' % n_stores)
# Call each function for this row, print the results
for fwd_idx in FWD_INDICES:
fn = 'test_store_buffer%02d_%02d' % (n_stores, fwd_idx)
f.write('extern uint64_t %s();\n' % fn)
f.write('printf(",%%10.6f", (float)%s() * %s / n_iters);\n' % (fn, DETURBO))
f.write('puts("");\n')
f.write('fflush(stdout);\n')
f.write('}\n')
# Generate an assembly file with a bunch of test functions
with open('_storebuf.s', 'w') as f:
f.write('''
.intel_syntax noprefix
.global _count
.global _n_iters
''')
for fwd_idx in FWD_INDICES:
for n_stores in STORE_COUNTS:
name = '%02d_%02d' % (n_stores, fwd_idx)
# Generate the store offsets. All but the one at -fwd_idx are
# ALIAS_OFFSET away (provided there are enough stores for fwd_idx
# to exist), each of which should be false dependencies. These offsets
# can be tweaked for fun or profit.
# OK, maybe not profit... and actually, probably not fun either
offsets = [ALIAS_OFFSET for i in range(n_stores)]
if fwd_idx < len(offsets):
offsets[-fwd_idx] = 0
# Generate the actual store instructions based on the SCALAR/SIZE settings
if SCALAR:
if SIZE == 1:
reg = 'r11b'
ptr = 'BYTE'
elif SIZE == 4:
reg = 'r11d'
ptr = 'DWORD'
else:
reg = 'r11'
ptr = 'QWORD'
lines = ['mov %s PTR [rbp+%s], %s' % (ptr, offset, reg) for offset in offsets]
chain = 'vpbroadcast%s ymm0, %s PTR [rbp]' % (ptr[0].lower(), ptr)
else:
reg = 'ymm1'
ptr = 'YMMWORD'
lines = ['vmovdqu %s PTR [rbp+%s], %s' % (ptr, offset, reg) for offset in offsets]
chain = 'vmovdqu ymm0, %s PTR [rbp]' % ptr
lines = '\n '.join(lines)
# Generate chain instructions to link the FP/memory dependency chains.
# Extract the first lane of ymm0 (should always be zero), add it to rbp,
# then load ymm with the value of rbp (also zero; load controlled by SCALAR/SIZE)
chain = ['vpextrq r10, xmm0, 0', 'add rbp, r10', chain]
chain = '\n '.join(chain)
# Generate the main dependency chain: a bunch of expensive but deterministic ops
work = []
work += ['vsqrtpd ymm0, ymm0' for _ in range(N_SQRTS)]
work = '\n '.join(work)
# Push/pop some callee-saved regs just in case
regs = [12, 13, 14, 15]
pushes = '\n'.join('push r%s' % r for r in regs)
pops = '\n'.join('pop r%s' % r for r in regs[::-1])
f.write('''
.global _test_store_buffer{n}
_test_store_buffer{n}:
push rbp
mov rbp,rsp
{pushes}
# Align rbp
sub rbp, 127
and rbp, -32
# Initialize counters etc
mov rcx, [rip+_count]
xor r11, r11
mov r13, -1
vxorps ymm0, ymm0, ymm0
vxorps ymm1, ymm0, ymm0
# Make sure to store 0 at rbp
vmovdqu YMMWORD PTR [rbp], ymm0
# Outer loop
L{n}_1:
# Start counter
rdtsc
mov r8, rdx
shl r8, 32
or r8, rax
# Inner loop
mov r12, [rip+_n_iters]
L{n}_3:
{work}
{lines}
{chain}
sub r12, 1
jnz L{n}_3
# End counter
rdtsc
mov r9, rdx
shl r9, 32
or r9, rax
sub r9, r8
# Update minimum
cmp r13, r9
cmova r13, r9
sub rcx, 1
jnz L{n}_1
# Return minimum
mov rax, r13
{pops}
pop rbp
ret
'''.format(n=name, pushes=pushes, pops=pops, lines=lines, work=work, chain=chain))
01 113.394531 113.401611 113.403381 113.401611 113.396301 113.394531 113.401611 113.390991 113.401611 113.401611 113.394531 113.399841 113.396301 113.394531 113.401611 113.390991 113.385681 113.403381 113.396301 113.394531 113.385681 113.394531 113.401611 113.398071 113.385681 113.401611 113.394531 113.394531 113.396301 113.387451 113.398071
02 106.841919 113.748535 113.741455 113.752075 126.851990 113.737915 113.750305 113.739685 113.741455 113.741455 114.180420 113.737915 113.750305 113.750305 113.743225 113.741455 113.730835 113.739685 113.720215 113.741455 113.750305 126.875000 113.741455 113.741455 113.760925 113.741455 114.183960 113.743225 113.750305 113.743225 113.741455
03 107.411865 114.346802 114.373352 113.773315 114.378662 114.373352 113.791016 114.373352 114.359192 114.360962 114.369812 114.359192 114.373352 114.391052 114.366272 113.792786 114.357422 114.360962 114.371582 114.368042 113.759155 114.373352 114.387512 114.346802 114.368042 114.352112 114.375122 113.775085 113.803406 114.392822 114.383972
04 106.845459 113.146729 113.631714 113.610474 113.610474 113.615784 113.635254 113.622864 113.624634 113.624634 113.606934 113.622864 113.628174 113.615784 113.622864 113.610474 113.617554 113.606934 113.617554 113.631714 113.628174 113.603394 113.621094 113.629944 113.619324 113.626404 113.605164 113.629944 113.626404 113.638794 113.626404
05 106.799438 117.862061 118.437317 118.437317 114.720276 118.440857 118.437317 118.449707 118.437317 118.449707 118.449707 118.455017 118.437317 118.444397 115.097290 118.444397 118.437317 118.437317 118.440857 118.449707 118.447937 118.442627 118.444397 118.439087 118.451477 118.442627 118.439087 118.456787 118.437317 118.449707 132.096558
06 107.277344 113.566223 120.545410 120.725952 120.540100 120.541870 120.547180 120.554260 120.548950 134.463074 134.443604 120.540100 120.540100 120.862244 120.545410 120.196716 120.545410 120.552490 120.561340 120.540100 120.540100 120.885254 120.483459 120.278137 120.540100 120.541870 120.536560 120.531250 120.540100 120.871094 120.543640
07 106.965820 114.208740 120.915344 120.894104 120.892334 120.904724 121.136597 121.147217 121.115356 120.904724 120.897644 121.044556 120.892334 120.864014 121.108276 120.894104 121.115356 120.888794 120.904724 120.681702 120.897644 120.897644 121.127747 120.901184 121.120667 120.888794 120.890564 120.890564 134.882568 120.913574 135.087891
08 106.408264 113.808716 120.734802 120.725952 120.748962 120.734802 120.757812 120.724182 120.764893 120.738342 120.295837 120.733032 120.771973 120.743652 120.729492 120.724182 120.761353 120.724182 120.720642 120.759583 120.738342 120.748962 120.724182 120.733032 120.733032 120.740112 120.745422 120.738342 134.647156 120.743652 120.233887
09 107.064941 114.040588 120.929504 121.035706 121.026855 121.044556 120.784363 121.076416 121.056946 121.067566 121.028625 121.046326 121.051636 121.035706 121.058716 121.053406 121.037476 121.012695 121.028625 121.026855 121.035706 121.039246 121.053406 121.042786 121.062256 121.019775 121.021545 121.035706 121.026855 121.028625 121.055176
10 106.973343 114.210846 121.464500 121.467262 121.466934 121.468704 121.465050 121.442810 121.448120 121.456970 135.443665 121.442810 121.442810 121.442810 121.430420 121.426880 121.421570 121.456970 121.416260 121.444580 121.421570 121.441040 135.408264 121.572021 121.442810 121.419800 121.423340 121.442810 121.402100 121.442810 121.442810
11 106.988724 113.971115 121.356972 121.345795 121.355087 121.356415 121.352547 121.304749 121.354309 121.352539 135.310913 121.325989 121.325989 121.348999 121.290588 121.304749 121.315369 121.308289 121.315369 121.329529 121.295898 121.341919 135.291443 121.315369 121.325989 121.338379 121.304749 121.325989 121.338379 121.327759 121.327759
12 107.079987 113.766899 125.406883 125.632118 125.855804 125.857910 125.858681 125.825378 125.830688 125.855469 125.848389 125.825378 125.825378 125.843079 125.830688 125.827148 125.857239 125.827148 125.823608 125.832458 125.600586 125.113831 137.891602 125.736877 125.641296 125.789978 125.830688 125.825378 125.830688 125.839539 125.540405
13 107.776382 113.734154 125.512093 125.937004 125.932358 125.929703 125.929703 125.924500 124.327942 125.919189 140.443970 125.924500 125.917419 125.917419 125.912109 125.920959 125.922729 125.912109 125.912109 125.912109 125.938660 127.662659 138.865112 139.617371 125.227112 125.487305 124.873108 125.903259 125.901489 125.936890 125.827148
14 107.233429 113.674751 120.740784 127.864006 127.831367 127.870087 127.845528 127.836121 127.839661 127.864441 142.598083 127.827271 127.846741 127.846741 127.846741 127.841431 127.855591 127.837891 127.841431 127.841431 127.846741 128.361816 142.594543 127.846741 127.836121 127.846741 127.846741 127.862671 127.837891 127.866211 127.834351
15 106.684830 113.724533 120.651619 127.628593 127.626266 127.627045 127.620186 127.606018 127.602478 127.636108 142.337891 127.611328 127.616638 127.630798 127.430786 127.614868 127.614868 127.616638 127.614868 127.609558 127.616638 127.616638 142.321960 127.616638 127.613098 127.616638 127.614868 127.616638 127.613098 127.616638 127.597168
16 106.705963 113.354706 120.644318 127.640541 127.004662 127.639435 127.637550 127.627258 127.629028 127.639648 142.337891 127.618408 127.632568 127.636108 127.611328 127.630798 127.637878 127.618408 127.616638 127.614868 127.632568 127.632568 142.364441 127.629028 127.634338 127.632568 127.639648 127.627258 127.623718 127.614868 127.629028
17 106.733841 113.317207 120.296951 127.289520 127.291512 127.289520 127.289520 127.283875 127.275024 127.290955 141.971497 127.290955 127.290955 127.283875 127.283875 127.283875 127.283875 127.280334 127.283875 127.283875 127.283875 127.303345 141.966187 127.283875 127.278564 127.283875 127.283875 127.283875 127.278564 127.278564 127.289185
18 106.022957 113.120956 120.035538 127.022026 127.064400 127.004326 127.011078 127.313965 127.321045 127.331665 141.721924 127.317505 127.052002 127.283875 127.319275 127.052002 127.312195 127.317505 127.336975 127.301575 127.319275 127.328125 141.813965 127.326355 127.259094 127.331665 127.312195 127.328125 127.326355 127.313965 127.296265
19 106.859291 113.333580 120.318520 132.159393 132.319580 132.279541 132.266922 132.300110 132.303650 132.416931 147.548828 132.273560 132.301880 132.301880 132.312500 132.301880 132.287720 132.301880 132.310730 132.301880 132.284180 132.317810 147.555908 132.294800 131.636353 132.291260 132.301880 132.300110 132.294800 131.333679 132.284180
20 106.919029 113.352272 120.352814 132.332306 132.352997 132.304657 132.352661 132.351440 132.342590 132.539062 147.598389 132.330200 132.344360 132.328430 132.346130 132.347900 132.206299 132.344360 132.344360 132.326660 131.916016 138.118164 147.585999 132.558533 132.353210 132.349670 132.353210 131.579712 132.339050 132.342590 132.324890
21 106.612373 113.225609 120.215530 132.164597 132.115143 132.219254 132.217926 132.215149 132.215149 132.218689 147.460327 132.215149 132.209839 131.976196 132.215149 132.213379 132.197449 132.215149 132.209839 132.222229 132.215149 147.492188 147.463867 132.216919 132.206299 132.215149 132.215149 132.218689 132.213379 132.218689 132.225769
22 106.000168 113.000481 120.000252 127.000122 134.000000 134.000000 134.000000 133.999329 133.999329 134.004639 134.078979 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 143.962769 149.462219 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329
23 106.000168 113.000038 120.000252 127.000122 134.000000 134.000000 134.000000 133.999329 133.999329 134.098450 134.004639 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 134.015259 149.467529 134.004639 134.004639 133.999329 133.999329 134.004639 134.006409 134.001099 133.999329 134.001099
24 106.000168 113.000038 120.000252 127.000122 134.000000 134.000000 134.000000 133.999329 133.999329 133.999329 149.462219 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 133.999329 134.013489 133.999329 149.462219 149.462219 133.999329 133.999329 133.999329 134.004639 134.006409 134.008179 133.999329 133.999329
25 106.000168 113.998993 120.000252 127.000122 134.000107 134.000107 134.000107 134.001099 134.001099 134.006409 149.463989 134.001099 134.001099 134.001099 134.001099 134.001099 133.999329 134.001099 134.001099 134.029419 134.008179 150.285278 149.524170 142.298950 134.100220 134.038269 134.052429 134.001099 134.001099 134.001099 134.001099
26 106.000168 113.000374 120.000252 127.000122 138.999863 138.999756 138.999527 138.973083 138.967773 139.233276 138.996094 138.992554 139.001404 138.989014 139.003174 138.983704 138.980164 138.999634 139.001404 138.971313 138.966003 155.005920 155.034241 138.990784 138.973083 138.987244 138.989014 138.960693 138.999634 138.983704 138.996094
27 106.000168 113.000038 120.000252 127.000122 138.999313 138.999863 138.998978 138.973083 138.999634 139.238586 138.997864 138.978394 139.001404 138.999634 138.989014 139.003174 138.994324 138.992554 138.992554 138.994324 138.994324 155.021851 155.032471 138.990784 139.001404 138.987244 138.996094 138.987244 138.983704 139.072205 138.999634
28 106.000168 113.000038 120.000252 127.000122 138.998093 139.000198 139.000198 138.990784 139.003174 155.036011 139.003174 138.999634 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 150.315369 139.015564 155.036011 155.036011 139.003174 138.990784 139.003174 139.001404 138.996094 138.983704 139.001404 139.003174
29 106.000168 113.000038 120.000252 127.000458 138.995880 139.000198 139.000198 139.003174 139.003174 139.089905 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 139.013794 139.004944 156.604248 139.036804 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174 139.003174
30 106.000168 113.000038 120.000252 127.000122 134.000000 141.000198 141.000198 141.001526 141.001526 141.020996 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 157.271545 152.301331 141.001526 141.001526 141.001526 141.006836 141.001526 141.001526 141.001526 141.001526
31 106.000168 113.000038 120.000252 127.000122 134.000000 141.000198 141.000198 141.001526 141.001526 141.024536 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.019226 157.271545 157.276855 141.010376 141.005066 141.044006 141.001526 141.001526 141.001526 141.001526 141.001526
32 106.000168 113.000038 120.000252 127.000122 134.000000 141.000198 141.000198 141.001526 141.001526 157.271545 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 157.298096 157.294556 141.128967 141.001526 141.001526 141.001526 141.001526 141.001526 141.001526 141.097107
33 106.000168 113.000038 120.999092 127.000458 134.000000 145.997971 145.999069 145.989441 145.994751 162.840027 145.989441 145.989441 145.998291 146.000061 145.985901 146.000061 145.996521 145.987671 145.994751 146.003601 145.992981 162.825867 146.543457 145.989441 145.984131 145.992981 145.977051 145.991211 145.998291 146.000061 145.989441
34 106.000168 113.000038 120.000252 127.000122 134.000000 145.999069 145.999512 145.982361 145.996521 162.841797 145.992981 145.985901 146.000061 146.000061 145.996521 146.000061 146.000061 146.000061 146.000061 145.985901 145.989441 162.843567 145.987671 145.996521 145.991211 145.989441 145.991211 145.980591 145.994751 145.991211 146.000061
35 106.000168 113.000038 120.000580 127.000122 134.000000 145.999298 146.000061 146.000061 145.994751 162.843567 145.994751 145.998291 146.000061 146.000061 146.000061 145.994751 145.996521 146.000061 146.000061 145.987671 146.049622 162.840027 162.836487 145.998291 145.989441 145.992981 145.989441 145.998291 145.991211 145.991211 145.994751
36 106.000168 113.000038 120.000252 127.000122 134.000000 145.996857 146.000061 146.000061 146.000061 162.847107 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 162.841797 146.001831 145.992981 146.000061 145.998291 146.102722 146.001831 146.003601 146.000061 146.005371
37 106.000168 113.000038 120.000252 127.000122 134.000000 145.948853 146.000061 146.000061 146.000061 146.037231 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 159.303528 146.702759 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061 146.000061
38 106.000168 113.000038 120.000252 127.000122 134.000000 141.000198 148.000076 148.003723 148.003723 165.080872 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 165.080872 165.080872 148.007263 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723
39 106.000275 113.000038 120.489548 127.000122 134.000000 141.000198 148.000076 148.003723 148.003723 153.366882 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 148.003723 165.084412 165.142822 148.039124 150.398560 148.003723 148.950684 148.764832 148.003723 148.003723 148.003723
40 106.000275 113.000038 120.000252 127.000122 134.000000 141.000198 152.997391 152.993408 153.000488 170.638733 152.996948 153.002258 153.000488 153.002258 152.984558 152.996948 152.973938 152.986328 152.993408 153.000488 152.991638 170.640503 152.995178 152.991638 152.989868 152.968628 152.988098 152.982788 152.982788 152.977478 152.989868
41 106.000275 113.499184 120.000252 127.000122 134.000000 141.000198 152.999832 152.995178 153.002258 170.652893 153.000488 153.002258 153.000488 152.998718 153.002258 153.002258 153.002258 153.002258 153.002258 152.996948 166.309265 170.645813 153.000488 152.998718 152.995178 153.002258 153.002258 152.981018 153.000488 152.982788 153.002258
42 106.000275 113.000038 120.000252 127.000122 134.499481 141.000198 153.500076 153.467773 153.457153 171.196289 153.481934 153.490784 153.499634 153.469543 153.480164 153.483704 153.501404 153.494324 153.481934 153.457153 153.604065 171.104248 153.469543 153.198730 153.457153 153.487244 153.444763 153.467773 153.329712 153.473083 153.412903
43 122.250168 131.000153 138.000015 147.744308 155.249969 155.250076 155.250076 155.243103 155.253723 173.161011 155.246643 155.251953 155.253723 155.248413 155.251953 155.253723 155.253723 155.253723 155.253723 155.251953 155.253723 173.153931 173.152161 155.241333 155.246643 155.253723 155.236023 155.241333 155.241333 155.253723 155.386475
44 123.000214 129.999969 137.000397 144.000061 156.000122 156.000122 155.999908 156.002441 155.990051 174.000000 156.002441 156.002441 156.000671 156.002441 156.002441 156.002441 156.002441 156.002441 156.000671 156.002441 156.027222 173.994690 156.009521 156.000671 156.000671 156.000671 156.014832 155.995361 155.998901 156.000671 156.002441
45 124.250175 136.485886 143.496048 152.748932 157.250092 157.250092 157.250092 157.252075 157.252075 175.387695 157.250305 157.252075 157.252075 157.252075 157.252075 157.250305 157.248535 157.250305 157.250305 157.250305 162.248840 175.393005 165.590637 157.248535 157.250305 157.252075 157.252075 157.252075 157.248535 157.246765 157.252075
46 125.000336 132.000534 139.500336 146.499985 158.000137 158.000137 158.000137 158.009644 158.000793 176.324036 158.000793 158.000793 158.009644 158.000793 158.501709 158.000793 158.000793 158.000793 158.000793 158.000793 158.007874 176.242615 158.245056 158.000793 158.004333 158.000793 158.000793 158.000793 158.000793 158.188416 158.283997
47 126.250191 138.499832 145.499924 156.249588 159.250107 159.250107 159.250107 159.246887 159.250427 177.625000 159.250427 159.250427 159.250427 159.250427 159.250427 159.250427 159.248657 159.250427 159.250427 159.253967 159.271667 177.625000 159.250427 159.250427 159.250427 159.250427 159.250427 159.250427 159.250427 159.250427 159.250427
48 127.000237 134.000000 141.000198 148.000961 160.000153 160.000153 160.000153 159.999146 159.999146 178.458679 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146 159.997375 159.999146 178.458679 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146 159.999146
49 128.250198 140.493210 147.499603 156.749619 161.250107 161.250107 161.250107 161.248779 161.248779 179.853455 161.248779 161.248779 161.248779 161.248779 161.248779 161.248779 161.248779 161.248779 161.248779 161.248779 161.255859 179.853455 161.248779 161.254089 161.255859 161.252319 161.247009 161.252319 161.250549 161.248779 161.250549
50 129.000244 139.501221 146.499985 156.000122 162.000153 162.000153 162.000153 162.002808 162.024048 180.692444 162.002808 162.002808 162.002808 162.006348 162.002808 162.002808 162.029358 162.002808 162.002808 161.997498 162.001038 180.694214 162.002808 162.002808 162.002808 162.002808 162.002808 162.004578 180.690674 180.694214 162.811707
51 130.250214 142.497757 149.499283 158.749741 163.250122 163.250122 163.250122 163.252441 163.252441 182.081909 163.252441 163.252441 163.252441 163.252441 163.252441 163.252441 163.252441 163.248901 163.248901 163.248901 163.250671 182.083679 163.252441 163.252441 163.252441 163.252441 163.252441 163.252441 163.252441 163.250671 163.250671
52 131.000259 138.000137 151.999100 152.000107 164.000168 164.000168 164.000168 164.001160 164.001160 182.922668 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 182.924438 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 164.001160 164.248962 164.001160
53 132.250229 144.499969 151.500183 163.749374 165.250137 165.250137 165.250137 165.250793 165.250793 184.317444 165.250793 165.250793 165.250793 165.250793 165.250793 165.250793 165.249023 165.250793 165.250793 165.250793 165.250793 184.317444 165.250793 165.250793 165.256104 184.347534 165.257874 184.317444 184.315674 184.315674 165.249023
54 133.000381 147.000244 154.000000 165.997635 166.000183 166.000183 166.000183 166.011902 166.500427 185.158203 166.006592 166.006592 166.500427 166.500427 166.006592 165.999512 166.001282 166.003052 166.001282 166.004822 166.004822 185.676819 165.999512 166.027832 165.999512 166.006592 165.999512 166.252625 166.004822 165.999512 166.004822
55 134.250229 148.250198 155.249863 167.235321 167.251923 167.250259 167.250153 167.249146 167.249146 186.549438 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 186.549438 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146 167.249146
56 135.000275 149.000244 156.000015 167.997543 168.000198 168.000198 168.000198 168.003174 168.003174 187.384888 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 187.383118 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174 168.003174
57 136.250244 150.250214 157.250092 169.239212 169.249939 169.250153 169.250153 169.252808 169.252808 188.776123 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 188.781433 168.999695 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808 169.252808
58 137.000290 151.000366 158.000137 169.999985 170.000198 170.000320 170.000198 170.001526 170.001526 189.632812 170.001526 170.001526 170.001526 170.249329 170.001526 170.001526 170.001526 170.001526 170.012146 170.001526 170.001526 189.615112 170.001526 170.001526 170.005066 170.001526 170.187378 170.001526 170.001526 170.001526 170.001526
59 138.250259 152.250229 159.250107 171.250168 171.250168 171.250061 171.250168 171.251160 171.251160 191.008118 171.251160 171.251160 171.251160 171.251160 171.251160 171.251160 171.251160 171.251160 171.251160 171.251160 171.251160 191.009888 171.251160 171.251160 171.251160 171.251160 171.251160 171.249390 171.251160 171.251160 171.251160
60 139.000519 152.999939 160.000153 171.997345 172.000214 172.000214 172.000214 171.999878 171.999878 191.847107 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878 191.848877 171.996338 171.998108 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878 171.999878
61 140.250275 154.250244 161.250107 173.247299 173.250183 173.250183 173.250183 173.249512 173.249512 192.960449 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512 173.001709 173.249512 193.238342 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512 173.249512
62 141.000320 154.999954 162.000153 173.992813 174.000336 174.000229 174.000229 174.003540 174.005310 194.079102 174.003540 174.003540 174.003540 174.003540 174.003540 174.010620 174.008850 174.003540 174.003540 174.003540 174.010620 194.135742 174.205322 174.003540 174.003540 174.003540 174.003540 174.003540 174.003540 174.003540 174.003540
63 142.250275 156.250244 163.250122 175.249084 175.250076 175.250198 175.000061 175.253174 175.253174 195.470337 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 195.472107 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174 175.253174
64 143.000320 156.999969 164.000168 175.998474 176.000244 176.000244 176.000244 176.001892 176.049683 196.305786 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.249695 196.307556 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892 176.001892
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment