chore: remove root-level V1 duplicates, superseded by hardware/v1/ freeze
hardware/v1/ was created (dc0b331) as a frozen snapshot of the V1
project that then lived at the repo root (rtl/, sim/, synth/, tools/,
docs/). Root received zero further commits to those files after the
freeze -- confirmed byte-identical to the hardware/v1/ copy for every
file removed here. Root was the "before", hardware/v1/ is the
curated, canonical "after".
Removed (all verified exact-hash duplicates of hardware/v1/ content):
- rtl/ (20 files, 100% covered by hardware/v1/rtl/)
- tools/{netasm,pinout,run_regression.py,flash_catalog,validation,
fpga_benchmark.py} (19 files, 100% covered by hardware/v1/tools/;
tools/neural_sim/ kept -- unique, post-freeze, no counterpart)
- sim/*.v (47 testbenches, 100% covered by hardware/v1/sim/; the
~38 remaining sim/ entries are compiled binaries and .vcd
waveform dumps, left as a separate cleanup decision)
- synth/ecp5/{p2,p4,p8,post_fix_verify} (25 files, exact duplicates
of hardware/v1/synthesis/; the other ~84 synth/ecp5/* experiment
build directories are historical artifacts never carried into the
freeze, left as a separate decision)
- WORKLOG.md (duplicate of hardware/v1/docs/WORKLOG.md)
- docs/{FPGA-Neural-Datapatch-Benchmark,FPGA-Neural-Hardware-Design,
FPGA-NeuralNetwork-Engine}.md, docs/validation/*.md (18 files),
docs/FPGA-Neural-Datasheet-{EN,IT}.pdf -- all exact duplicates of
hardware/v1/docs/ content
- hardware/v1/docs/DatasheetLatex/ (24 files) -- exact duplicate of
hardware/v2/docs/datasheet/files/docs/datasheet/en/ (discovered
during this audit; not the same DatasheetLatex already removed
from hardware/v2/docs/ in an earlier commit)
Moved (genuine, unique, post-freeze V2 content -- not duplicated
anywhere, just living in the wrong/legacy root docs/ location):
- docs/architecture/*.md -> hardware/v2/docs/architecture/
- docs/pinouts.md, docs/FPGA_NEURAL_V2_DATASHEET.md,
docs/FPGA_NEURAL_V2_SCHEMATIC.md,
docs/FPGA-Neural-V2-Datasheet-EN.pdf -> hardware/v2/docs/
Left untouched (separate decisions, not part of this cleanup):
- docs/FPGA-Neural-Flash-Subsystem-Verification.md, docs/
v2-description.md -- orphaned root-only content, no duplicate
found anywhere, but also not part of the reviewed plan
- synth/ecp5/* experiment dirs and sim/*_sim + sim/*.vcd build
artifacts -- not literal duplicates, flagged as candidates for a
future, separate cleanup pass
Verified no functional breakage: grepped all remaining scripts/docs
for references to every removed path -- only prose/comment mentions
found, no executable imports or build-script paths broken.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xXuuRUWZScuo1DeYJxs3v
This commit is contained in:
@@ -1,114 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Independent host-side oracle for the flash-subsystem catalog (Phase F4).
|
||||
|
||||
Per WORKLOG.md's verification standard (§A.1, "regola d'oro"): CRC and
|
||||
catalog-layout expected values used by the RTL testbenches must come from
|
||||
a source INDEPENDENT of the RTL/testbench author's own understanding, not
|
||||
be re-derived from the same design intent that produced the hardware. This
|
||||
script is that source -- it uses Python's stdlib `zlib.crc32` (a
|
||||
widely-used, pre-existing, independently-implemented CRC32 -- not
|
||||
hand-derived here to match the RTL) and a from-scratch description of the
|
||||
catalog byte layout, written by reading the byte offsets directly rather
|
||||
than importing anything from rtl/flash_slot_manager.v.
|
||||
|
||||
Catalog entry layout (16 bytes, matches rtl/flash_slot_manager.v's own
|
||||
header comment -- kept in sync by hand, cross-checked by the testbenches
|
||||
comparing actual hardware output against THIS script's output byte-for-
|
||||
byte, not by either side trusting the other's prose description):
|
||||
|
||||
offset[0:3) -- 24-bit flash byte offset of the slot's data, MSB first
|
||||
offset[3:6) -- 24-bit slot length in bytes, MSB first
|
||||
offset[6] -- 8-bit slot type (opaque, host-defined)
|
||||
offset[7] -- valid flag: 0x01 = valid, anything else = invalid
|
||||
(a freshly-erased catalog sector is all-0xFF, so an
|
||||
unwritten slot is invalid by construction, no format
|
||||
step needed)
|
||||
offset[8:12) -- CRC32 (IEEE 802.3 / zlib) of the slot's data payload,
|
||||
MSB first
|
||||
offset[12:16) -- reserved, always 0x00000000
|
||||
|
||||
16 slots x 16 bytes = 256 bytes = one flash page, comfortably inside the
|
||||
4KB catalog sector (sector 0, address 0x000000 -- reserved, never used for
|
||||
slot data, per rtl/flash_slot_manager.v's CATALOG_SECTOR_ADDR).
|
||||
"""
|
||||
|
||||
import zlib
|
||||
import struct
|
||||
|
||||
ENTRY_SIZE = 16
|
||||
N_SLOTS = 16
|
||||
CATALOG_BYTES = ENTRY_SIZE * N_SLOTS # 256
|
||||
|
||||
VALID_MARK = 0x01
|
||||
|
||||
|
||||
def crc32(data: bytes) -> int:
|
||||
"""IEEE 802.3 CRC32 (same polynomial/reflection/init as zlib.crc32),
|
||||
the independent oracle value the RTL's crc32 module (rtl/crc32.v)
|
||||
must match bit-for-bit."""
|
||||
return zlib.crc32(data) & 0xFFFFFFFF
|
||||
|
||||
|
||||
def pack_entry(offset: int, length: int, slot_type: int, valid: bool, data: bytes) -> bytes:
|
||||
"""Build one 16-byte catalog entry exactly as rtl/flash_slot_manager.v
|
||||
is expected to persist it. `data` is the slot's actual payload bytes
|
||||
(used only to compute the CRC field here -- the RTL computes the same
|
||||
CRC by streaming the payload through rtl/crc32.v as it moves the
|
||||
bytes, not by re-reading this function's output)."""
|
||||
if not (0 <= offset < (1 << 24)):
|
||||
raise ValueError("offset out of 24-bit range")
|
||||
if not (0 <= length < (1 << 24)):
|
||||
raise ValueError("length out of 24-bit range")
|
||||
if not (0 <= slot_type < 256):
|
||||
raise ValueError("type out of 8-bit range")
|
||||
|
||||
crc = crc32(data)
|
||||
valid_byte = VALID_MARK if valid else 0x00
|
||||
|
||||
return (
|
||||
offset.to_bytes(3, "big")
|
||||
+ length.to_bytes(3, "big")
|
||||
+ bytes([slot_type])
|
||||
+ bytes([valid_byte])
|
||||
+ crc.to_bytes(4, "big")
|
||||
+ b"\x00\x00\x00\x00"
|
||||
)
|
||||
|
||||
|
||||
def unpack_entry(entry: bytes):
|
||||
"""Inverse of pack_entry -- parses a raw 16-byte catalog entry (e.g.
|
||||
read back from the RTL's own catalog register file / persisted flash
|
||||
sector) into its fields, for testbench comparison."""
|
||||
if len(entry) != ENTRY_SIZE:
|
||||
raise ValueError(f"entry must be exactly {ENTRY_SIZE} bytes, got {len(entry)}")
|
||||
offset = int.from_bytes(entry[0:3], "big")
|
||||
length = int.from_bytes(entry[3:6], "big")
|
||||
slot_type = entry[6]
|
||||
valid = entry[7] == VALID_MARK
|
||||
crc = int.from_bytes(entry[8:12], "big")
|
||||
reserved = entry[12:16]
|
||||
return dict(offset=offset, length=length, type=slot_type, valid=valid, crc=crc, reserved=reserved)
|
||||
|
||||
|
||||
def build_catalog(entries: dict) -> bytes:
|
||||
"""entries: {slot_id: (offset, length, type, valid, data)} -> full
|
||||
256-byte catalog table (unwritten slots left as 0xFF, matching a
|
||||
freshly-erased sector -- see module docstring)."""
|
||||
table = bytearray(b"\xff" * CATALOG_BYTES)
|
||||
for slot_id, (offset, length, slot_type, valid, data) in entries.items():
|
||||
if not (0 <= slot_id < N_SLOTS):
|
||||
raise ValueError("slot_id out of range")
|
||||
entry = pack_entry(offset, length, slot_type, valid, data)
|
||||
table[slot_id * ENTRY_SIZE:(slot_id + 1) * ENTRY_SIZE] = entry
|
||||
return bytes(table)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Self-check / example: printed so a Verilog testbench's $display
|
||||
# output can be diffed against this by eye during bring-up.
|
||||
payload = bytes([0x10 + i for i in range(32)])
|
||||
entry = pack_entry(offset=0x001000, length=len(payload), slot_type=0x01, valid=True, data=payload)
|
||||
print("payload CRC32 =", hex(crc32(payload)))
|
||||
print("packed entry (hex) =", entry.hex())
|
||||
print("unpacked =", unpack_entry(entry))
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,105 +0,0 @@
|
||||
# netasm
|
||||
|
||||
Host-side assembler for the FPGA-Neural network engine. Compiles a
|
||||
small pseudo-assembly description of a network (dense Type #1 or
|
||||
sparse-graph Type #2, see the project spec §9) into:
|
||||
|
||||
- the exact on-disk byte layout (descriptor table + edge blocks,
|
||||
spec §4), and
|
||||
- the SPI command sequence (`SET_NET_TYPE` / `SET_BASE` / `WRITE_RAM`
|
||||
/ `RUN_NETWORK`) needed to load and start it.
|
||||
|
||||
This is **host tooling only**. Nothing here runs on the FPGA — see
|
||||
`rtl/graph_engine.v` and `rtl/spi_engine.v` for the hardware side of
|
||||
this protocol.
|
||||
|
||||
## Grammar
|
||||
|
||||
```
|
||||
; Tipo #1 (dense)
|
||||
NET dense
|
||||
INPUTS 256
|
||||
LAYER 64 relu
|
||||
LAYER 16 relu
|
||||
LAYER 4 none
|
||||
END
|
||||
```
|
||||
|
||||
```
|
||||
; Tipo #2 (graph)
|
||||
NET graph
|
||||
INPUTS 4 ; id 0..3
|
||||
NEURON n4 relu bias=2
|
||||
CONN 0 w=5
|
||||
CONN 1 w=-3
|
||||
NEURON n5 none bias=0
|
||||
CONN n4 w=2 ; symbolic reference to n4's output
|
||||
CONN 2 w=7
|
||||
OUTPUT n5
|
||||
END
|
||||
```
|
||||
|
||||
`;` starts a comment that runs to end of line. A `CONN <src> w=<int>`
|
||||
source is either a bare decimal id (typically one of the network's
|
||||
inputs) or the name of a previously declared `NEURON`.
|
||||
|
||||
For `NET dense`, only layer **sizes** and activations are declared —
|
||||
weight/bias **values** come from a trained model and are loaded by
|
||||
the host separately (unchanged `WRITE_RAM` flow); netasm's job there
|
||||
is layout (address allocation, PARALLEL-alignment validation,
|
||||
descriptor table, load/run commands).
|
||||
|
||||
For `NET graph`, netasm assigns every neuron's signal id (inputs get
|
||||
0..N_in-1; every `OUTPUT` neuron is guaranteed the highest ids, as
|
||||
required by spec §4.4 — reordering non-output neurons is never
|
||||
needed for correctness since the grammar already forces
|
||||
before-you-use declaration order), resolves symbolic `CONN`
|
||||
references, pads each neuron's edge list to a `PARALLEL` multiple
|
||||
with zero-weight edges (spec §2.6 — this is a full, physical
|
||||
edge block, not a hint: hardware just streams `n_conn_padded` real
|
||||
bytes from PSRAM), and emits the descriptor table + edge blocks +
|
||||
load/run command sequence.
|
||||
|
||||
## Compile-time validation
|
||||
|
||||
Catches these before the runtime load-time guard in
|
||||
`rtl/graph_engine.v` ever would (spec §9's whole point):
|
||||
|
||||
- `src_id < out_id` (no cycles / forward references)
|
||||
- `src_id`, `out_id` < `N_TOTAL`
|
||||
- an `OUTPUT` neuron is never used as another neuron's source
|
||||
- every `CONN` reference (symbolic or literal) resolves to a real id
|
||||
- a neuron's *padded* connection count fits the hardware's
|
||||
build-time `MAX_CONN`
|
||||
- (dense) every layer's real input count is a `PARALLEL` multiple
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
python3 tools/netasm/cli.py <input.netasm> -o <out_prefix> \
|
||||
[--parallel 8] [--max-conn 32] [--n-total 4096] \
|
||||
[--table-base 0x...] [--edges-base 0x...] [--x-base 0x...] \
|
||||
[--out-base 0x...] [--buf-b-base 0x...] [--weights-base 0x...]
|
||||
```
|
||||
|
||||
Produces:
|
||||
|
||||
- `<out_prefix>.frames.bin` — length-prefixed SPI transaction bytes
|
||||
(2-byte big-endian length + that many payload bytes, repeated); a
|
||||
host driver replays each record by asserting CS, shifting the
|
||||
bytes out, then deasserting CS.
|
||||
- `<out_prefix>.debug.txt` — human-readable id/address/byte dump for
|
||||
review before flashing real hardware.
|
||||
|
||||
See `examples/graph_example.netasm` and `examples/dense_example.netasm`.
|
||||
|
||||
## Tests
|
||||
|
||||
```
|
||||
python3 tools/netasm/tests/test_netasm.py -v
|
||||
```
|
||||
|
||||
Includes a byte-exact test against the same worked graph example
|
||||
used throughout the RTL testbenches (`sim/graph_format_tb.v`,
|
||||
`sim/graph_engine_tb.v`, `sim/spi_neuron_top_graph_tb.v`), plus one
|
||||
test per compile-time guard above.
|
||||
@@ -1,20 +0,0 @@
|
||||
from .parser import parse, DenseNet, GraphNet, NetasmSyntaxError
|
||||
from .assembler import (
|
||||
assemble_dense,
|
||||
assemble_graph,
|
||||
dump_dense_debug,
|
||||
dump_graph_debug,
|
||||
NetasmError,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"parse",
|
||||
"DenseNet",
|
||||
"GraphNet",
|
||||
"NetasmSyntaxError",
|
||||
"assemble_dense",
|
||||
"assemble_graph",
|
||||
"dump_dense_debug",
|
||||
"dump_graph_debug",
|
||||
"NetasmError",
|
||||
]
|
||||
@@ -1,405 +0,0 @@
|
||||
"""
|
||||
netasm assembler -- turns a parsed DenseNet/GraphNet (see parser.py)
|
||||
into exact byte layouts (descriptor tables, edge blocks) and the SPI
|
||||
command sequence to load them, per the data formats in the project
|
||||
spec (§4). Runs entirely on the host; nothing here executes on the
|
||||
FPGA (§10).
|
||||
|
||||
Compile-time validation performed here (spec §9's whole point: catch
|
||||
these BEFORE the runtime load-time guard in rtl/graph_engine.v ever
|
||||
sees them):
|
||||
- graph: src_id < out_id, src_id/out_id < N_TOTAL, an OUTPUT neuron
|
||||
is never used as another neuron's source, every symbolic/literal
|
||||
CONN reference resolves to a real signal id.
|
||||
- graph: a neuron's padded connection count (see PARALLEL padding
|
||||
below) must fit the hardware's build-time MAX_CONN.
|
||||
- dense: every layer's real input count must be a PARALLEL
|
||||
multiple (the same runtime convention neuron_parallel.v/
|
||||
neuron_memory.v already require of n_inputs_real).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
try:
|
||||
from . import frames as F
|
||||
from .parser import Conn, DenseNet, GraphNet, Neuron
|
||||
except ImportError:
|
||||
# See cli.py's matching fallback: allows this module to load when
|
||||
# imported as a bare top-level module too, not only as part of
|
||||
# the `tools.netasm` package.
|
||||
import frames as F
|
||||
from parser import Conn, DenseNet, GraphNet, Neuron
|
||||
|
||||
|
||||
class NetasmError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def _act_code(name: str) -> int:
|
||||
return F.ACT_RELU if name.lower() == "relu" else F.ACT_NONE
|
||||
|
||||
|
||||
def _pad_to_parallel(n_conn: int, parallel: int) -> int:
|
||||
# At least one full PARALLEL group even for n_conn == 0 -- a
|
||||
# zero-group neuron would forward n_inputs_real=0 into
|
||||
# neuron_parallel, which hangs (see rtl/neuron_parallel.v's
|
||||
# GROUPS==0 failure mode, and rtl/graph_engine.v's matching
|
||||
# load-time guard). Padding edges are (src_id=0, weight=0);
|
||||
# src_id=0 is always a valid, already-computed signal for any
|
||||
# neuron with id > 0 (every real network has n_in >= 1 inputs at
|
||||
# id 0), so this never trips the src_id < out_id guard.
|
||||
return max(parallel, math.ceil(max(n_conn, 1) / parallel) * parallel)
|
||||
|
||||
|
||||
# ================================================================
|
||||
# GRAPH (Type #2)
|
||||
# ================================================================
|
||||
|
||||
|
||||
@dataclass
|
||||
class GraphLayout:
|
||||
n_in: int
|
||||
num_neurons: int
|
||||
n_out: int
|
||||
n_total: int
|
||||
id_of: Dict[str, int]
|
||||
order: List[str] # neuron names in ascending-id order
|
||||
table_base: int
|
||||
x_base: int
|
||||
out_base: int
|
||||
edges_base: Dict[str, int]
|
||||
descriptor_bytes: bytes
|
||||
edge_bytes: Dict[str, bytes]
|
||||
n_conn_real: Dict[str, int]
|
||||
n_conn_padded: Dict[str, int]
|
||||
out_ids: List[str] # neuron names, in out_base byte order
|
||||
frames: List[F.Frame] = field(default_factory=list)
|
||||
|
||||
|
||||
def _resolve_src(
|
||||
src_token: str, id_of: Dict[str, int], n_in: int, line: int
|
||||
) -> int:
|
||||
if src_token in id_of:
|
||||
return id_of[src_token]
|
||||
try:
|
||||
v = int(src_token, 0)
|
||||
except ValueError:
|
||||
raise NetasmError(f"line {line}: unknown source '{src_token}'")
|
||||
return v
|
||||
|
||||
|
||||
def assemble_graph(
|
||||
net: GraphNet,
|
||||
parallel: int,
|
||||
max_conn: int = 32,
|
||||
n_total: int = 4096,
|
||||
table_base: int = 0x000000,
|
||||
edges_base: int = 0x010000,
|
||||
x_base: int = 0x000000,
|
||||
out_base: int = 0x020000,
|
||||
) -> GraphLayout:
|
||||
|
||||
if parallel <= 0 or (parallel & (parallel - 1)) != 0:
|
||||
raise NetasmError(f"PARALLEL must be a positive power of two, got {parallel}")
|
||||
|
||||
n_in = net.n_inputs
|
||||
declared_names = [n.name for n in net.neurons]
|
||||
neuron_by_name = {n.name: n for n in net.neurons}
|
||||
|
||||
for out_name in net.outputs:
|
||||
if out_name not in neuron_by_name:
|
||||
raise NetasmError(f"OUTPUT '{out_name}' refers to an undeclared neuron")
|
||||
if len(set(net.outputs)) != len(net.outputs):
|
||||
raise NetasmError("duplicate name in OUTPUT list")
|
||||
|
||||
# A neuron used as ANY other neuron's source can never be an
|
||||
# output sink (spec §4.4's invariant, enforced here at compile
|
||||
# time rather than left to the runtime guard).
|
||||
referenced_as_source = set()
|
||||
for n in net.neurons:
|
||||
for c in n.conns:
|
||||
if c.src in neuron_by_name:
|
||||
referenced_as_source.add(c.src)
|
||||
for out_name in net.outputs:
|
||||
if out_name in referenced_as_source:
|
||||
raise NetasmError(
|
||||
f"OUTPUT '{out_name}' is used as a source by another neuron -- "
|
||||
"output ids must be pure sinks (spec §4.4)"
|
||||
)
|
||||
|
||||
output_set = set(net.outputs)
|
||||
non_output_order = [n for n in declared_names if n not in output_set]
|
||||
order = non_output_order + list(net.outputs)
|
||||
|
||||
id_of: Dict[str, int] = {}
|
||||
for i, name in enumerate(order):
|
||||
id_of[name] = n_in + i
|
||||
|
||||
num_neurons = len(order)
|
||||
n_total_used = n_in + num_neurons
|
||||
if n_total_used > n_total:
|
||||
raise NetasmError(
|
||||
f"network needs {n_total_used} signal ids (N_in={n_in} + "
|
||||
f"{num_neurons} neurons), exceeds N_TOTAL={n_total}"
|
||||
)
|
||||
|
||||
edges_base_of: Dict[str, int] = {}
|
||||
edge_bytes: Dict[str, bytes] = {}
|
||||
n_conn_real: Dict[str, int] = {}
|
||||
n_conn_padded: Dict[str, int] = {}
|
||||
cursor = edges_base
|
||||
|
||||
for name in order:
|
||||
neuron = neuron_by_name[name]
|
||||
out_id = id_of[name]
|
||||
n_conn = len(neuron.conns)
|
||||
padded = _pad_to_parallel(n_conn, parallel)
|
||||
if padded > max_conn:
|
||||
raise NetasmError(
|
||||
f"neuron '{name}' (line {neuron.line}): {n_conn} connection(s) pad "
|
||||
f"to {padded} at PARALLEL={parallel}, exceeds MAX_CONN={max_conn}"
|
||||
)
|
||||
|
||||
edges_base_of[name] = cursor
|
||||
buf = bytearray()
|
||||
|
||||
for c in neuron.conns:
|
||||
src_id = _resolve_src(c.src, id_of, n_in, c.line)
|
||||
if src_id >= n_total:
|
||||
raise NetasmError(
|
||||
f"line {c.line}: src id {src_id} >= N_TOTAL={n_total}"
|
||||
)
|
||||
if src_id >= out_id:
|
||||
raise NetasmError(
|
||||
f"line {c.line}: neuron '{name}' (id {out_id}) connects from "
|
||||
f"src id {src_id}, which is not a strictly earlier signal "
|
||||
"(src_id must be < out_id, §7)"
|
||||
)
|
||||
buf += src_id.to_bytes(2, "big")
|
||||
buf.append(c.weight & 0xFF)
|
||||
buf.append(0x00) # reserved
|
||||
|
||||
for _ in range(padded - n_conn):
|
||||
buf += (0).to_bytes(2, "big") # src_id = 0 (always valid, weight 0)
|
||||
buf.append(0x00) # weight = 0
|
||||
buf.append(0x00) # reserved
|
||||
|
||||
edge_bytes[name] = bytes(buf)
|
||||
n_conn_real[name] = n_conn
|
||||
n_conn_padded[name] = padded
|
||||
cursor += len(buf)
|
||||
|
||||
descriptor = bytearray()
|
||||
for name in order:
|
||||
neuron = neuron_by_name[name]
|
||||
out_id = id_of[name]
|
||||
n_conn = n_conn_real[name]
|
||||
descriptor += edges_base_of[name].to_bytes(3, "big")
|
||||
descriptor += n_conn.to_bytes(2, "big")
|
||||
descriptor += out_id.to_bytes(2, "big")
|
||||
descriptor.append(_act_code(neuron.activation))
|
||||
descriptor.append(neuron.bias & 0xFF)
|
||||
descriptor += b"\x00\x00" # reserved
|
||||
|
||||
n_out = len(net.outputs)
|
||||
|
||||
layout = GraphLayout(
|
||||
n_in=n_in,
|
||||
num_neurons=num_neurons,
|
||||
n_out=n_out,
|
||||
n_total=n_total_used,
|
||||
id_of=id_of,
|
||||
order=order,
|
||||
table_base=table_base,
|
||||
x_base=x_base,
|
||||
out_base=out_base,
|
||||
edges_base=edges_base_of,
|
||||
descriptor_bytes=bytes(descriptor),
|
||||
edge_bytes=edge_bytes,
|
||||
n_conn_real=n_conn_real,
|
||||
n_conn_padded=n_conn_padded,
|
||||
out_ids=list(net.outputs),
|
||||
)
|
||||
|
||||
fr: List[F.Frame] = []
|
||||
fr.append(F.write_ram(table_base, layout.descriptor_bytes))
|
||||
for name in order:
|
||||
fr.append(F.write_ram(edges_base_of[name], edge_bytes[name]))
|
||||
fr.append(F.set_net_type(F.NET_TYPE_GRAPH))
|
||||
fr.append(F.set_base(F.SEL_X_BASE, x_base))
|
||||
fr.append(F.set_base(F.SEL_TABLE_BASE, table_base))
|
||||
fr.append(F.set_base(F.SEL_BUF_A_BASE, out_base))
|
||||
fr.append(F.set_base(F.SEL_N_INPUTS, n_in))
|
||||
fr.append(F.set_base(F.SEL_NUM_NEURONS_GRAPH, num_neurons))
|
||||
fr.append(F.set_base(F.SEL_N_OUT, n_out))
|
||||
fr.append(F.run_network(0))
|
||||
layout.frames = fr
|
||||
|
||||
return layout
|
||||
|
||||
|
||||
def dump_graph_debug(layout: GraphLayout) -> str:
|
||||
lines = []
|
||||
lines.append("=== netasm graph debug dump ===")
|
||||
lines.append(f"N_in={layout.n_in} num_neurons={layout.num_neurons} "
|
||||
f"n_out={layout.n_out} N_TOTAL_used={layout.n_total}")
|
||||
lines.append(f"table_base=0x{layout.table_base:06x} x_base=0x{layout.x_base:06x} "
|
||||
f"out_base=0x{layout.out_base:06x}")
|
||||
lines.append("")
|
||||
lines.append("id assignment (ascending):")
|
||||
for name in layout.order:
|
||||
marker = " <- OUTPUT" if name in layout.out_ids else ""
|
||||
lines.append(
|
||||
f" id={layout.id_of[name]:4d} {name:16s} n_conn={layout.n_conn_real[name]} "
|
||||
f"padded={layout.n_conn_padded[name]} edges@0x{layout.edges_base[name]:06x}{marker}"
|
||||
)
|
||||
lines.append("")
|
||||
lines.append(f"descriptor table ({len(layout.descriptor_bytes)} bytes):")
|
||||
lines.append(" " + layout.descriptor_bytes.hex(" "))
|
||||
lines.append("")
|
||||
for name in layout.order:
|
||||
lines.append(f"edges for {name} ({len(layout.edge_bytes[name])} bytes):")
|
||||
lines.append(" " + layout.edge_bytes[name].hex(" "))
|
||||
lines.append("")
|
||||
lines.append("SPI load sequence:")
|
||||
lines.append(F.frames_as_hex(layout.frames))
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
# ================================================================
|
||||
# DENSE (Type #1)
|
||||
#
|
||||
# The grammar (spec §9) only declares layer SIZES/activations, not
|
||||
# weight VALUES -- those come from a trained model and are loaded by
|
||||
# the host separately (existing WRITE_RAM flow, unchanged from
|
||||
# before this tool existed). netasm's job for dense is therefore
|
||||
# layout + descriptor table + load/run command generation: it
|
||||
# allocates address ranges for each layer's weight matrix and bias
|
||||
# vector, validates PARALLEL alignment, and reports exactly where
|
||||
# the host must WRITE_RAM the real weight/bias content before
|
||||
# RUN_NETWORK.
|
||||
# ================================================================
|
||||
|
||||
|
||||
@dataclass
|
||||
class DenseLayerLayout:
|
||||
n_inputs_real: int
|
||||
n_neurons_real: int
|
||||
activation: str
|
||||
w_base: int
|
||||
bias_addr: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class DenseLayout:
|
||||
n_inputs: int
|
||||
layers: List[DenseLayerLayout]
|
||||
table_base: int
|
||||
x_base: int
|
||||
buf_a_base: int
|
||||
buf_b_base: int
|
||||
descriptor_bytes: bytes
|
||||
frames: List[F.Frame] = field(default_factory=list)
|
||||
|
||||
|
||||
def assemble_dense(
|
||||
net: DenseNet,
|
||||
parallel: int,
|
||||
table_base: int = 0x000000,
|
||||
weights_base: int = 0x010000,
|
||||
x_base: int = 0x000000,
|
||||
buf_a_base: int = 0x020000,
|
||||
buf_b_base: int = 0x021000,
|
||||
) -> DenseLayout:
|
||||
|
||||
if parallel <= 0 or (parallel & (parallel - 1)) != 0:
|
||||
raise NetasmError(f"PARALLEL must be a positive power of two, got {parallel}")
|
||||
|
||||
layers: List[DenseLayerLayout] = []
|
||||
cursor = weights_base
|
||||
prev_n = net.n_inputs
|
||||
|
||||
for layer in net.layers:
|
||||
if prev_n % parallel != 0:
|
||||
raise NetasmError(
|
||||
f"line {layer.line}: layer's real input count {prev_n} is not a "
|
||||
f"multiple of PARALLEL={parallel} (neuron_parallel.v/"
|
||||
"neuron_memory.v both require this at runtime)"
|
||||
)
|
||||
w_base = cursor
|
||||
cursor += prev_n * layer.n_neurons
|
||||
bias_addr = cursor
|
||||
cursor += layer.n_neurons
|
||||
layers.append(
|
||||
DenseLayerLayout(
|
||||
n_inputs_real=prev_n,
|
||||
n_neurons_real=layer.n_neurons,
|
||||
activation=layer.activation,
|
||||
w_base=w_base,
|
||||
bias_addr=bias_addr,
|
||||
)
|
||||
)
|
||||
prev_n = layer.n_neurons
|
||||
|
||||
descriptor = bytearray()
|
||||
for l in layers:
|
||||
descriptor += l.w_base.to_bytes(3, "big")
|
||||
descriptor += l.bias_addr.to_bytes(3, "big")
|
||||
descriptor.append(_act_code(l.activation))
|
||||
descriptor += l.n_inputs_real.to_bytes(2, "big")
|
||||
descriptor += l.n_neurons_real.to_bytes(2, "big")
|
||||
|
||||
layout = DenseLayout(
|
||||
n_inputs=net.n_inputs,
|
||||
layers=layers,
|
||||
table_base=table_base,
|
||||
x_base=x_base,
|
||||
buf_a_base=buf_a_base,
|
||||
buf_b_base=buf_b_base,
|
||||
descriptor_bytes=bytes(descriptor),
|
||||
)
|
||||
|
||||
fr: List[F.Frame] = []
|
||||
fr.append(F.write_ram(table_base, layout.descriptor_bytes))
|
||||
fr.append(F.set_net_type(F.NET_TYPE_DENSE))
|
||||
fr.append(F.set_base(F.SEL_X_BASE, x_base))
|
||||
fr.append(F.set_base(F.SEL_TABLE_BASE, table_base))
|
||||
fr.append(F.set_base(F.SEL_BUF_A_BASE, buf_a_base))
|
||||
fr.append(F.set_base(F.SEL_BUF_B_BASE, buf_b_base))
|
||||
fr.append(F.run_network(len(net.layers)))
|
||||
layout.frames = fr
|
||||
|
||||
return layout
|
||||
|
||||
|
||||
def dump_dense_debug(layout: DenseLayout) -> str:
|
||||
lines = []
|
||||
lines.append("=== netasm dense debug dump ===")
|
||||
lines.append(f"N_inputs={layout.n_inputs} layers={len(layout.layers)}")
|
||||
lines.append(f"table_base=0x{layout.table_base:06x} x_base=0x{layout.x_base:06x} "
|
||||
f"buf_a_base=0x{layout.buf_a_base:06x} buf_b_base=0x{layout.buf_b_base:06x}")
|
||||
lines.append("")
|
||||
lines.append("NOTE: weight/bias VALUES are not part of this program -- the")
|
||||
lines.append("host must WRITE_RAM the real trained weights/bias at the")
|
||||
lines.append("addresses below before RUN_NETWORK.")
|
||||
lines.append("")
|
||||
for i, l in enumerate(layout.layers):
|
||||
lines.append(
|
||||
f" layer {i}: n_inputs_real={l.n_inputs_real} n_neurons_real={l.n_neurons_real} "
|
||||
f"activation={l.activation}"
|
||||
)
|
||||
lines.append(
|
||||
f" w_base=0x{l.w_base:06x} ({l.n_inputs_real * l.n_neurons_real} bytes) "
|
||||
f"bias_addr=0x{l.bias_addr:06x} ({l.n_neurons_real} bytes)"
|
||||
)
|
||||
lines.append("")
|
||||
lines.append(f"descriptor table ({len(layout.descriptor_bytes)} bytes):")
|
||||
lines.append(" " + layout.descriptor_bytes.hex(" "))
|
||||
lines.append("")
|
||||
lines.append("SPI load sequence:")
|
||||
lines.append(F.frames_as_hex(layout.frames))
|
||||
return "\n".join(lines)
|
||||
@@ -1,120 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
netasm CLI: compiles a .netasm source file (see parser.py's docstring
|
||||
for the grammar) into an SPI load sequence + human-readable debug
|
||||
dump. Host-side tool only -- see rtl/graph_engine.v / spi_engine.v
|
||||
for the hardware side of this protocol.
|
||||
|
||||
Usage:
|
||||
python3 -m tools.netasm.cli input.netasm -o out_prefix \\
|
||||
[--parallel 8] [--max-conn 32] [--n-total 4096]
|
||||
|
||||
Produces:
|
||||
out_prefix.frames.bin -- length-prefixed SPI transaction bytes
|
||||
out_prefix.debug.txt -- human-readable id/address/byte dump
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
|
||||
try:
|
||||
from . import frames as F
|
||||
from .assembler import (
|
||||
NetasmError,
|
||||
assemble_dense,
|
||||
assemble_graph,
|
||||
dump_dense_debug,
|
||||
dump_graph_debug,
|
||||
)
|
||||
from .parser import DenseNet, GraphNet, NetasmSyntaxError, parse
|
||||
except ImportError:
|
||||
# Allow running this file directly (`python3 tools/netasm/cli.py`)
|
||||
# without the package being importable as `tools.netasm` -- e.g.
|
||||
# an unrelated `tools` namespace package earlier on PYTHONPATH
|
||||
# shadowing this repo's tools/ directory.
|
||||
import os
|
||||
import sys
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
import frames as F
|
||||
from assembler import (
|
||||
NetasmError,
|
||||
assemble_dense,
|
||||
assemble_graph,
|
||||
dump_dense_debug,
|
||||
dump_graph_debug,
|
||||
)
|
||||
from parser import DenseNet, GraphNet, NetasmSyntaxError, parse
|
||||
|
||||
|
||||
def main(argv=None) -> int:
|
||||
ap = argparse.ArgumentParser(description=__doc__)
|
||||
ap.add_argument("source", help="path to a .netasm source file")
|
||||
ap.add_argument("-o", "--output", required=True, help="output file prefix")
|
||||
ap.add_argument("--parallel", type=int, default=8, help="hardware PARALLEL (default 8)")
|
||||
ap.add_argument("--max-conn", type=int, default=32, help="graph_engine's MAX_CONN (default 32)")
|
||||
ap.add_argument("--n-total", type=int, default=4096, help="graph_engine's N_TOTAL (default 4096)")
|
||||
ap.add_argument("--table-base", type=lambda s: int(s, 0), default=0x000000)
|
||||
ap.add_argument("--edges-base", type=lambda s: int(s, 0), default=0x010000)
|
||||
ap.add_argument("--x-base", type=lambda s: int(s, 0), default=0x000000)
|
||||
ap.add_argument("--out-base", type=lambda s: int(s, 0), default=0x020000,
|
||||
help="graph out_base / dense buf_a_base")
|
||||
ap.add_argument("--buf-b-base", type=lambda s: int(s, 0), default=0x021000,
|
||||
help="dense buf_b_base only")
|
||||
ap.add_argument("--weights-base", type=lambda s: int(s, 0), default=0x010000,
|
||||
help="dense weight/bias region base")
|
||||
args = ap.parse_args(argv)
|
||||
|
||||
with open(args.source, "r") as f:
|
||||
text = f.read()
|
||||
|
||||
try:
|
||||
net = parse(text)
|
||||
except NetasmSyntaxError as e:
|
||||
print(f"{args.source}: syntax error: {e}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
try:
|
||||
if isinstance(net, GraphNet):
|
||||
layout = assemble_graph(
|
||||
net,
|
||||
parallel=args.parallel,
|
||||
max_conn=args.max_conn,
|
||||
n_total=args.n_total,
|
||||
table_base=args.table_base,
|
||||
edges_base=args.edges_base,
|
||||
x_base=args.x_base,
|
||||
out_base=args.out_base,
|
||||
)
|
||||
debug = dump_graph_debug(layout)
|
||||
frames = layout.frames
|
||||
else:
|
||||
assert isinstance(net, DenseNet)
|
||||
layout = assemble_dense(
|
||||
net,
|
||||
parallel=args.parallel,
|
||||
table_base=args.table_base,
|
||||
weights_base=args.weights_base,
|
||||
x_base=args.x_base,
|
||||
buf_a_base=args.out_base,
|
||||
buf_b_base=args.buf_b_base,
|
||||
)
|
||||
debug = dump_dense_debug(layout)
|
||||
frames = layout.frames
|
||||
except NetasmError as e:
|
||||
print(f"{args.source}: assembly error: {e}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
F.dump_frames(frames, args.output + ".frames.bin")
|
||||
with open(args.output + ".debug.txt", "w") as f:
|
||||
f.write(debug + "\n")
|
||||
|
||||
print(f"wrote {args.output}.frames.bin ({sum(len(fr.data) for fr in frames)} payload bytes, "
|
||||
f"{len(frames)} SPI transactions)")
|
||||
print(f"wrote {args.output}.debug.txt")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -1,7 +0,0 @@
|
||||
; Simple 3-layer dense classifier.
|
||||
NET dense
|
||||
INPUTS 256
|
||||
LAYER 64 relu
|
||||
LAYER 16 relu
|
||||
LAYER 4 none
|
||||
END
|
||||
@@ -1,13 +0,0 @@
|
||||
; Worked example from the project spec (§3): 4 inputs, two neurons,
|
||||
; n5 is the sole output. See docs for the hand-computed expected
|
||||
; result with x = [10, 1, 4, 0]: n4=49, n5=126.
|
||||
NET graph
|
||||
INPUTS 4 ; id 0..3
|
||||
NEURON n4 relu bias=2
|
||||
CONN 0 w=5
|
||||
CONN 1 w=-3
|
||||
NEURON n5 none bias=0
|
||||
CONN n4 w=2 ; symbolic reference to n4's output
|
||||
CONN 2 w=7
|
||||
OUTPUT n5
|
||||
END
|
||||
@@ -1,131 +0,0 @@
|
||||
"""
|
||||
SPI frame encoding matching rtl/spi_engine.v's opcode set (§5 of the
|
||||
spec). A "frame" is the exact sequence of bytes shifted over MOSI
|
||||
during one CS-low transaction -- opcode byte first, then whatever
|
||||
fixed-size payload that opcode expects. This module only builds
|
||||
byte sequences; it does not talk to real hardware.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import List
|
||||
|
||||
OP_NOP = 0x00
|
||||
OP_WRITE_RAM = 0x01
|
||||
OP_READ_RAM = 0x02
|
||||
OP_RESET = 0x0F
|
||||
OP_SET_BASE = 0x10
|
||||
OP_SET_NET_TYPE = 0x11
|
||||
OP_START = 0x20
|
||||
OP_STATUS = 0x21
|
||||
OP_READ_OUTPUT = 0x22
|
||||
OP_RUN_NETWORK = 0x23
|
||||
OP_READ_CONFIG = 0x30
|
||||
|
||||
SEL_X_BASE = 0x00
|
||||
SEL_W_BASE = 0x01
|
||||
SEL_BIAS_ADDR = 0x02
|
||||
SEL_TABLE_BASE = 0x03
|
||||
SEL_BUF_A_BASE = 0x04
|
||||
SEL_BUF_B_BASE = 0x05
|
||||
SEL_ACTIVATION = 0x06
|
||||
SEL_N_INPUTS = 0x07
|
||||
SEL_N_NEURONS = 0x08
|
||||
SEL_NUM_NEURONS_GRAPH = 0x09
|
||||
SEL_N_OUT = 0x0A
|
||||
|
||||
NET_TYPE_DENSE = 0x01
|
||||
NET_TYPE_GRAPH = 0x02
|
||||
|
||||
ACT_NONE = 0
|
||||
ACT_RELU = 1
|
||||
|
||||
|
||||
def _u24(v: int) -> bytes:
|
||||
if not (0 <= v < (1 << 24)):
|
||||
raise ValueError(f"address 0x{v:x} does not fit in 24 bits")
|
||||
return bytes([(v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF])
|
||||
|
||||
|
||||
def _u16(v: int) -> bytes:
|
||||
if not (0 <= v < (1 << 16)):
|
||||
raise ValueError(f"value 0x{v:x} does not fit in 16 bits")
|
||||
return bytes([(v >> 8) & 0xFF, v & 0xFF])
|
||||
|
||||
|
||||
def _i8(v: int) -> int:
|
||||
if not (-128 <= v <= 127):
|
||||
raise ValueError(f"value {v} does not fit in a signed byte")
|
||||
return v & 0xFF
|
||||
|
||||
|
||||
@dataclass
|
||||
class Frame:
|
||||
label: str
|
||||
data: bytes
|
||||
|
||||
|
||||
def reset() -> Frame:
|
||||
return Frame("RESET", bytes([OP_RESET]))
|
||||
|
||||
|
||||
def set_net_type(net_type: int) -> Frame:
|
||||
return Frame(f"SET_NET_TYPE({net_type:#04x})", bytes([OP_SET_NET_TYPE, net_type & 0xFF]))
|
||||
|
||||
|
||||
def set_base(sel: int, addr: int) -> Frame:
|
||||
return Frame(
|
||||
f"SET_BASE(sel={sel:#04x}, addr={addr:#08x})",
|
||||
bytes([OP_SET_BASE, sel & 0xFF]) + _u24(addr),
|
||||
)
|
||||
|
||||
|
||||
def write_ram(addr: int, data: bytes) -> Frame:
|
||||
return Frame(
|
||||
f"WRITE_RAM(addr={addr:#08x}, len={len(data)})",
|
||||
bytes([OP_WRITE_RAM]) + _u24(addr) + _u16(len(data)) + bytes(data),
|
||||
)
|
||||
|
||||
|
||||
def read_ram(addr: int, length: int) -> Frame:
|
||||
return Frame(
|
||||
f"READ_RAM(addr={addr:#08x}, len={length})",
|
||||
bytes([OP_READ_RAM]) + _u24(addr) + _u16(length),
|
||||
)
|
||||
|
||||
|
||||
def run_network(payload_byte: int = 0) -> Frame:
|
||||
return Frame(f"RUN_NETWORK(payload={payload_byte:#04x})", bytes([OP_RUN_NETWORK, payload_byte & 0xFF]))
|
||||
|
||||
|
||||
def start() -> Frame:
|
||||
return Frame("START", bytes([OP_START]))
|
||||
|
||||
|
||||
def status() -> Frame:
|
||||
return Frame("STATUS", bytes([OP_STATUS, 0x00]))
|
||||
|
||||
|
||||
def read_config() -> Frame:
|
||||
return Frame("READ_CONFIG", bytes([OP_READ_CONFIG] + [0x00] * 10))
|
||||
|
||||
|
||||
def dump_frames(frames: List[Frame], path: str) -> None:
|
||||
"""Length-prefixed binary dump: for each frame, a 2-byte
|
||||
big-endian length followed by that many payload bytes. A simple
|
||||
host driver replays this by, for each record, asserting CS,
|
||||
shifting out the bytes, then deasserting CS."""
|
||||
with open(path, "wb") as f:
|
||||
for fr in frames:
|
||||
n = len(fr.data)
|
||||
f.write(bytes([(n >> 8) & 0xFF, n & 0xFF]))
|
||||
f.write(fr.data)
|
||||
|
||||
|
||||
def frames_as_hex(frames: List[Frame]) -> str:
|
||||
lines = []
|
||||
for fr in frames:
|
||||
hexbytes = " ".join(f"{b:02x}" for b in fr.data)
|
||||
lines.append(f"{fr.label:40s} : {hexbytes}")
|
||||
return "\n".join(lines)
|
||||
@@ -1,229 +0,0 @@
|
||||
"""
|
||||
netasm parser -- turns the pseudo-assembly text described in the
|
||||
project spec (§9) into a small AST (DenseNet / GraphNet).
|
||||
|
||||
This is host-side tooling only, has nothing to do with synthesizable
|
||||
RTL, and does not run on the FPGA (see spec §10: "Non mettere un
|
||||
interprete di istruzioni nell'FPGA").
|
||||
|
||||
Grammar (line-oriented, `;` starts a comment that runs to end of line,
|
||||
blank lines ignored):
|
||||
|
||||
NET dense
|
||||
INPUTS <n>
|
||||
LAYER <n_neurons> <relu|none>
|
||||
...
|
||||
END
|
||||
|
||||
NET graph
|
||||
INPUTS <n>
|
||||
NEURON <name> <relu|none> bias=<int>
|
||||
CONN <src> w=<int>
|
||||
...
|
||||
OUTPUT <name>
|
||||
...
|
||||
END
|
||||
|
||||
`<src>` in a CONN line is either a bare decimal integer (a literal
|
||||
signal id -- typically one of the network's inputs, 0..INPUTS-1) or
|
||||
the symbolic name of a previously declared NEURON.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Optional
|
||||
|
||||
|
||||
class NetasmSyntaxError(Exception):
|
||||
def __init__(self, message: str, line_no: int):
|
||||
super().__init__(f"line {line_no}: {message}")
|
||||
self.message = message
|
||||
self.line_no = line_no
|
||||
|
||||
|
||||
@dataclass
|
||||
class DenseLayer:
|
||||
n_neurons: int
|
||||
activation: str
|
||||
line: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class DenseNet:
|
||||
n_inputs: int
|
||||
layers: List[DenseLayer] = field(default_factory=list)
|
||||
kind: str = "dense"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Conn:
|
||||
src: str # literal id (decimal string) or symbolic neuron name
|
||||
weight: int
|
||||
line: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class Neuron:
|
||||
name: str
|
||||
activation: str
|
||||
bias: int
|
||||
conns: List[Conn] = field(default_factory=list)
|
||||
line: int = 0
|
||||
|
||||
|
||||
@dataclass
|
||||
class GraphNet:
|
||||
n_inputs: int
|
||||
neurons: List[Neuron] = field(default_factory=list)
|
||||
outputs: List[str] = field(default_factory=list)
|
||||
kind: str = "graph"
|
||||
|
||||
|
||||
def _strip_comment(line: str) -> str:
|
||||
idx = line.find(";")
|
||||
return line if idx < 0 else line[:idx]
|
||||
|
||||
|
||||
def _parse_kv(token: str, key: str, line_no: int) -> int:
|
||||
prefix = key + "="
|
||||
if not token.startswith(prefix):
|
||||
raise NetasmSyntaxError(f"expected '{key}=<int>', got '{token}'", line_no)
|
||||
try:
|
||||
return int(token[len(prefix):], 0)
|
||||
except ValueError:
|
||||
raise NetasmSyntaxError(f"invalid integer in '{token}'", line_no)
|
||||
|
||||
|
||||
def _check_activation(tok: str, line_no: int) -> str:
|
||||
t = tok.lower()
|
||||
if t not in ("relu", "none"):
|
||||
raise NetasmSyntaxError(f"unknown activation '{tok}' (expected relu|none)", line_no)
|
||||
return t
|
||||
|
||||
|
||||
def parse(text: str) -> "DenseNet | GraphNet":
|
||||
lines = text.splitlines()
|
||||
|
||||
net_kind: Optional[str] = None
|
||||
n_inputs: Optional[int] = None
|
||||
dense_layers: List[DenseLayer] = []
|
||||
graph_neurons: List[Neuron] = []
|
||||
graph_outputs: List[str] = []
|
||||
seen_names = set()
|
||||
cur_neuron: Optional[Neuron] = None
|
||||
ended = False
|
||||
|
||||
for i, raw in enumerate(lines, start=1):
|
||||
line = _strip_comment(raw).strip()
|
||||
if not line:
|
||||
continue
|
||||
|
||||
tokens = line.split()
|
||||
kw = tokens[0].upper()
|
||||
|
||||
if kw == "NET":
|
||||
if net_kind is not None:
|
||||
raise NetasmSyntaxError("duplicate NET directive", i)
|
||||
if len(tokens) != 2 or tokens[1].lower() not in ("dense", "graph"):
|
||||
raise NetasmSyntaxError("expected 'NET dense' or 'NET graph'", i)
|
||||
net_kind = tokens[1].lower()
|
||||
continue
|
||||
|
||||
if net_kind is None:
|
||||
raise NetasmSyntaxError("expected 'NET dense|graph' as the first directive", i)
|
||||
|
||||
if kw == "INPUTS":
|
||||
if n_inputs is not None:
|
||||
raise NetasmSyntaxError("duplicate INPUTS directive", i)
|
||||
if len(tokens) != 2:
|
||||
raise NetasmSyntaxError("expected 'INPUTS <n>'", i)
|
||||
try:
|
||||
n_inputs = int(tokens[1], 0)
|
||||
except ValueError:
|
||||
raise NetasmSyntaxError(f"invalid input count '{tokens[1]}'", i)
|
||||
if n_inputs <= 0:
|
||||
raise NetasmSyntaxError("INPUTS must be positive", i)
|
||||
continue
|
||||
|
||||
if n_inputs is None:
|
||||
raise NetasmSyntaxError("expected 'INPUTS <n>' before any layer/neuron", i)
|
||||
|
||||
if kw == "END":
|
||||
ended = True
|
||||
continue
|
||||
|
||||
if ended:
|
||||
raise NetasmSyntaxError("no directives allowed after END", i)
|
||||
|
||||
if net_kind == "dense":
|
||||
if kw != "LAYER":
|
||||
raise NetasmSyntaxError(f"unexpected directive '{tokens[0]}' in NET dense", i)
|
||||
if len(tokens) != 3:
|
||||
raise NetasmSyntaxError("expected 'LAYER <n_neurons> <relu|none>'", i)
|
||||
try:
|
||||
n_neurons = int(tokens[1], 0)
|
||||
except ValueError:
|
||||
raise NetasmSyntaxError(f"invalid neuron count '{tokens[1]}'", i)
|
||||
if n_neurons <= 0:
|
||||
raise NetasmSyntaxError("LAYER neuron count must be positive", i)
|
||||
activation = _check_activation(tokens[2], i)
|
||||
dense_layers.append(DenseLayer(n_neurons=n_neurons, activation=activation, line=i))
|
||||
continue
|
||||
|
||||
# net_kind == "graph"
|
||||
if kw == "NEURON":
|
||||
if len(tokens) != 4:
|
||||
raise NetasmSyntaxError(
|
||||
"expected 'NEURON <name> <relu|none> bias=<int>'", i
|
||||
)
|
||||
name = tokens[1]
|
||||
if name in seen_names or name.lstrip("-").isdigit():
|
||||
raise NetasmSyntaxError(f"duplicate or reserved neuron name '{name}'", i)
|
||||
seen_names.add(name)
|
||||
activation = _check_activation(tokens[2], i)
|
||||
bias = _parse_kv(tokens[3], "bias", i)
|
||||
if not (-128 <= bias <= 127):
|
||||
raise NetasmSyntaxError(f"bias {bias} out of INT8 range", i)
|
||||
cur_neuron = Neuron(name=name, activation=activation, bias=bias, line=i)
|
||||
graph_neurons.append(cur_neuron)
|
||||
continue
|
||||
|
||||
if kw == "CONN":
|
||||
if cur_neuron is None:
|
||||
raise NetasmSyntaxError("CONN outside of a NEURON block", i)
|
||||
if len(tokens) != 3:
|
||||
raise NetasmSyntaxError("expected 'CONN <src> w=<int>'", i)
|
||||
src = tokens[1]
|
||||
weight = _parse_kv(tokens[2], "w", i)
|
||||
if not (-128 <= weight <= 127):
|
||||
raise NetasmSyntaxError(f"weight {weight} out of INT8 range", i)
|
||||
cur_neuron.conns.append(Conn(src=src, weight=weight, line=i))
|
||||
continue
|
||||
|
||||
if kw == "OUTPUT":
|
||||
if len(tokens) != 2:
|
||||
raise NetasmSyntaxError("expected 'OUTPUT <name>'", i)
|
||||
graph_outputs.append(tokens[1])
|
||||
cur_neuron = None
|
||||
continue
|
||||
|
||||
raise NetasmSyntaxError(f"unexpected directive '{tokens[0]}' in NET graph", i)
|
||||
|
||||
if net_kind is None:
|
||||
raise NetasmSyntaxError("empty program: missing NET directive", len(lines) + 1)
|
||||
if not ended:
|
||||
raise NetasmSyntaxError("missing END directive", len(lines) + 1)
|
||||
if n_inputs is None:
|
||||
raise NetasmSyntaxError("missing INPUTS directive", len(lines) + 1)
|
||||
|
||||
if net_kind == "dense":
|
||||
if not dense_layers:
|
||||
raise NetasmSyntaxError("NET dense with no LAYER directives", len(lines) + 1)
|
||||
return DenseNet(n_inputs=n_inputs, layers=dense_layers)
|
||||
|
||||
if not graph_neurons:
|
||||
raise NetasmSyntaxError("NET graph with no NEURON directives", len(lines) + 1)
|
||||
if not graph_outputs:
|
||||
raise NetasmSyntaxError("NET graph with no OUTPUT directive", len(lines) + 1)
|
||||
return GraphNet(n_inputs=n_inputs, neurons=graph_neurons, outputs=graph_outputs)
|
||||
@@ -1,285 +0,0 @@
|
||||
import importlib.util
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
# Load this repo's tools/netasm package by explicit file path rather
|
||||
# than via `import tools.netasm`: some environments put an unrelated
|
||||
# `tools` namespace package earlier on PYTHONPATH (e.g. Project
|
||||
# Trellis's own tools/ directory), which would otherwise shadow this
|
||||
# repo's tools/ and break the dotted import regardless of sys.path
|
||||
# ordering tricks.
|
||||
_PKG_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
||||
_spec = importlib.util.spec_from_file_location(
|
||||
"netasm_under_test", os.path.join(_PKG_DIR, "__init__.py"),
|
||||
submodule_search_locations=[_PKG_DIR],
|
||||
)
|
||||
_netasm = importlib.util.module_from_spec(_spec)
|
||||
sys.modules["netasm_under_test"] = _netasm
|
||||
_spec.loader.exec_module(_netasm)
|
||||
|
||||
parse = _netasm.parse
|
||||
NetasmSyntaxError = _netasm.NetasmSyntaxError
|
||||
GraphNet = _netasm.GraphNet
|
||||
DenseNet = _netasm.DenseNet
|
||||
assemble_graph = _netasm.assemble_graph
|
||||
assemble_dense = _netasm.assemble_dense
|
||||
NetasmError = _netasm.NetasmError
|
||||
F = importlib.import_module("netasm_under_test.frames")
|
||||
|
||||
# The worked example from spec §3 / already validated byte-exact in
|
||||
# sim/graph_format_tb.v and end-to-end in sim/graph_engine_tb.v and
|
||||
# sim/spi_neuron_top_graph_tb.v: 4 inputs, n4 = relu(x0*5+x1*(-3)+2),
|
||||
# n5 = x2*7 + act[n4]*2, output = n5.
|
||||
GRAPH_SRC = """
|
||||
; worked example, spec §3
|
||||
NET graph
|
||||
INPUTS 4
|
||||
NEURON n4 relu bias=2
|
||||
CONN 0 w=5
|
||||
CONN 1 w=-3
|
||||
NEURON n5 none bias=0
|
||||
CONN n4 w=2
|
||||
CONN 2 w=7
|
||||
OUTPUT n5
|
||||
END
|
||||
"""
|
||||
|
||||
|
||||
class TestParser(unittest.TestCase):
|
||||
def test_parses_graph(self):
|
||||
net = parse(GRAPH_SRC)
|
||||
self.assertIsInstance(net, GraphNet)
|
||||
self.assertEqual(net.n_inputs, 4)
|
||||
self.assertEqual([n.name for n in net.neurons], ["n4", "n5"])
|
||||
self.assertEqual(net.outputs, ["n5"])
|
||||
|
||||
def test_parses_dense(self):
|
||||
src = """
|
||||
NET dense
|
||||
INPUTS 256
|
||||
LAYER 64 relu
|
||||
LAYER 16 relu
|
||||
LAYER 4 none
|
||||
END
|
||||
"""
|
||||
net = parse(src)
|
||||
self.assertIsInstance(net, DenseNet)
|
||||
self.assertEqual(net.n_inputs, 256)
|
||||
self.assertEqual([l.n_neurons for l in net.layers], [64, 16, 4])
|
||||
self.assertEqual([l.activation for l in net.layers], ["relu", "relu", "none"])
|
||||
|
||||
def test_missing_net_directive(self):
|
||||
with self.assertRaises(NetasmSyntaxError):
|
||||
parse("INPUTS 4\nEND\n")
|
||||
|
||||
def test_missing_end(self):
|
||||
with self.assertRaises(NetasmSyntaxError):
|
||||
parse("NET graph\nINPUTS 4\nNEURON n0 relu bias=0\n CONN 0 w=1\nOUTPUT n0\n")
|
||||
|
||||
def test_conn_outside_neuron(self):
|
||||
with self.assertRaises(NetasmSyntaxError):
|
||||
parse("NET graph\nINPUTS 4\nCONN 0 w=1\nEND\n")
|
||||
|
||||
def test_bad_weight_range(self):
|
||||
with self.assertRaises(NetasmSyntaxError):
|
||||
parse(
|
||||
"NET graph\nINPUTS 4\nNEURON n0 relu bias=0\n CONN 0 w=200\n"
|
||||
"OUTPUT n0\nEND\n"
|
||||
)
|
||||
|
||||
def test_comments_and_blank_lines_ignored(self):
|
||||
src = "; comment\nNET graph\n\nINPUTS 4 ; trailing comment\n" \
|
||||
"NEURON n0 relu bias=0\n CONN 0 w=1\nOUTPUT n0\nEND\n"
|
||||
net = parse(src)
|
||||
self.assertEqual(net.n_inputs, 4)
|
||||
|
||||
|
||||
class TestGraphAssembler(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.net = parse(GRAPH_SRC)
|
||||
|
||||
def test_id_assignment(self):
|
||||
layout = assemble_graph(self.net, parallel=2)
|
||||
self.assertEqual(layout.id_of["n4"], 4)
|
||||
self.assertEqual(layout.id_of["n5"], 5)
|
||||
self.assertEqual(layout.num_neurons, 2)
|
||||
self.assertEqual(layout.n_out, 1)
|
||||
self.assertEqual(layout.n_total, 6) # 4 inputs + 2 neurons
|
||||
|
||||
def test_byte_exact_descriptor_and_edges_no_padding(self):
|
||||
# PARALLEL=2, n_conn=2 for both neurons -> n_conn_padded=2,
|
||||
# i.e. no padding edges at all: exactly matches the byte
|
||||
# layout hand-verified in sim/graph_format_tb.v.
|
||||
layout = assemble_graph(
|
||||
self.net, parallel=2, table_base=0x000000, edges_base=0x000100
|
||||
)
|
||||
|
||||
n4_edges_addr = 0x000100
|
||||
n5_edges_addr = 0x000100 + 8 # n4 has exactly 2 edges, 4 bytes each, no padding
|
||||
|
||||
expected_desc = bytes([
|
||||
# n4: conn_ptr, n_conn=2, out_id=4, act=RELU(1), bias=2, reserved
|
||||
(n4_edges_addr >> 16) & 0xFF, (n4_edges_addr >> 8) & 0xFF, n4_edges_addr & 0xFF,
|
||||
0x00, 0x02,
|
||||
0x00, 0x04,
|
||||
0x01,
|
||||
0x02,
|
||||
0x00, 0x00,
|
||||
# n5: conn_ptr, n_conn=2, out_id=5, act=NONE(0), bias=0, reserved
|
||||
(n5_edges_addr >> 16) & 0xFF, (n5_edges_addr >> 8) & 0xFF, n5_edges_addr & 0xFF,
|
||||
0x00, 0x02,
|
||||
0x00, 0x05,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00, 0x00,
|
||||
])
|
||||
self.assertEqual(layout.descriptor_bytes, expected_desc)
|
||||
|
||||
expected_n4_edges = bytes([
|
||||
0x00, 0x00, 0x05, 0x00, # src=0, w=5
|
||||
0x00, 0x01, (-3) & 0xFF, 0x00, # src=1, w=-3
|
||||
])
|
||||
expected_n5_edges = bytes([
|
||||
0x00, 0x04, 0x02, 0x00, # src=4 (n4), w=2
|
||||
0x00, 0x02, 0x07, 0x00, # src=2, w=7
|
||||
])
|
||||
self.assertEqual(layout.edge_bytes["n4"], expected_n4_edges)
|
||||
self.assertEqual(layout.edge_bytes["n5"], expected_n5_edges)
|
||||
|
||||
def test_parallel_padding(self):
|
||||
# Same graph, PARALLEL=4 -> n_conn=2 pads to 4 (2 extra
|
||||
# zero-weight, src=0 edges per neuron), as exercised end to
|
||||
# end in sim/graph_engine_tb.v.
|
||||
layout = assemble_graph(self.net, parallel=4, max_conn=8)
|
||||
self.assertEqual(layout.n_conn_padded["n4"], 4)
|
||||
self.assertEqual(layout.n_conn_padded["n5"], 4)
|
||||
self.assertEqual(len(layout.edge_bytes["n4"]), 16)
|
||||
# padding tail is (src=0, w=0, reserved=0)
|
||||
self.assertEqual(layout.edge_bytes["n4"][8:], bytes(8))
|
||||
self.assertEqual(layout.edge_bytes["n5"][8:], bytes(8))
|
||||
# descriptor's n_conn is the REAL count, not padded (§4.2)
|
||||
self.assertEqual(layout.descriptor_bytes[3:5], bytes([0x00, 0x02]))
|
||||
|
||||
def test_zero_conn_neuron_still_pads_to_one_group(self):
|
||||
src = (
|
||||
"NET graph\nINPUTS 2\n"
|
||||
"NEURON n2 none bias=5\nOUTPUT n2\nEND\n"
|
||||
)
|
||||
net = parse(src)
|
||||
layout = assemble_graph(net, parallel=4, max_conn=8)
|
||||
self.assertEqual(layout.n_conn_padded["n2"], 4)
|
||||
|
||||
def test_frames_sequence(self):
|
||||
layout = assemble_graph(self.net, parallel=2)
|
||||
labels = [fr.label.split("(")[0] for fr in layout.frames]
|
||||
self.assertEqual(
|
||||
labels,
|
||||
[
|
||||
"WRITE_RAM", # table
|
||||
"WRITE_RAM", # n4 edges
|
||||
"WRITE_RAM", # n5 edges
|
||||
"SET_NET_TYPE",
|
||||
"SET_BASE", # x_base
|
||||
"SET_BASE", # table_base
|
||||
"SET_BASE", # out_base (buf_a_base)
|
||||
"SET_BASE", # n_inputs_real (N_in)
|
||||
"SET_BASE", # num_neurons_graph
|
||||
"SET_BASE", # n_out
|
||||
"RUN_NETWORK",
|
||||
],
|
||||
)
|
||||
run_frame = layout.frames[-1]
|
||||
self.assertEqual(run_frame.data[0], F.OP_RUN_NETWORK)
|
||||
|
||||
# ---- compile-time guard tests (mirrors sim/graph_engine_guard_tb.v) ----
|
||||
|
||||
def test_self_reference_rejected(self):
|
||||
# n1 references itself; n2 (not n1) is the actual OUTPUT, so
|
||||
# this isolates the src_id < out_id check from the separate
|
||||
# "output used as source" check below.
|
||||
src = (
|
||||
"NET graph\nINPUTS 1\n"
|
||||
"NEURON n1 relu bias=0\n CONN n1 w=1\n"
|
||||
"NEURON n2 relu bias=0\n CONN 0 w=1\n"
|
||||
"OUTPUT n2\nEND\n"
|
||||
)
|
||||
net = parse(src)
|
||||
with self.assertRaisesRegex(NetasmError, "not a strictly earlier signal"):
|
||||
assemble_graph(net, parallel=2)
|
||||
|
||||
def test_forward_reference_rejected(self):
|
||||
# n1 references n2, declared AFTER it; n3 (not n2) is the
|
||||
# actual OUTPUT, so n2 is an ordinary (non-output) neuron and
|
||||
# this isolates the src_id < out_id check from "output used
|
||||
# as source" below.
|
||||
src = (
|
||||
"NET graph\nINPUTS 1\n"
|
||||
"NEURON n1 relu bias=0\n CONN n2 w=1\n"
|
||||
"NEURON n2 relu bias=0\n CONN 0 w=1\n"
|
||||
"NEURON n3 relu bias=0\n CONN n1 w=1\n"
|
||||
"OUTPUT n3\nEND\n"
|
||||
)
|
||||
net = parse(src)
|
||||
with self.assertRaisesRegex(NetasmError, "not a strictly earlier signal"):
|
||||
assemble_graph(net, parallel=2)
|
||||
|
||||
def test_output_used_as_source_rejected(self):
|
||||
src = (
|
||||
"NET graph\nINPUTS 2\n"
|
||||
"NEURON n2 relu bias=0\n CONN 0 w=1\n"
|
||||
"NEURON n3 relu bias=0\n CONN n2 w=1\n"
|
||||
"OUTPUT n2\nOUTPUT n3\nEND\n"
|
||||
)
|
||||
net = parse(src)
|
||||
with self.assertRaisesRegex(NetasmError, "used as a source"):
|
||||
assemble_graph(net, parallel=2)
|
||||
|
||||
def test_max_conn_overflow_rejected(self):
|
||||
conns = "\n".join(f" CONN 0 w=1" for _ in range(10))
|
||||
src = f"NET graph\nINPUTS 1\nNEURON n1 relu bias=0\n{conns}\nOUTPUT n1\nEND\n"
|
||||
net = parse(src)
|
||||
with self.assertRaisesRegex(NetasmError, "MAX_CONN"):
|
||||
assemble_graph(net, parallel=4, max_conn=8) # 10 conns pad to 12 > 8
|
||||
|
||||
def test_n_total_overflow_rejected(self):
|
||||
layout_ok = assemble_graph(self.net, parallel=2, n_total=6) # exactly fits
|
||||
self.assertEqual(layout_ok.n_total, 6)
|
||||
with self.assertRaisesRegex(NetasmError, "N_TOTAL"):
|
||||
assemble_graph(self.net, parallel=2, n_total=5)
|
||||
|
||||
def test_undeclared_output_rejected(self):
|
||||
src = "NET graph\nINPUTS 1\nNEURON n1 relu bias=0\n CONN 0 w=1\nOUTPUT ghost\nEND\n"
|
||||
net = parse(src)
|
||||
with self.assertRaisesRegex(NetasmError, "undeclared"):
|
||||
assemble_graph(net, parallel=2)
|
||||
|
||||
|
||||
class TestDenseAssembler(unittest.TestCase):
|
||||
def test_layout_and_descriptor(self):
|
||||
src = "NET dense\nINPUTS 8\nLAYER 4 relu\nLAYER 2 none\nEND\n"
|
||||
net = parse(src)
|
||||
layout = assemble_dense(net, parallel=4, table_base=0, weights_base=0x1000)
|
||||
|
||||
self.assertEqual(layout.layers[0].n_inputs_real, 8)
|
||||
self.assertEqual(layout.layers[0].n_neurons_real, 4)
|
||||
self.assertEqual(layout.layers[1].n_inputs_real, 4)
|
||||
self.assertEqual(layout.layers[1].n_neurons_real, 2)
|
||||
|
||||
# layer0: w_base at weights_base, 8*4=32 bytes, then bias 4 bytes
|
||||
self.assertEqual(layout.layers[0].w_base, 0x1000)
|
||||
self.assertEqual(layout.layers[0].bias_addr, 0x1000 + 32)
|
||||
# layer1 follows immediately after layer0's bias region
|
||||
self.assertEqual(layout.layers[1].w_base, 0x1000 + 32 + 4)
|
||||
|
||||
self.assertEqual(len(layout.descriptor_bytes), 11 * 2)
|
||||
|
||||
def test_non_multiple_of_parallel_rejected(self):
|
||||
src = "NET dense\nINPUTS 6\nLAYER 4 relu\nEND\n" # 6 not a multiple of 4
|
||||
net = parse(src)
|
||||
with self.assertRaisesRegex(NetasmError, "PARALLEL"):
|
||||
assemble_dense(net, parallel=4)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -1,116 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generates synth/ecp5/spi_neuron_top.lpf (LOCATE/IOBUF constraints) for
|
||||
spi_neuron_top's SPI + PSRAM ports on the real LFE5U-45F-8BG381C part,
|
||||
using Project Trellis's own device database as the source of ball/bank/
|
||||
dual-function data (the same data nextpnr-ecp5 itself uses) -- not
|
||||
invented numbers.
|
||||
|
||||
Requires prjtrellis installed (Homebrew: `brew install prjtrellis`) and
|
||||
its iodb.json for LFE5U-45F. See docs/FPGA-Neural-Hardware-Design.md §7
|
||||
for the full placement rationale (bank/die-edge geometry, why banks 2+3
|
||||
hold the PSRAM bus and bank 7 holds SPI/clock/reset).
|
||||
|
||||
Re-run this whenever the port list of rtl/spi_neuron_top.v's top-level
|
||||
SPI/PSRAM interface changes (ADDR_WIDTH, MEM_DATA_WIDTH, etc.) -- it does
|
||||
NOT try to read the RTL; the port list/widths are hardcoded below and
|
||||
must be kept in sync by hand.
|
||||
"""
|
||||
|
||||
import json
|
||||
import re
|
||||
import glob
|
||||
import sys
|
||||
|
||||
CLK_BALL = "H5" # GR_PCLK7_0, bank 7 -- dedicated global clock pad
|
||||
ADDR_BITS = 23 # ADDR_WIDTH (byte address); only [21:0] carry real address, see §3
|
||||
DATA_BITS = 16 # MEM_DATA_WIDTH
|
||||
|
||||
def find_iodb():
|
||||
candidates = glob.glob(
|
||||
"/opt/homebrew/Cellar/prjtrellis/*/share/trellis/database/ECP5/LFE5U-45F/iodb.json"
|
||||
) + glob.glob(
|
||||
"/usr/share/trellis/database/ECP5/LFE5U-45F/iodb.json"
|
||||
)
|
||||
if not candidates:
|
||||
sys.exit("prjtrellis iodb.json not found -- install prjtrellis (brew install prjtrellis)")
|
||||
return candidates[0]
|
||||
|
||||
|
||||
def load_balls(iodb_path, package="CABGA381"):
|
||||
d = json.load(open(iodb_path))
|
||||
pkg = d["packages"][package]
|
||||
meta_idx = {}
|
||||
for m in d["pio_metadata"]:
|
||||
meta_idx.setdefault((m["col"], m["row"], m["pio"]), []).append(m)
|
||||
out = {}
|
||||
for ball, info in pkg.items():
|
||||
key = (info["col"], info["row"], info["pio"])
|
||||
metas = meta_idx.get(key, [])
|
||||
bank = metas[0]["bank"] if metas else None
|
||||
funcs = sorted(set(m.get("function", "") for m in metas if m.get("function")))
|
||||
out[ball] = dict(col=info["col"], row=info["row"], bank=bank, funcs=funcs)
|
||||
return out
|
||||
|
||||
|
||||
def bank_balls(rows, bank, exclude=()):
|
||||
items = [(b, v) for b, v in rows.items() if v["bank"] == bank and b not in exclude]
|
||||
plain = sorted((x for x in items if not x[1]["funcs"]), key=lambda x: (x[1]["row"], x[1]["col"], x[0]))
|
||||
special = sorted((x for x in items if x[1]["funcs"]), key=lambda x: (x[1]["row"], x[1]["col"], x[0]))
|
||||
return plain + special
|
||||
|
||||
|
||||
def assign(rows):
|
||||
psram_pool = bank_balls(rows, 2) + bank_balls(rows, 3)
|
||||
ctrl_pool = bank_balls(rows, 7, exclude={CLK_BALL})
|
||||
|
||||
a = {}
|
||||
for i, (ball, _) in enumerate(psram_pool[0:ADDR_BITS - 1]):
|
||||
a[f"psram_a[{i}]"] = ball
|
||||
for i, (ball, _) in enumerate(psram_pool[ADDR_BITS - 1:ADDR_BITS - 1 + DATA_BITS]):
|
||||
a[f"psram_dq[{i}]"] = ball
|
||||
ctrl_names = ["psram_ce_n", "psram_oe_n", "psram_we_n", "psram_lb_n", "psram_ub_n", "psram_zz_n"]
|
||||
for name, (ball, _) in zip(ctrl_names, psram_pool[ADDR_BITS - 1 + DATA_BITS:ADDR_BITS - 1 + DATA_BITS + 6]):
|
||||
a[name] = ball
|
||||
a[f"psram_a[{ADDR_BITS - 1}]"] = psram_pool[ADDR_BITS - 1 + DATA_BITS + 6][0] # always-0 spare bit
|
||||
|
||||
# Application SPI + reset + host attention pins (irq_n/data_ready_n,
|
||||
# added 2026-09-03), all in bank 7 alongside clk -- kept away from
|
||||
# the PSRAM bus (banks 2+3) per the same "opposite edges" rationale
|
||||
# as the SPI signals. flash_sclk/flash_mosi/flash_miso/flash_cs_n
|
||||
# (added 2026-09-04, revised same day to drop the USRMCLK/CCLK
|
||||
# coupling -- see rtl/spi_flash_master.v's header) join the same
|
||||
# pool for the same reason -- this is a fully independent,
|
||||
# ordinary-GPIO SPI bus toward the boot/persistence flash
|
||||
# (rtl/spi_flash_master.v), physically distinct from both the host
|
||||
# SPI above and the dedicated config-SPI pins (never touched by
|
||||
# user logic, see docs/FPGA-Neural-Hardware-Design.md §6). No pin
|
||||
# is shared with any ECP5 config primitive.
|
||||
# flash_sclk appended LAST (not inserted among the other flash
|
||||
# signals) so this regeneration stays additive: flash_mosi/
|
||||
# flash_miso/flash_cs_n keep the exact balls already committed to
|
||||
# the datasheet/schematic notes, only one genuinely new ball is
|
||||
# allocated for flash_sclk.
|
||||
spi_names = ["sclk", "mosi", "miso", "cs_n", "rst", "irq_n", "data_ready_n",
|
||||
"flash_mosi", "flash_miso", "flash_cs_n", "flash_sclk"]
|
||||
for name, (ball, _) in zip(spi_names, ctrl_pool[0:11]):
|
||||
a[name] = ball
|
||||
a["clk"] = CLK_BALL
|
||||
return a
|
||||
|
||||
|
||||
def write_lpf(assignment, path):
|
||||
lines = ["BLOCK ASYNCPATHS;", "BLOCK RESETPATHS;", ""]
|
||||
for sig, ball in sorted(assignment.items()):
|
||||
lines.append(f'LOCATE COMP "{sig}" SITE "{ball}";')
|
||||
lines.append(f'IOBUF PORT "{sig}" IO_TYPE=LVCMOS33;')
|
||||
lines.append("")
|
||||
open(path, "w").write("\n".join(lines))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
out_path = sys.argv[1] if len(sys.argv) > 1 else "synth/ecp5/spi_neuron_top.lpf"
|
||||
rows = load_balls(find_iodb())
|
||||
assignment = assign(rows)
|
||||
write_lpf(assignment, out_path)
|
||||
print(f"wrote {len(assignment)} signal constraints to {out_path}")
|
||||
@@ -1,175 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Fase 0 (docs/validation/00-inventario.md) regression runner.
|
||||
|
||||
No such script existed in the repo before this -- every prior "N testbenches,
|
||||
all pass" claim in WORKLOG.md was produced by manually assembling per-test
|
||||
iverilog command lines, never re-run from a single reproducible harness. This
|
||||
script builds the module dependency graph directly from the source (regex
|
||||
over instantiation sites), not from memory/WORKLOG claims, then compiles and
|
||||
runs every sim/*_tb.v fresh with `iverilog -g2012` + `vvp`.
|
||||
|
||||
Usage: python3 tools/run_regression.py [--keep] [pattern]
|
||||
--keep keep the compiled .out files in /tmp/regression (default: cleaned)
|
||||
pattern only run testbenches whose filename contains this substring
|
||||
"""
|
||||
import glob
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
# Testbenches that are DELIBERATELY meant to fail elaboration (they verify a
|
||||
# compile-time guard by trying to violate it -- see each file's own header
|
||||
# comment for the citation). A naive PASS/FAIL-marker scan misclassifies
|
||||
# these as broken; confirmed by reading the source, not assumed.
|
||||
EXPECTED_COMPILE_FAIL = {
|
||||
"neuron_parallel_guard_negative_degenerate",
|
||||
"neuron_parallel_guard_negative_nonmultiple",
|
||||
"neuron_parallel_bug002_n_inputs_zero",
|
||||
}
|
||||
# Benchmarks: print measured numbers, no PASS/FAIL verdict by design (see
|
||||
# each file's own header -- same category as sim/flash_latency_bench.v,
|
||||
# which isn't even named *_tb.v and so isn't picked up by this glob at all,
|
||||
# an inconsistent naming convention worth flagging in the inventory).
|
||||
BENCHMARK_NO_VERDICT = {
|
||||
"graph_engine_bandwidth",
|
||||
}
|
||||
|
||||
# Every module-defining file under rtl/ and the sim/ behavioral models used
|
||||
# as test doubles (flash_model.v, psram_model.v) -- sim/top.v is EXCLUDED
|
||||
# deliberately: it's dead code (references a FRAC_BITS parameter that no
|
||||
# longer exists on neuron_parallel.v, confirmed failing to elaborate on its
|
||||
# own, see docs/validation/00-inventario.md).
|
||||
SOURCE_FILES = sorted(
|
||||
glob.glob(os.path.join(REPO, "rtl", "*.v"))
|
||||
+ [os.path.join(REPO, "sim", "flash_model.v"), os.path.join(REPO, "sim", "psram_model.v")]
|
||||
)
|
||||
|
||||
MODULE_RE = re.compile(r"^\s*module\s+([A-Za-z_][A-Za-z0-9_]*)", re.MULTILINE)
|
||||
# Matches "modname instname (" or "modname #(" instantiation sites, not
|
||||
# "module modname" definitions and not plain calls/keywords.
|
||||
INST_RE = re.compile(
|
||||
r"^\s*([A-Za-z_][A-Za-z0-9_]*)\s+(?:#\s*\(|[A-Za-z_][A-Za-z0-9_]*\s*\()",
|
||||
re.MULTILINE,
|
||||
)
|
||||
KEYWORDS = {
|
||||
"if", "else", "for", "while", "case", "begin", "end", "assign", "wire",
|
||||
"reg", "input", "output", "inout", "parameter", "localparam", "function",
|
||||
"task", "always", "initial", "module", "endmodule", "generate",
|
||||
"endgenerate", "genvar", "integer", "real", "signed", "unsigned",
|
||||
}
|
||||
|
||||
def module_defined_in(path):
|
||||
txt = open(path, encoding="utf-8", errors="replace").read()
|
||||
return MODULE_RE.findall(txt)
|
||||
|
||||
def instantiated_modules(path):
|
||||
txt = open(path, encoding="utf-8", errors="replace").read()
|
||||
found = set(INST_RE.findall(txt)) - KEYWORDS
|
||||
return found
|
||||
|
||||
def build_module_map():
|
||||
m = {}
|
||||
for f in SOURCE_FILES:
|
||||
for name in module_defined_in(f):
|
||||
m.setdefault(name, f)
|
||||
return m
|
||||
|
||||
def resolve_deps(tb_path, module_map):
|
||||
needed_files = {tb_path}
|
||||
frontier = instantiated_modules(tb_path)
|
||||
seen_files = set()
|
||||
while frontier:
|
||||
mod = frontier.pop()
|
||||
if mod not in module_map:
|
||||
continue
|
||||
f = module_map[mod]
|
||||
if f in needed_files:
|
||||
continue
|
||||
needed_files.add(f)
|
||||
if f in seen_files:
|
||||
continue
|
||||
seen_files.add(f)
|
||||
frontier |= instantiated_modules(f)
|
||||
return sorted(needed_files)
|
||||
|
||||
def main():
|
||||
keep = "--keep" in sys.argv
|
||||
args = [a for a in sys.argv[1:] if a != "--keep"]
|
||||
pattern = args[0] if args else ""
|
||||
|
||||
module_map = build_module_map()
|
||||
tbs = sorted(glob.glob(os.path.join(REPO, "sim", "*_tb.v")))
|
||||
tbs = [t for t in tbs if pattern in os.path.basename(t)]
|
||||
|
||||
results = []
|
||||
workdir = tempfile.mkdtemp(prefix="regression_")
|
||||
for tb in tbs:
|
||||
name = os.path.basename(tb)[:-len("_tb.v")]
|
||||
files = resolve_deps(tb, module_map)
|
||||
out = os.path.join(workdir, name + ".out")
|
||||
cc = subprocess.run(
|
||||
["iverilog", "-g2012", "-o", out] + files,
|
||||
cwd=REPO, capture_output=True, text=True,
|
||||
)
|
||||
if cc.returncode != 0:
|
||||
if name in EXPECTED_COMPILE_FAIL:
|
||||
results.append((name, "PASS (compile-time guard fired as designed)", cc.stderr.strip().splitlines()[-2:], files))
|
||||
else:
|
||||
results.append((name, "COMPILE_FAIL", cc.stderr.strip(), files))
|
||||
continue
|
||||
elif name in EXPECTED_COMPILE_FAIL:
|
||||
results.append((name, "FAIL (was expected to NOT compile, but it compiled)", [], files))
|
||||
continue
|
||||
run = subprocess.run(["vvp", out], cwd=REPO, capture_output=True, text=True, timeout=120)
|
||||
combined = run.stdout + run.stderr
|
||||
low = combined.lower()
|
||||
if name in BENCHMARK_NO_VERDICT:
|
||||
status = "BENCHMARK (no pass/fail verdict by design)" if run.returncode == 0 else f"RUNTIME_ERROR(rc={run.returncode})"
|
||||
elif "fail" in low and "PASSED" not in combined and "PASS" not in combined:
|
||||
status = "FAIL"
|
||||
elif run.returncode != 0:
|
||||
status = f"RUNTIME_ERROR(rc={run.returncode})"
|
||||
elif "PASSED" in combined or "PASS" in combined or "ALL TESTS" in combined:
|
||||
status = "PASS"
|
||||
else:
|
||||
status = "UNKNOWN (no PASS/FAIL marker found)"
|
||||
results.append((name, status, combined.strip().splitlines()[-3:], files))
|
||||
|
||||
print(f"{'TESTBENCH':45s} {'RESULT'}")
|
||||
print("-" * 70)
|
||||
n_pass = n_fail = n_other = 0
|
||||
for name, status, tail, files in results:
|
||||
print(f"{name:45s} {status}")
|
||||
if status.startswith("PASS"):
|
||||
n_pass += 1
|
||||
elif status.startswith("BENCHMARK"):
|
||||
n_other += 1
|
||||
for line in (tail if isinstance(tail, list) else [tail]):
|
||||
print(f" | {line}")
|
||||
elif status.startswith("FAIL") or status.startswith("COMPILE_FAIL") or status.startswith("RUNTIME_ERROR"):
|
||||
n_fail += 1
|
||||
for line in (tail if isinstance(tail, list) else [tail]):
|
||||
print(f" | {line}")
|
||||
else:
|
||||
n_other += 1
|
||||
for line in (tail if isinstance(tail, list) else [tail]):
|
||||
print(f" | {line}")
|
||||
|
||||
print("-" * 70)
|
||||
print(f"TOTAL: {len(results)} PASS: {n_pass} FAIL/ERROR: {n_fail} OTHER/UNKNOWN: {n_other}")
|
||||
|
||||
if not keep:
|
||||
import shutil
|
||||
shutil.rmtree(workdir, ignore_errors=True)
|
||||
else:
|
||||
print(f"Compiled binaries kept in {workdir}")
|
||||
|
||||
sys.exit(1 if (n_fail or n_other) else 0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,313 +0,0 @@
|
||||
010102010000000000000003
|
||||
01010201000003e8000003eb
|
||||
02010101000003e8000003eb
|
||||
bd4be50f0018cd950018b85f
|
||||
ff7afec3ffe201f6ffe201f6
|
||||
0a733a08ffefd14affefd798
|
||||
0cc49dadfff87fccfff89d15
|
||||
1d9b7be4000dc1da000da8f5
|
||||
518e08db0006102e0005eaf4
|
||||
020873adffe94b82ffe92649
|
||||
4586613effe49f1fffe495bb
|
||||
5dc3db5efffb7993fffb55d4
|
||||
000d8ec2ffe7b08bffe7cc27
|
||||
6a2d0d24ffff2aeeffff3f64
|
||||
9fdb2eeefffd2e32fffd38fb
|
||||
60e536130005083e00050220
|
||||
fcbe4fa5ffe9f34dffe9d840
|
||||
1468468effeefd23ffeee617
|
||||
c6d8c7c40015fa85001610f1
|
||||
729062190001366100010e13
|
||||
3625df60ffe6d55effe6d0cc
|
||||
6ca9d49afffc4da4fffc3a78
|
||||
dff589f8ffe8da9affe8dfbd
|
||||
4a8439c1fff44c47fff41a68
|
||||
f838cdd7ffe95c12ffe9627d
|
||||
7c11807d0019ab16001974d2
|
||||
ec3d9232001e5c0d001e41cd
|
||||
e796233d000236be0002496f
|
||||
75d886370005ed470005c0c9
|
||||
4b542a430019d8150019fbaf
|
||||
c6ff8ebc0018ab880018ca0a
|
||||
0191475a001b17e7001b306e
|
||||
89a8be3200066e1600068a1a
|
||||
c4b7555f0000e3a80001144f
|
||||
d076684effed2df2ffed3782
|
||||
5640429ffffb8ddafffb8a58
|
||||
4117ca88ffeaab8effeacab5
|
||||
a8c8576ffff92268fff95b61
|
||||
3699aae0fffcb954fffcae5a
|
||||
22a650990009702e0009440a
|
||||
01aed7a8fffa3798fffa455e
|
||||
8f85a70afff59ed4fff5d1a5
|
||||
75b451bdfff480bbfff448cc
|
||||
e807fc26000e4f58000e4e18
|
||||
8dce0e6f001c8f7c001cac04
|
||||
f212f33cfff61190fff60d88
|
||||
47e8493efff4c5d7fff4d0dd
|
||||
90a6ba8e00065c850006a311
|
||||
06467307ffeb5f30ffeb63f9
|
||||
df01ea67fffd474cfffd3e51
|
||||
57dbef48fffb3582fffb2427
|
||||
d0e0a190000786790007b609
|
||||
18bf4e1a00000bed00000dc1
|
||||
4d0c90c5fff9f65ffffa13cb
|
||||
bd5ac4faffe1c904ffe1b2de
|
||||
d351238a0005b7e500059986
|
||||
cca902e5ffe4fea9ffe5101f
|
||||
2aee00f9ffefcb56ffefc862
|
||||
262d65e2001610e600160bbe
|
||||
e83c7786ffe45874ffe41a1e
|
||||
c0d3b71afff8091afff80cf0
|
||||
158651e4001a1dfb001a0b1d
|
||||
2528ed6d000f9846000f95f7
|
||||
818d72c300040eda00042cbd
|
||||
569a14c1ffe35fdeffe338ae
|
||||
c65666fdffec908bffec7bdd
|
||||
8b2b8c8900056c0000058e45
|
||||
da075361ffe91ba1ffe93a0a
|
||||
d1b323befff280c4fff285e1
|
||||
22a36a4efff4570cfff46afe
|
||||
a2e5e8a5000a98d5000aab47
|
||||
1806ddb6000ebe28000ec8d6
|
||||
cc0f01f0ffeccfa4ffeccc88
|
||||
e1f88b06000aaeec000aad26
|
||||
f9a0742cffeba0b8ffebb748
|
||||
dd701d67ffee5b3bffee5796
|
||||
6ee89cbefff5ced2fff5de4a
|
||||
f764246d00000bbe0000178e
|
||||
d9e7ec75ffe6106bffe60b16
|
||||
1087d468000a1aea000a017a
|
||||
fb4c4542000408cf0004191d
|
||||
ad8513ddffebfdf4ffec233c
|
||||
c857dd2cffedff1fffede613
|
||||
f58610e00000ea550000ed93
|
||||
e08d873e000a2688000a179a
|
||||
5a5805befff4fa3cfff517e2
|
||||
28be8b00001cbe7c001cb42c
|
||||
c6b09528fff33d6afff33ed2
|
||||
5104857c00026c25000231d5
|
||||
0dcf3a68ffe54401ffe55914
|
||||
005098cd000fe29c000ff754
|
||||
0fe227a5ffedd757ffedc7b8
|
||||
02242eb20012993900128b7d
|
||||
1c0fdccc001a4bf8001a54ec
|
||||
fbad7b4d00175e8e0017852c
|
||||
edf7978b0008510f000881b7
|
||||
be1290d900075546000761b2
|
||||
5f82de74000c0f56000bd12c
|
||||
3fd736d4fff5aa50fff596f1
|
||||
158cb806ffeadfcfffead49b
|
||||
f9109392fff281cafff2b030
|
||||
24d9bcdefff14a52fff14dde
|
||||
ce987afeffee4aa2ffee5dfe
|
||||
5bd538e8001d54e6001d405d
|
||||
e295dbab0011dd3b0011f60e
|
||||
98d4b1300000c8ee0000cbfe
|
||||
d20d3e3cfff46124fff46d56
|
||||
bbb98c4800025276000244f9
|
||||
6d7d0d280010e58000111cc1
|
||||
e46e3766ffe429d7ffe433b9
|
||||
16e45fd0000814130007ffdb
|
||||
e9c9ca810017828e0017a249
|
||||
acfb04c9ffefbf47ffefc00f
|
||||
6214fc7bffea734fffea790b
|
||||
723a814b0011787a00116d19
|
||||
931e969a0013e2b70014002d
|
||||
8070984ffff40561fff3ad49
|
||||
667a3b760000eb8f0001375d
|
||||
f5826451fff6d249fff6f757
|
||||
60be22ba0005dc600005ba54
|
||||
e7e33a56001b4244001b5895
|
||||
2e56624300007ae20000a3fc
|
||||
7e8c3039000919e10008eb79
|
||||
7ae441adfffbd2ebfffbb080
|
||||
858bed6700019f650001cff7
|
||||
a8e6ebadfff8c48ffff8d44e
|
||||
5fa08676fffc382cfffbdc50
|
||||
53e41748000a084b000a05af
|
||||
95cbb6ac001b7bd3001baa42
|
||||
71eb5c63001072fa00108d49
|
||||
6fabe1a0ffea6066ffea472b
|
||||
a71a8387000f27ef000f59fa
|
||||
4e1173f2001a5d5f001a5c43
|
||||
29b8b1470004b00300048e92
|
||||
db1cd7e5fff815c8fff8160f
|
||||
3b77d220fffbe3dbfffbf988
|
||||
ff2b8ae7ffe853d2ffe85f2d
|
||||
141cadb8ffeaefacffeb0934
|
||||
c1f8e920fffd7840fffd7758
|
||||
770eca72000f8fbc000f7e32
|
||||
912cf5eafff65ffbfff64dd9
|
||||
ec6bc941fff1f3d1fff1dd7e
|
||||
7279f2e600177a630017b1b1
|
||||
8fb5eb02000a150b000a35fc
|
||||
d061af25000046a2000028bd
|
||||
e018796700012509000152b8
|
||||
cf68ffb8ffe96fccffe95c2c
|
||||
da396a58ffefb77affefd374
|
||||
d1c5447dffe4cff6ffe4fbff
|
||||
5aa1bcef0016b20400169522
|
||||
5385e2c1fff43347fff412c8
|
||||
a470fb25ffe95c3dffe93344
|
||||
7ac9d65e0008739a000849f8
|
||||
3e9b54bb000e8812000e58f8
|
||||
53ad5aedffe91c99ffe8fb02
|
||||
53718c9d00072b4f00077cce
|
||||
5aa84e25000a86f0000a7346
|
||||
8a6f14d30019a19800196aea
|
||||
a30ce8ee000c3c3b000c398f
|
||||
541bdc500014c30a0014c0a6
|
||||
dd7e2e2f001df291001de9c9
|
||||
7f70d3bb000c6d70000cb121
|
||||
d8a0830ffff605ebfff60d98
|
||||
e8f75f56ffeb152affeb35ec
|
||||
b2116cd8ffe82a97ffe81489
|
||||
e8c8f3f400195f5900196535
|
||||
c9ddc1cc00156fe100158432
|
||||
05eefe06fffd2a9efffd2a38
|
||||
c702f4dd0018d2140018d346
|
||||
fe905fe5ffe6ecc7ffe6e3a2
|
||||
c839475afffaeea7fffafb25
|
||||
1eb92900ffebe60cffebddba
|
||||
3387b1eaffffbcbeffffab6d
|
||||
375319a6fff841a5fff84ab0
|
||||
37c0abaefff16e10fff17b8a
|
||||
58e15d9dffe93e90ffe90ff1
|
||||
0608f0a9001aa3bc001aa95c
|
||||
57387ae8fff4dd48fff4e4e0
|
||||
d50c7bf0fffcf9eafffcf036
|
||||
765f6f0affea3899ffea68b9
|
||||
779ca35afff142b5fff0f387
|
||||
e52db31f0002538300024571
|
||||
79b4bb9dffeaafdcffeaa69f
|
||||
4df6a2270011b9e20011a88e
|
||||
83fb97c70003759f00038f71
|
||||
c5e953a5fffb076dfffaef39
|
||||
e36e3631001a7e88001a7c68
|
||||
c60d67affff807a9fff7e420
|
||||
87cdee52fff7c6f1fff7d948
|
||||
4007693f0000b1550000ccec
|
||||
cb59e67c0010e45f0010c55a
|
||||
ab126a5c0002c8890002e8a7
|
||||
ad0ecf19ffeefeafffeef55c
|
||||
1594631f0003f3ec0003f70d
|
||||
10bf6e4cffeffeacfff01b44
|
||||
f6bce59b0005f4f500060244
|
||||
dfb3f459001191ca0011978b
|
||||
6aac6ba2ffe8eb95ffe8a183
|
||||
469a77b800132ee60012f18a
|
||||
5f4c0e11ffe80987ffe826a9
|
||||
ed07ed3bfff57238fff56d52
|
||||
4524a14d00092d6300091a84
|
||||
6da73ea700016bce0001305b
|
||||
036537880015f6980015ddff
|
||||
4b1b177bffe95188ffe9647e
|
||||
516bee000010b65d0010d838
|
||||
2c2e483bfff90577fff91df7
|
||||
52c79733ffffd4f0ffffadc3
|
||||
9a8876bb001cb489001cc48b
|
||||
d017936dfff7513ffff71e86
|
||||
fe406099fffbb688fffb8f68
|
||||
4d41a9fa0000bc040000d19b
|
||||
2be3b042000217d70001fe58
|
||||
d51ed089000aa2e3000ab429
|
||||
15543321fff9c073fff9cdea
|
||||
00b0456a001e3125001e4db7
|
||||
a9c24f5ffffe9ae0fffecd43
|
||||
e4b540580010ed9500110bc9
|
||||
9914566dffe30f0cffe32b9e
|
||||
934b5c8d000f5e20000f14dd
|
||||
01e8e447fffcc85afffcc07e
|
||||
b186310dffff9006ffffb829
|
||||
9531b440000b8d06000b658b
|
||||
5e91ac9bfff8b9e8fff8b24a
|
||||
e2cf86cbffe290d2ffe2afd2
|
||||
352a774affec354cffec6064
|
||||
1b28625c0011bcd20011e442
|
||||
ebb924d2fffd973cfffd9697
|
||||
f628063200112e2300112dbf
|
||||
f0ebd212001ddcc0001ddad4
|
||||
9809356bffed82d6ffed9555
|
||||
87760c65ffe82b7effe7f874
|
||||
7cf12f75000e27a1000e35d8
|
||||
7818690b000afc7a000b0c3d
|
||||
cd8003b3fffaadc2fffac65b
|
||||
5cf076df0006a1de00068ce8
|
||||
87bc0071ffed22caffed42ee
|
||||
1d5aef1cffeb76daffeb7f30
|
||||
9405e60000096b2d00096911
|
||||
cd803798000d550c000d5834
|
||||
78ae10bcfffe5296fffe27e6
|
||||
6fe3d11600035f2e00034e91
|
||||
00da01e7fff76c6dfff76c54
|
||||
7425d4d200066b9d00068449
|
||||
fc98810e0004c82a0004c2d8
|
||||
43470923ffe6f196ffe70566
|
||||
e2dd1fcdfffd17bffffd15ac
|
||||
dc6c6a5effe7135affe72b16
|
||||
c9bafe95fff5f191fff60171
|
||||
77db3bd00011a4f0001188ad
|
||||
c247cd16ffea3ce7ffea2753
|
||||
3bb375b7001b8a72001b5756
|
||||
c7e3b109001cb08a001cb438
|
||||
ae22add9000c1902000c1ac3
|
||||
7add47470008b1aa0008b4ad
|
||||
0c1c78f10014e7ff0014e247
|
||||
5f0af63e0001410f00014259
|
||||
b95a6ed3fffbd619fffba9cd
|
||||
7e0dd8e9ffe38120ffe38b1e
|
||||
8d444401000dd383000db53b
|
||||
da03c35f001a5a49001a4334
|
||||
0d57fd99001cff2a001d04ca
|
||||
d3857cd7ffe53c59ffe53e1c
|
||||
f5fc0382fff33391fff33243
|
||||
7b6ad9ab0015dc2800161c09
|
||||
3ea59fccffe617e6ffe61590
|
||||
6a652d35001a821f001ab542
|
||||
c1bd05f600086bbd00087c08
|
||||
3fa3eea30010d1740010c11b
|
||||
07a3c41c000783b200077a97
|
||||
83ab4a06fff31622fff3415f
|
||||
1400aea700065e2100067aa3
|
||||
6ab0674b00110d1300110a20
|
||||
c844a0cffff3c843fff3cbc3
|
||||
bb00e5b6fffc80c3fffc8891
|
||||
6cff3413fff42402fff42772
|
||||
9915a9bd00060cc700061b19
|
||||
2e49e366ffe59e12ffe59fa2
|
||||
eed43421ffeb98d1ffeba29d
|
||||
54c74021ffe6825dffe677e9
|
||||
49f501c9ffe38652ffe382f8
|
||||
8ffeae58ffeadbceffeac080
|
||||
ea49377c001a73b8001a8816
|
||||
8a329f4cffe45d3fffe42967
|
||||
89ed38d600123321001232c6
|
||||
b8b9e67effe20b06ffe21232
|
||||
b223216a000977ca00097aca
|
||||
a8f383b80017099900173139
|
||||
26470afe0009ac5e0009b6d4
|
||||
fffb6c91ffe39120ffe36251
|
||||
0caa4684fffdaaa7fffd84b7
|
||||
5abee23cffe3c639ffe3a7fd
|
||||
9db182baffe35ed3ffe39fd4
|
||||
6e185e55001d0bc6001d354c
|
||||
b59259a6ffe7d780ffe7d870
|
||||
de8de9ff00145872001467cf
|
||||
d730383e000a1aad000a208d
|
||||
6a621909ffe83872ffe861e7
|
||||
f156d0f9000860af00085cf5
|
||||
3ee2b8abffeafed9ffeb0f7d
|
||||
a401d9970008d79a0008e73d
|
||||
7ef08639001cf4a3001cd199
|
||||
25fe55bafffa5738fffa3fb0
|
||||
808080800000000000008000
|
||||
807f807f00000000ffff8100
|
||||
808080807fffffff80007fff
|
||||
807f807f7fffffff7fff80ff
|
||||
808080808000000080008000
|
||||
807f807f800000007fff8100
|
||||
808080804000000040008000
|
||||
807f807f400000003fff8100
|
||||
80808080c0000000c0008000
|
||||
807f807fc0000000bfff8100
|
||||
@@ -1,313 +0,0 @@
|
||||
0101020103010401050106010701080109010a010b010c010d010e010f0110011101120113011401150116011701180119011a011b011c011d011e011f0120010000000000000210
|
||||
0101020103010401050106010701080109010a010b010c010d010e010f0110011101120113011401150116011701180119011a011b011c011d011e011f012001000003e8000005f8
|
||||
20011f011e011d011c011b011a0119011801170116011501140113011201110110010f010e010d010c010b010a01090108010701060105010401030102010101000003e8000005f8
|
||||
de6f407d1a76fd194d997493175c283612cccd068b10f8f29916e0a45e07c2becb2b22ce16cd58ce1c75a47567c1079d4d1efd5a60cade2e0484d3c09cecc4f8fff7b5d9fff73e0c
|
||||
b9e11f2f5d61b449753f6eb40d91ecd44c54b3c748bc32f18a6004ab71ec79762fe9e271aebb07e82283f68d59d37e286766a5f9a22d794abe6f3c61eeef2384ffe34194ffe39105
|
||||
24bbeffa5eae61cf97e32dd6238637b46e3d9580f47e063f48dda07c0a28278e2b83fdad756f4edd49ceb264c6aef4cf71b5008fe37a679a283db15f3f9b04d2fffc9c4afffbbfd0
|
||||
cea51e5a6edeea1b0bbe4f675107ff6c18792f6a41428cde5bd450f3c48934f2f5c5c841f51f19ad9a6edaf164a20c199bdae700f5bb884191569fdc39a5e831001743760017129f
|
||||
447e9a0a9c1e11528463cc01e763141ae3ccbc18c609248308ae0c0c783f09a8cf14159a9eea7b977c30a25b3938d9badb62c58f08a0f616508a5f17b515638e00010ac300007eb4
|
||||
f395bed3d1236409be3c54f008a2cae4d068d26f2ffd212a3ed29b3d24989bad9356d28e66c793dc3235b59df2931323a49b7fbc9d1e48f58ac51c8242c1cc2d001cbf8f001c8890
|
||||
b76195624ccdba61eeacb046ff900feb078c8fd8951342380de3a3582fdea5d4f6e93123e4b892815c443c19d7c655608e75d1d6174c8cf2cb4b3575366ea1fcffe9643fffe971ce
|
||||
98ab7bd95ec4a5dfb97e7e32e51e627a99297b365a5a500506d3b4c4dde1d1965ade6643d9df244b7b5d023404e89e5d6726baf68780f708a588e56a5ba8e933ffedbde9ffeea900
|
||||
0bd1b328532fcb24b26320b4faa2da2ae709d18506d5bebe35addea26386b3077f5c62d7a18d57697f114bdb854e99d693cbaa063912e06457f1742335426270fff5806afff5e2dc
|
||||
5031b525f6ca02523e726b7c600cefeb7c20bcb21897ffcfbd7c25703e65298085678ea0d58b2f497005fe7abda1561f34b84aab25dc5a87bfc94b8ff2d66fcfffe8239cffe8503a
|
||||
2e756bd6b569fcb44695d5a7e967845c88a729c2b32638b31f8a850e61ecc38ef8bcfd8f60e355d1a233242619a94f7c0a498bf5379a78dba461cf617424db35ffecf34fffec445e
|
||||
d53f7efec8a0295535092101305b829174f792840bc3e039330962239ea7b3cabdfa1d97a5d070337155f00753eab535e9615701e022f359aa2ef87079cb25b800198432001a31cf
|
||||
96acdab91625f2833c4602f401cc6c030bad3e2b28717bc0f6b421efb0d34960a84f59846f6e16f85a4bb0fed5aed21436038b6e12ff0132b10d3db761356d2f001b53a6001baf6a
|
||||
5b73c2523581c423b0f14fe70876baeb49104388445f7c01bf0202a510cb548a7b1e7cc020918f884807cb96ce7bfb58192ef9645ff41d3a9afc29d49ffd19260002477700022bf7
|
||||
2a977fc8cad0448e8bceb6600b4e48bc48d08aca59aca19e79645aeeaf1229dccf9587e23c5217f1f31fbef70204d4960dafbbdb614bbb877b4e24012a02420fffe8bb68ffe949d5
|
||||
5bad567f113b1ac52364c3514babedb9ad875b0e246f63f1747f97d99a08f5c468fcc1ce5fcb658a52a481ddad343cd9d24f2c4cec0e13b7f9c3500bb7b8640100171f6b001744ed
|
||||
a684fa51da60c8ce6c44f46a43e14139f893e6f916c170c9394c36a898d461fd14fdc5076463cf1941ac56a21aa19fbda53645ff3016c3929da282e054c405b8000740f900079fec
|
||||
cf96697c9cb116efb08450b30d4777a2e2516226141e8646e82aa4e24794e1b732e0b37038be0a940881b5c6c4a38633e72905db55ed661ce97560bdf11097ef0010b1210010867c
|
||||
09a1404ab4535617c8d9ba20ae29fbf1bb4808375b9a061caf87fe32574bf1001e23edebcc676bfc599da963990d484439e42bb697efb4443782ea85ab678b80fff04d54ffefe96e
|
||||
1af40daaaff360794ead7f46f4dbe4bb097d7d85ff329696d980e31f204213c30b48eae190ba936614c66afefb2a0fac17bb4dd7d76b17a5878b1b3dafb1a53d000a178b000a60f6
|
||||
406aea06148f7068984b6911c69ee1dffc24c896721c717955e7fc773fe3dfed4e8d56a179bb3528cae7e156c42a6d9e870465de092f9dc57da595905046fe500015307e0015484e
|
||||
afab6b57caf42641345a36adcd74edf86ae933f540c81453ffafb40da0931c337bb8251bf4d2f6e5d267094d24081e6693a1dc668b94fc6a1f6c0855cf6c36f6fff22ddefff29fcd
|
||||
51ab7cda40769028bd64cde6e1197684c59f8ed7feb70752a6f1d18053dcba255bc5060ba88bc157d68ec40a276b6220f2d95478fdd6f251b02b1db957a29d59ffe19fcaffe15874
|
||||
cb95865a76b7f7ace2f96fb9729f09f153292ced7500046367f51ad0d3051f133f8f845945f8dd1e20bb667812f7af80adeeee06901ef46e5829ecb6ba8a50fdfffaab80fffa5a4a
|
||||
99a46e0e4821b899523a627bd40343ef245c0bc1b1b116977e68e95fba7a31805139949cf8474d35e26187bb2a40e6d3b172756e4f1dd6ceb6a5e3842da97e06fff2ffe1fff442c2
|
||||
f592a840cce640cf6439978357cd0cbb263d3154c02dda2d8d0b4d69fdbbc5c8ec0f8f20d29acfb70f98f25e65c65078ee98e585a0d4664d2ea83f22f25137a8001720bd0017a618
|
||||
32521f8efa60406d89228726095b491d711782a837df537391ea814f2b6205349539ed67900dae49615f9de27e2a64503adf777d0b940b15644b5f15df930bb3fff382d7fff454f1
|
||||
9352cbfed7fa252bd7f1b773b39b8e3f55e665cd8aa01b139720e394287934576500d4b612e068d5ea547d859c9ab893919426a9c3236d65093a227bf1435242ffece1c0ffed43f0
|
||||
03f2462f86d1b2cab49158e7da3803f8597b9fd00a99e0d215f161cfdcdf24c960e488e97d210a40389375c3a8b97c9e11dfd6f4b83bb3bb587364f837d5d3ddfffd7743fffdcfe8
|
||||
97f0447225d37bb812311dd0658bffb8af4da8f3f2fbfb1f28a7f2cb48533ed1f662b4e3c2b2a6e8c186917de6ecb6087b04e3a5072a16682ad8bc0ff9261a81ffe9f722ffe9b538
|
||||
55d2b7e459f899506e8a48c285f8acffba72b44e766b8a4a1eee25cf317e6ec21f8d20050602240774e5818e06202cf640bfa0666a511851357dcad17f2fb8f7fffeb532fffe677e
|
||||
4b11987d3ae4690f8b9fc1a36d0142d46f4f4b08e672117d371f1cb6270097dfe8b05cd0a1222dd1e305c268bff06120113fb992c6f2b1e64dd8c47cc4f3e228fff85f8dfff8723d
|
||||
89b46dadaf83ce3c6f7f7900600beb1e31a684cadc9ab1c3a64bd039a9d937f68c82d9462d89b1762ad246b4f24024d91b6e4a0dbd4ef9756c816ba0751b8bb2ffed49d5ffed4859
|
||||
02764cece219022cbc818fe241da8ce440f2ba244b78e33558f98a2725a8a374e4923aa754d1d56bbb2563c303a51e86831d9fb3dc8c3b90b741039013836a9b00066b7d0005be96
|
||||
8e059679b65d4f1e62c2e1a80d320acf0b588abd863211453126f38cdd3dca78ab221eeaa6171d81f4ca7e7ccf3f2b7936d4f704cd2ceeb1044dd98ca381bfdc0017b61a0017bfa2
|
||||
e3d5cd54418faefd3853fcce257ae7b2eb592b4bff3da32a54af9715c5fa56f914a0893da30464d095a853b1cb32c5b2618cb93feb1401df27e4058040bf1c8000051b8400046846
|
||||
694f4b735c99250661fbddbf51f177f945c3fb685c02d1affd1b6c82b9584d53a486ebd9d96b96acab90eaf2b07aa05a8b1a0578acb65c6bcf0b25af22437c4bffed4774ffeda13e
|
||||
181ad1eb9b1ff4d382924cdd44225e2e78f0d9bf86bad591bbc1aa3ccda9d9fd3a470b621f6ce0f668069929f10059a69a7ebe3c1d42993d8b961045ff2bb208000e67b7000ec345
|
||||
9ed7e155b192eb18210d969c6e41716a66ab960bac47a81f5fdd3a479965f1617bf71cf0785e8f9ab0b3088ae0b3d40cd769645acaade51f56dd00629d656ba3ffeb6164ffebbed0
|
||||
20d2c74071f293fab03b38972adb3235daf9aaedae1b356c5eb928b201ae196e836a96a8dfcc1b88bb5d6128cb49f348fe1b7629ffcd43354c29a77d9f6fc78d0001e31f00015ebc
|
||||
09564232466f2c7b7e40122a583acd44e236ed8875322e831f2949da5e1b2793e45211c3afca8fac2c5a9e8703eaef58c7ae421b2a3667272458a98e7b5de7a70008eff9000a4db9
|
||||
031fec28a8652ad21cf6fcc40b99194fdedd9f3ddec0cea3132ff410eca34a3d72d38b9edb76712810b82bd19c7e4022aed000d4349ee2972651ce91eb4ff948000dc73c000dc671
|
||||
9a3064923dfce471280d5cf09518a2793ce625aca6e3e08df7d6a1bce5b8bb45cd699fdf6e20a7bb76746754edf4f397722d048358d119b9d3f323265b573fa8000ec3bb000edabf
|
||||
52239aa6b5c1b18da6d4d0a64de30a3a11de9b34ca7d73a2eb13eec6eb2d1a0c128de076590ca02ab9384a1276873dbb01fd8fea979877426a6b1bb352000a400001a66c0001cec4
|
||||
013c25c698b569819814a66ffae4067a43bf15427d386d9c461ed4a214f0374edc45dec586b6d2963a5ed08de7fdd151c50e5a22741f86444b1501ce8f962965001853f60018a39c
|
||||
541a85bcd8dcc3479ab7521ad2c26fbc40a728f35b83eae19e5544b26be8aba4b3e5a28ff34515f71b292971a89471f6d5963e284fea6b6903608dedb201fe94ffe6b70effe73489
|
||||
acb25a61d06415c563b5a7cf318b519e704550ea5976d7d8383831ed76c62b84cde97d37e00ff55fc52745a74faaa7e94ff2fd8b31578741b2e3b77706a289fd001539900014f720
|
||||
18c31bbdb49cc9c94cc018aa4f24c5fb06b8562a71915968bd1dbe84b36d3268a98ba01c02228440280543afcc018246c584829ff4cae9593478d7d535e7f3b9ffe880f1ffe8c659
|
||||
271d3724ab9ee74f9380428a4bee1e3d6c5a060dcb36cb707278d9037d27a2fa444051ed006ecccf1b05ad4b4d4de007f9ad21f09ca0e4b2ee35dcfc113e6ee8ffe3f5b3ffe4bb14
|
||||
669617a45323c85c9d796da3c79518d0312e908f2e1e3f57d4f1dbb6cdbcb6fa6765d9970f98f436b650847f232c512f3d5b74c08551617440153ef2826653a60009a16500093519
|
||||
7de236bdc70750a81e1a0ccba5e2c362274e59fed7f78ecb18892211e35359b7388cc6974bfe48cf4e4aef24c5a4d8717de024d7a495c64704f3a7df64bdc3f600053cb50004eb80
|
||||
4d3e7c2d9c0dc0cdb39589578e28d29ecd8ee535e977d457f3d81dabe0eec289f880ef56d5d3696c03afbfd7f688e1f9e2977a72228ca0f6a5b4db318226de52ffe2d46fffe3797f
|
||||
fa11c0f689e33fc6ef07da30a06e74470ec6aeb78c6907f4ef2a55bdf97e18d4cf7bb521af244f1aa54d516fcd9861643a823bb20ed519d8504a6b5530f2298ffff5eb09fff5ae4e
|
||||
3f9650751825608cfe4d34ede2cfea3c22a6ca8b8f39e63157641defd1c200f6c1beacd560b265b60571e81e8834cde43a054558488b59e0e4556559c92deb1bffe34e7fffe3125b
|
||||
3ff7da022ea49c30137ed48e77890daa2b372a48b36c91e7e91166a4e5af9fd63e05ac8bbaf6d647f5459e6be119ca9f9760d93a0df1fc4542ac7ae5043c7e6bfff2411cfff1d37b
|
||||
f4840c4822c71c78514c0eda142e8b5064d0241f3b02e17c4b434ddc97edc579e7cc6d44dbe8dbab66f8e39de0b7498a0d82196e8d5282631b94866daf785b89fff46864fff3845c
|
||||
4397ece9e5cd18da90cd8454b20435e402932fe180d8df003fdbb57533c5b517c32f5a9bbdf5bcbacec33e90d1a45a7c8217948302e46a97a0ce75904085b218ffe283bcffe1ed51
|
||||
9bb202de3c9223121638c60ccc81d712737b1e1ee9d0bb16291219a01bedf1af8caaa40a751c8e46a0ab29244c182882f2552269e4f4236fbb118a8ca5a5dcdf001b28c1001c1817
|
||||
4db290886e2443f576644a4705070a30778cf9296f731f0236584aa43b65bed90ae337f0420d7f98616f61bde53b75a2ea95596a38ac7319ddf395e17b6bc6e20007bb4400085868
|
||||
aeb88c93c49849274692c205e6191c1c8878d08014b1c400bb827311f56537295e5c8802fb12663342432fb7757b94066e9b2ed433fad744f9ee200e7f63770afff08181fff13d50
|
||||
ff7ffbbaa0d175a00accf05a4d87c018319c800f96f71a85b7aae7bf27ce94115f57f87e01852091deccd0d3dbb450884f5726afd7a6db9ad97b2c3ef95ae0effffdea4dfffdb1ee
|
||||
c1ead787898bc5f978e5e27e9627b444760b2b82077773a96d45f79659f0c24e0b9f716e25a97c6171873b72852b8e30e15693eaea839dd50de11b3ce60df89600093dcf00094e45
|
||||
8c19ccdc95578f545f03fbdb578e0b2eb0cf6f2d1ab58e2914db2336a74d9c2948b1737424e3ea6420d72123ed1b086d3be36c1be10886548a46384e53d6224300063b8e0005879e
|
||||
8c99d7fcedfa838386b99c15a90a4a91a2a524af4409847932d0e837a17b57f2a8e2db435a9858fdc9e2492bc9652dd0ca1580ea95bf7e147af733ae7c9d28cefff30e45fff2bce1
|
||||
e92f095b2e8a6d38f889394dd8adc5b0c5eb988857432e8f5e48c36ed2e00f139b50341532e226c78e0d3b5a5223f4c29278e2daf263ce8919c207cc54f97882fffc5e27fffc6485
|
||||
830d6934b8436b27ebd01e5288a03db7d290c50cf1bf03a0d68a3e350e222bd1d40737dc32d2e9707ab0b1bee1fa7c51d6dbb91fabb60189689b19cc2f672d8b0010e74400112b17
|
||||
51ebd4836efcd343762d81abaf51be46daef4e2030982dffae5bf61c4a1b5cb3f719c9ad003cd8f04e41776f74761a5a6965a28ae62c01eed389ad84d6f4e189ffe45e85ffe570c4
|
||||
60153a8df135165a55ed447bbe0b8dabf84830eed8c61cfca24bd73653ade73f4259d7263b8a386aaea5e655027f3f364b71be4a9d46b3c1819be4291f2226bc001d5857001da373
|
||||
e3529f336d3020b33f5bdca78efe8971980e010a3072d1b5ce35b7cfcce7013bd0ee4442f8f04265654f68c678888368810998f3fa2ac381e8568fea1264737fffed251dffed54db
|
||||
448c32f7eb0946856ca6b681c34d030f71d677ab7cd8485bbb12805e09567ce116fb42efe87a310422348a1b02f04a9c55ec52af6389cbbe2bbfe9fd29e38805000f98ef000e4a41
|
||||
23d41d9993760b56bab4187848b0102afb311b5027e87c36867f0f96ec47f8d46658c50bc309fa3c1bfb7799bb0be4de0873b35eb3e2f907f0aaaacaa49d58cdfffe4c8efffdf698
|
||||
3ca3a56dd4fb0b9c788bf8aa08486fbe6dfe3b41a4a86a2aea2c9aadc483ed81782e06a5599579c9737b86f942bec839bc35b254462f03dbfab785640939c3f5ffea9c82ffea3d89
|
||||
68e07cebbfd3302d77e36540c1b3c6dcfdc223db55af6cc4c61a18926f991fd5c7f4505ccdd25012618c5d80c265a003f62ebad2c83bc9a8420b6b702181ffc2001e1bee001db15c
|
||||
65813af1f7f64e41bb83352188bcdc95a51d75e51479ce5815561d0754b3e9cbb6c11389290b53567b1ca3d59882d7d327e4d9fae387bd01d88a095eafee6e100003dd6d00049362
|
||||
fd119ddc189a521fdd497817ae5547348eb15025929140fcc66e5a007e46efc790d8189a450fb9110ce3c8e3ad31a26503be95a5cd3594a887c7508f2d604a920016e915001755bc
|
||||
f0426c1d588840c99714f9b7fa04c1c3c6ff5f3c446614ca04537704a93b9a7dddf8512d25fb67e0755cf753604b0ebe269170b95b6d357533e377e23df2de4c00064d2400064149
|
||||
b00a4e8fcc03d4f215d5f1def7f92bc20e5dfadf56a7f2ca7471a1eccbbb176cf470115490553face965515fb9eee887e5be198627706ff2d6be0d20aaf54e96ffe250feffe240bd
|
||||
046348ed2bc27ce1bb30326abfdcbe6166363200acdb20d7ea967dac22819ad1870b458503655be89beedcdd648151aa24d92a929247fd057444bd53f00cac8afff821cbfff7856a
|
||||
49abb2529673df3209b6264115a2a7ccceb24eaededb9f01731d5b94416806606183a2d57d1cf125a81b4b75527a62a5655e47ff025abd71a3872c7c46cc5d48fff0c2f8fff0c97d
|
||||
847ba617d14dc80d3e8a6ce0e50172b72d5d9ab858e76421bb4b87d249df367cace771e002ff3c1b9a0103bab293ca86df5745d5b9ea3cbc7f043e399046614afff4467ffff41174
|
||||
06f98dbfe1dd09e8ab94168e5d47ea8e1a024e2b081ae47958e3402dd79f4bb362f08ed3c3c1e8754d15dfc1f96cc71f66ffa6f885f52cdb1d31cade337bc8130008ac1800093e44
|
||||
9ab37f97edabfcd240742aa507299e5c2745179db309b5abcc57810f84dfb994a2357065befb9c17d1437bb10dd3c5da3f81a49d75374628a96227744c98c550fff132aafff10997
|
||||
55e396d3d8b6428686d6334864e7d692a0d8720731b699e04cd8d7361f2dcce9f9a33950b298a9029dfab195de78e8881f30f0b7a94329c0494f214701bff525000700dd00078040
|
||||
f7be2d1fbfa80c069e23373b39f43efcebad5905834d2b67187256da157f29d7603e09ff98160e52330b08a7c5cf6f6d934091b83f51199a86a7f053e3c0f098000d97a3000e3556
|
||||
78f283debbf6c5d7b5beeceaf8cdbc1b8eb0ed11d057ae455486705605bcbe1bbe4e086c8da55b92f0a7fff873e418afed22f8ea993f81034d2b45055adb6990ffedab00ffed5b0b
|
||||
5a42d462af1ea77ba8f7271b83b0e8045e80b1acd6b2070a47a777f1474656cf3c8e492fcd0bacaf6ba53d4fdf40b3ee10b20abdf79302a3a444b1ee152d11600009776600093a82
|
||||
97b37ab52aa8a2ba8980ec6566bf58e0e056b81705941fe9fb5c32bee70bd0161c792695dea0cc6bc1593a73b37b2ae97a95861decbf6991d785648872d80a970003dab70002fbee
|
||||
4e2fd61abfd2d31ac15d8265c2f15be9d257eb0acc947044d1dcc7e34ad2784838745f6133617a57ab4a9a26f9a0e3b2e22ffd4df5a403f1b492d9974aeb6420fffa2947fffac469
|
||||
f0917324c4a8fc899c3f36c251cd7b6ba80559ce3b502765b1a4716f37046e4ce3879056742414f63a8b04c000799217f741abfb2cc7ec3c652d117f49a8c363000f790c000fce78
|
||||
3e6e6f2bed5863d82799deed1c3b4fea649668402d0bbdb83da9ee5af4d26749b8816011b676e48b0614032e7cc01b1a004528cf50b8c437bf33ef06f13257e6ffecdf47ffeca845
|
||||
c29b5a84e22ddb8b1a97370fd5e468ae9840ac147970dcd5130ff7f355a044279c09f1d562d410419ae6193e78db11a002eb7f688451c596f922ad3334a686c20016c4980016a8de
|
||||
5bae57b0a664ac878fa63f1c2e9161f5e6ceacdbc260d7c6c532df5c4856124bdb16c791ba237ea0d4487b673a259416228577285018f0ea81dc38bcaa1fd13d0014f7680014dce4
|
||||
a42637dd5f6d2f5d90a18019b0025cf7f3498810a1119ad37a9c60bc514569322d37a83b2e977ecd5be9650d8980534b5fd106e5b51124db5ce8f89114cb89340019501100194bad
|
||||
55af11f4e538fcec4106be0bc52cd3048f3d90b8972244ada7e19738158483d952512262dd1a2e2d1e43f65cd31bbd1d5900f748899ed0661acd53e5c3d9010bffe27e8effe26517
|
||||
5431bad805682e5f15abb2c14f09fa2aab415f1b5904db7de8ed732167269c5dc03cb7da02b4259aba728ee891208cc7244dfaf68da8bafee0f19a1d77b1c147000844ac0008375e
|
||||
14038293ec234f9f90d521a12fd70ab75c939866769b3fc85f1cd0bc9598cf1ea983ffbcc945ebd1bfb3f46c9050d0f4c970edd6d5dada4c46980585a0f06f29ffefbc8affef6a79
|
||||
3c4f74d39a67efac852dcb7731f23bd5941a15e67d58bfba5b7e30e0e059bba303b84ec76fadfcb9781e5a46bb15817aaf0b2e7c33ae0d82fbbf1e96452bacdaffe21976ffe1d605
|
||||
e70686017e688cee3537d0ca0112fa47eb923cc99c9f1486adf7181342f3ee98ad464675dbc578d67ab5d3845a7270ea90db8d821ad9a4697f3f0b0ce6fca07efffc28a9fffcb6ad
|
||||
44055ec45a0988655d9add67d61eecf8e7676f092ae9456a5c47bcc49137155a6b6d300960992fd4149e1cf8879067598e1d4b781e94af18b2342cf090b93449000ab323000ad47f
|
||||
ed3bb5809fd5e3401d43dc330acd25f17197606ff0ec3c68861ea306fc1eca1e8a26a1834be665d42c6bb7f257ef701f3ddff08ee03704f0335f8be2be74cb290018ac500018e4ce
|
||||
5652b16f21880add15bbe8c0db0b6302b00d05fff813e06369cab4d10f3052e4712a054f0da5e09294bbc6dfa09666e5ac2579087968860483782997cbd60637fff9e47ffff9f154
|
||||
272949e936f7191334b6a011b93be51f47f55eda5133531855a8ae51aeb7d2981eeb497afccea2053f2aeef42076eb304b314c180d03d82fc920b6a32fd8118a00176b7700178446
|
||||
976a6c7310875b768babf02059986023914782bf2668e8825239f38827db02a992a514bd86cc420a5ea0eea0a8fa98384090ed774cae84df4182a01ff8c4fd4f00011ea30001368c
|
||||
af3c4618ebaef220ff492531b687b2d7ceaf5734b318f3acbe1eb5be3f5014432d02201162d357f88398149b6fb736a3f265ca89746358e9ff903dd1967487180017d21300181c81
|
||||
a60cd48c16a7efb1cd9c6e183df0505bf02472f2c17a050b45ba28b8b72a9c1155d6a93d39e34232582dcb1e697881685353820aa9f9e587b965e231ea8ff00b000a7883000a5cb3
|
||||
4cf75d0478dae432addbeb3fe87ad589c75a227feca17badb86fa7c8b368cb6a710c62235198521ae3440915cd2e1a27e1b74bc73198aeda15eacf7efbfdcee6ffe88156ffe7dd2e
|
||||
ca1c695c16342bcaf3686ac572a8d5f8734e4dc7e9359655dbb440b473e418af5482cd2b3850452983cd2312c64b3383d35aaaa8b51d7ff8901609dc83d0ce24fff05cf5ffefe548
|
||||
70bdd286d01df2f5d438ed8225d7dbd65dc8b49a11306b95908afde3bed22d2e57f60855929992b74def356b1e86edf64633383442741b102f1c8b52c6f50858ffe90d1effe99543
|
||||
5de07829862f64b55ea10f1db10a7fe7182f4b8d9b29116857c9f454cf0ac4c27b3fd5b50bb82c3ead92379b29fa382e1a5a612dec1ba7a27559d6bb21a23a8b000480050004824f
|
||||
473177dff489efb8174c2c344dd0a47f8085e46f8ed60b521356eca80c94543ead4a4f626bdd1382c711b98481d2e4c92b60f6b715edc940fac78179a82b6ecdfff1c050fff1ceba
|
||||
f88cad13ed6ca219aa2438dbcf729508c976a288b7d2bca388c02c55a63d2ecbc6b9795d61b4cec53be51970bc5ae515c08d8cc187bfe27c424da46008617583000370a100038fd3
|
||||
e90f5bfb5e1b1482a8492d0e2dbec57e3b2dc831977d8aac205320b9420a3d078e3a4cb0661d0232e670ed87f61c1297af515ff8cf8e4509068fd3f377ec794dffea12ccffe9af32
|
||||
84a5f5957b4ce9e2328c22c1b959e6260aa9befa6242e0f24612d30edcdbd9c886011b69f85bc724bf1a266807e8ab5eb207d7e7cd721fe57b76bd6fa039606400139d5e0013df6a
|
||||
19db23e0b243ad05f0465655cce4a71ec287df5d321f2dd9ca30c2d9c2b76e955245528df8e8ce67fd328dc9e78322ba24625aa2c43f79fe3af5969f82da24e900122cd6001220e2
|
||||
0a11cb6714c43e3588441eb8c06b247a96a25169ee658aa579ecd745b545dcaeba10787f84871f3e08febc90f986dbe7536671bf061d5f0f2cf9a0e3907240d9000c70b2000cf6a9
|
||||
3d7bae3978305f7e18c615122947fb3215ef99b2bb47689afaf666e33e3ab601bc86f6446e75fd87ed4d4968ffcb2cdfc8a402a0ed1d25ab9d44c1a5aa647f7cffe6dee6ffe79a5e
|
||||
a868203d258ceaf16d22871ac74170f68e35014619ae6acf67565c6583c6526320537ddeac2cc1a95688a00bd1c118763404918c34a950ba59d0411cae6d8586fff20df9fff225a4
|
||||
ae55c65ab3e3fe6eb038c5e3009d1942c02023ae6f0b5f1c7d89296218c86779afc7e3c3341e53be90369fc9a5e75190f821134f11c31c5555d96e17ef3a2d5dffeef338ffeec3e1
|
||||
fec16bb979e317a2dc3995f21eac2dd47a04f97121b6dc6057b393cc88e29de7dffe8df653db73a5ff739c31f865eb476bc5e5cf0b8df2627bff77d52679dec9fffa3513fff983c9
|
||||
2128d6aa38989c1abc04fff016f08e1c56fd0b3d4c41738e1966b4e0c818d6adbf758362353281bfe642d3c32e01fcb8a120118cafb28a5c93eb872f0e8dc429001c3399001bb487
|
||||
bdd3baa319693760b1b60b96bff7228d37962f44a6894d5741b3a5f0df921386da3a4f0924ffbcb8cd841023fd5595593117a33cd4a11ff1fbb738b78462e874fffa20fafffa5169
|
||||
1736e9cad3ebe844b8bbecc00257e4c92a448c9871d5f1bf01b4d3ca9df68f7faed57f25adf65db0b90439d239bdd5c37c6a42f588bfeb51ccae7da2d63537b6ffe9d355ffea0259
|
||||
c2a9cb3cfb535f8fc381de8b656ba5cd0175cb67ac777159cd00d0bcaa62a74cff09247ceb08680c8a2c2f4be3f078a58282d4a1be3854149dfa73d4e34f64b6001e57ba001e512d
|
||||
224148fcf8462c6e082285a6d18baf5cc066b2bb02b95c4bf11de9b979bd54d421ecfc43d1dca37652020a9d5297c503836cc86de85626dda44c3ff03702d421ffe78c4effe6e9f1
|
||||
693d1830d6f400ce916f8fa6c530e564c464065c2fb5ab524a2f2048d0fb4d25f100b2bb072a5e1b5a4f08bd44ca75e4d334ac81ea079f58f5b5da8188cb4589ffe28d62ffe29f4a
|
||||
3586677460cca3278c6faa81d5cfa272de6c2582c9faa2c6b391477625bbe3c742692572ba62b6be8689d8e9c2c4647ba3d341b6aa3fb17b3f8783b25977132effeca0f9ffed3654
|
||||
325367e0149703d98f0b37eecbf4a2c800dfb3d9f0a0da6d770862c575711c30bcb2430316003944601d411b641e60ba0c2c8e616a1d965fa3e2f63aa588f6ed000742ee00078aec
|
||||
49c340d17a9a6f907a0b11c21f199a4cee765528ad0e20ada90177b4f8606b379da813f3afc982761472d6bad1d71551b3c9f09ac6fb49533cbd7fb98b2b7bb2fff48e06fff3ba96
|
||||
583db083b1824a8ad578a573c671e488b22653d763eeea4e221c7cd22ce5784c74f6a9a0e97507ca927f105a1ec83f85c5789c536f6abac49edde08f6f2a56c1ffff347dfffee6db
|
||||
c6bbff271d87d7b93b41a9a33771507e5fcc45c2f6f4be13bef0215245055cbb0e93355e19ef6f8007f683048d56cae36b70ac14101e3a5a3d9236547fce6d8f00048f3200047817
|
||||
e7d01c776fe48722a54385728f4e350af992dddb0f47e60614e1df335054147f52fecc72979a57d46ae8748cc7d1794a19a0a63f9bbf83b5b2eab68269bb9cac0015610e00154ecc
|
||||
fc0e7f6441b7779707a25de2d4bcd26b7d3969e26469e4c287d9df66c0b4657ec88f0dadd1afa167fe461578917eb1186810fd5be166302ad77c9e81e02b7bc6ffe5ed5cffe6149a
|
||||
1129650f2a6b2f848b6096030746d05eb879c5906469a7ef28c5ba9b0f3705c1c2ba1f710bf3814c9e0f7c9c929caad25f5a11973869b2c590a9c49f754204e3fff95f18fff9fb4a
|
||||
3fcd89c3cd28e6d4c2e479197fe60177862d2361455ff35c0e6bf2b1959f187c6976bb902197b9f117bda2f8e24c0e25e4ed50674b4654deb9462750c2836c05001629b60017074a
|
||||
c947c98d564e58b8e413be80226d7e1fcb6835a8abaf557059f7886ff3d6b57e5b37903c9ad6a3a99b470615f90fcef99db9f6138554173c574dbabeed6dc6ab0012162e00125a57
|
||||
e07e9ffa85af8506998bb82a2f4cadc3b063d021dc20555a74d10ff24ddccbfebce2af352f64a07989bb2d6073f6d5f00fd9b8525b122f07df9c33eb8325a342ffe54567ffe54d02
|
||||
8ac23760a245950ac34becc973b503dad6fac17e0366a0fea2834b6b3787222487fee201fbfefe5f5966e170493b7fc841f9917cb543b867b5f98f3967a2ba56fff6df25fff62d8e
|
||||
07e0c56d039340ee6e7b8ac2c4077b1e6c291782b816aca762853925d8c7f67be04a77ffa1e66987aac5374451889a4c20fd469a4d39ab62b9d353a5ef5e19e7ffebcfdbffeb6fa6
|
||||
8b6e8208c2c70f1f814141ef24d56695ad4d3764be16598d3d1ca03c0670ac5f040d81e6fe253705812ca8cd1aa422af8a5d65a51b6b09cb7b6545d92bc94f1e00091cb300081989
|
||||
175afbb65a8e9d76ea8fc0978f04e32f126ad0c96eb07eb45d92e7c512704d9965eb266e1f3ed2fcf15180932fab4a19208a7e713efdbb9dcc8228c4daafbb4ffffa4432fffa28fc
|
||||
1b732ec1e5e51370919779f704454daba4a46f1e5c897fd68d0f707351324c7dd3cefaf29f5e297172251c380467241ea598aef0bc431556c4cd61d50f1eac1affe5bf80ffe6537e
|
||||
bd49d5867dbf3b9eac34c30048e1360c1900cb4e31be79a59ea3cf0c976b42e4c5b6a2fc29ea7f81d3f9d9ca45db3986f40c3d06647bb10882511236fa867d11ffe1a23effe0c650
|
||||
51a811e354f450738727ce9cc5b6f15dcfdb322b92abfd0fe0c654a4f8920eb26334326dfc88076147e65ccdeb9b59eb53eca1fe12f0ca13d6f246f207666d9e000b621e000b6f24
|
||||
a9e7caec34594420f126decaf07f08a5b87dc365ec0c365bc81a18aa1b5a715ecb92bd793b574296c590cda988ec727935ca63c20b21626b4d61dd2afc763891fff27296fff2ef13
|
||||
b703337f37a7e696365e375a286dea07dc7a55eb640365acbc02ac8389bbe3a1f56318c5f2b889ef07758f3aeb3cada5d945a10290904a866f831199667bb029fffdb85ffffe0926
|
||||
d4bcba7cf5bd46c96b7a2b9a0f821f0e3b92334d59cf8940e72b3cf6ef5bf1226f1946507ac0cd6e7e452783a961e2bdfd6780d1893953a5807e7210e6fbc5d3ffeebb34ffee0106
|
||||
0aaf8887c5ef00504bccfdede8b34d20355ff1308a0fc318f393f8ce6bb00e199743b0da965c92dcba0f4b6a44c691ddb3d874484b64152c9855a73ad156b649000446a0000453a6
|
||||
748f14546fa6ce11b92a35da96f34431be980a376db154372312215ca05afda37b9e4c9b2ce83ce64e4992cee734f49481ea960295c37115a37dbbd82ff839bf000c2002000b91a4
|
||||
af138c6a39ac6d0e94d370df8fade4929e186ffd0eabbd2d29e2e07c1632caf6cfab759729f317d53dfa5dd0c97b6cbc434f6d5fad4a39d54d9646d6916bf83d001386800012a05d
|
||||
19b293681deb20f4e12d790ff7a42e59bec351645cff0a9154556d8803759fc37b2564c6441575fdf540b84c7e0c60b38fa24980ebfe69d2cd98d34d69a3da060016d96c00168523
|
||||
a8b4e8c39ccf98a20f99eebced2c16684b27e326946881d575d052f0a7af19924a6e6ef9c431710b16f13996fdd9b332ae1ea06853ca4a69f14e6bdd233c0bd9ffe29e06ffe2a0cc
|
||||
9be9ab904cc2fb39d342a33cc66eceb130c72f4169e94fc3c3c3a2ab97dfcedfd6ab6f68a619155e960ac39e5ccfbeb5ae3bee335ebc1225ff09f8643b36ce9a0011d66300122c35
|
||||
85151748dfba7e2fa62cda5b01e2708ca9314cb11b5a4fbfff94de09aa5fa0ef35bb4d50a4c22c97feb6fe8cb8396a35b543e417a6698e7e66e6a251e70a9240ffe58672ffe463d1
|
||||
7455c95dda43d7983357fc6041f78d48131fc36c5f45d0785524548ec308f1ac10cf34c9106f4a80dff2992cbac999071da1f0c10d2512e61cead6d20c3289350008a4420008380b
|
||||
8eaf1445316afe14a961d9e57851dd28af7718ad90fdf331aea363b2c08e3b844257ee0fe145821235c987dba986e583ad83ec5e2d36ded9b736ff63d6f68bd4000cde67000d674f
|
||||
67f8a9042a431fb3c19e9dca9cbf54658d5d95d518c11954d7fcb3be294bd2c3fa106f86ac0003a8463eed896a3f2da75ee5c62fd28a095c1ffeebf7454cf7a90006805a000704c4
|
||||
2643b2462362784c6378aa47fea5a0ef7d9ab6e46a07501122f72a7fe697025845c4a4e8c554d5db60604f2b10822f011a3925b47b33875a605a6bdabb8c79b6001636b100168347
|
||||
d1c18741ea828d9ceea3ee299f1d31662ec770387cf7f6481432f5bb2bc23f46023ae0a988a36b93fcc27b5649ced648d3f88513c2e423a9649a0b7f489343280013654900138103
|
||||
14c8bd3e357a851e6ec34e068df85654760599f51c2c33bdf6bc84b36ce47ac0dc419accfca112970832c5cf2cd5d4022e8088be5f2f2e8c17d1b1861ca3f64f000e9cb7000eb9ba
|
||||
0bbc698a82414ffd563f8d3f51df504f951226eb836d263699dedfa2b4124b9846c03eed72a9ac712611ded85e9a86a141d1753e5f54a0696e73d90685febbeefffb3c29fffa996a
|
||||
14bd259ea005c91b77329d23ab91577b270fe00c7e6458ee2026a629eeffa79d62d5208b420b5d910423cecb2cae9f6bcd4cd8817e6b58abad575ce15f2ffb47000f2652000f3ccb
|
||||
023fc71460cffd8aff7b5a8d08a0873b20c0fcfbbde595f11eef4c392f9887559e5935b2bb40f7a4a6511a1f06c4f05d4686e9fb96b320cfeb3f0decf4080aa2ffef1aa4ffee24cd
|
||||
aabc221d85863a932f7d8d39a8a286a73ea01cab7497d19ff6898ee6edc6ca991d9ee509911b8f272b9216e7b6ca565d082f703ca2f476e9b358ef71d7c60be700194ea90019ac4f
|
||||
40d2ed1176d80dbd500070dfd95564654ac52665c07352e4c589e02a1660c37ac1acd9e7093f3ab761876ecaa46ae281d31ca6dc2f0353b53cc1584613fe789d000d3d2b000c78d0
|
||||
aaf7300358114a785b3d4c6a3637bfd42f642dfe1fc804e9421dbb98688435bad7347599bba484210bf123f1053a3704ec766583cb4bc37306204d068b9bf8befffbb5cffffbb961
|
||||
fd4f9f3e0df5650474b21b3b57b423d98230c76d8d55ba935bbc8aa3fc50a0d5da6248df27fc207f4ba381148ed6e510cae8718fd2219b614b7f1e4f930921b3fff874ccfff7b564
|
||||
82e47f147a77ecc7d6818dafed1c8ee20e142a0e322abf28af1684223793f44f143709908afb49b358cc9bda07f26b604aed507d054788c908f216acf305d3f2ffeab98effeb6aab
|
||||
f24239a6aa3db6f322056fdc4b80b7e4c3588d23ce96c57a286fc7700cdad7dd0708f2d92e44808a54233571d1e6b8b54e3fb4c903da9f51d7e9cabbd9a4b9e5000b93f7000bc1b1
|
||||
ee8c3f277f8090a558e26a640534693c55f817dc728bc2c65a0bdfb205e78ca10c965f54d9799229b7c53181689432cd3b92b7d0be3fd7319dd431cd1561dbf5ffe1e850ffe1cd83
|
||||
1d5ddbb807635fd7d6861630f68972b87027cfc3c4f0e65d00a5bb954fd1202c73cb0c5bef69e7c514aa09253d90c7c0f862c18d4dd5c7d227f5fb6642726e48000151340001a9d7
|
||||
f52c783c7b82cc2a8eb498994b45d900971a2b7cc31b6ee61ad5b201075e01bfe72bfbfc0b5bf036a27436d3fee5c964e39959822ead265b163e309313d126a9001e2f50001dcc95
|
||||
a218f58b90110eddfd02eb05541a49c62c8d762e55754468e1f17e6567a7d6f3c1b5b2d7e5cf45e2539f2e3c3fe570649f2c66cbfcd1eca5609415db01c00b440010214900104721
|
||||
1e7dffbe4bcd7cf980879f5a4971a5c48ae88ee951e7d153da8efdb7102271ec76b3058316c4289acc1f67928716204609e43da90b0ca7a1696a80010dcfafeffff593c6fff5b3fe
|
||||
8148baf4f521ee7193abeb15cda017d5df5e1b744298dde24dbbafa1d14edf31af3f3ef0a25f6e4acfde5fd53a516523c3153f2b1e80c0128f849af14b2f68a7fff60b16fff6054f
|
||||
4304c29ef8c03af4935bed7465f4a2f7d01cd60a40a7871ab06e64e746f78550e12d37ce08f556640d4db9366d0d05792b503f1436d316848677e263d48ada29000a003800093f03
|
||||
518348ba41828a4e736f52a15a3c9f94a90918128655bf8ff52d552762ace63e7360dc955b5ebbb0914d09968db492ffeff73dec596b18794cba08deb5707167000d1d6f000d58dd
|
||||
abde8bc0e974c04c4a9fd67489c93758a8b5ff68959bac2e3ea1caa3437cf7e06f1d7a79bc382f2a7768a0eb02b8d3ee2c81e3a724eeffa26431fc09c5e6538dffecda07ffed94ec
|
||||
f71db82c6b0700d65b25f7949d04292ab4d4d938b62f354974ea3409f5004c92f2b43642334a38e0e3d7c710455d63909121758f370f2d3feb13a2a2988074fbfffb7894fffb8931
|
||||
1a126b29ad9c1c7241cc132670434d72dd4fb8a51a2f080102ad01e7e1e85424b67fb6d36b4a3089f97a94cb135126f492852c8fe14742658ed71b4f04ec5061ffea8422ffeb8e68
|
||||
032fb5ccb7cf1ae204afd4b220fac2ab401601539dda1f94d832c1bba79e4d515c4c09a131934ffdb507e899482bbe80d033244d0c294b9578f7863c60957eb60017e5eb00181903
|
||||
4ca08d8b1e298ebc1c74d86b62b914c76b8c6c60c0d88bfae3714a210e2930a37f3f3a6aff2e2fd02e55c901bbe2d0fdcbd53a315dd8653cd68c27d8aad24cc8fffd3e99fffdb746
|
||||
9abcf5cc5680f3e71f9f4355c0701ae3c6d94abab0bda6b8a0c07fb3bf7b48d6ca36643a05d6069e5e80b76f2f965337079d838f72748fe66f7a5051eb8dbaf3ffff0df1ffff5d5f
|
||||
ff7896259c757f5db95017ec958d91bd35f38f54a01cf385faf7f2e727e3e35f53ee7de80aeae4959bb961fec047d01feeaef61981c34995e67c06fc9ff111ba001cb3a3001c95a8
|
||||
84e0e86f4d252803c379eb2bd26c724d82469d4b8eb416222d6105b00aafe55de24333ce1dd6b2eff3ab711a69b14b3876e9710c6183fb97cf874718b83f9f8bfff23453fff20f95
|
||||
1c3eaa8c1bd28b0d882bbccda211ef761054fc3551d3903240ff898cffbeb060e0012660b2973ba60890be2201e11dd3efd8ff6af0e8be505e187d033a2b03bbfff06634fff076ee
|
||||
263825289784d5765a60407fc4e227427561606b4b503180485277cd83b390980f35a68b0d3d9c4325127d8894e78b073cc417c5e34f7d6b30a721cb9c75894bfff0a1f2fff15be1
|
||||
fec9569702bbeb1fcafbb726d52b195e0987c721a7f3f0122de5b28b3104a563f29fccc897574701fe3eb9dd7d7ac6af6324e0e1806ce9d894b16a4dea720f240009f3ec000a17c6
|
||||
b42a1a4d8bfd4477301ed9f8680859b8896318b4258f1c72ecc3b7050adfe283ebe7865eaa1203f00911a5bfba5a498b346a180e21bd4e6f6ced69abcdfc889afff87042fff837da
|
||||
6f5297077dca331fba2c761a055363c56d4e819ea534b58512988f155a41fed6641df4bdb7c8f8712c3972490473826f1e2518d64a7516b05f9e6a3aea5265defff89197fff8fdb9
|
||||
d4f0e888f30b654a4e5c605b2ad4918a942c66d97e113f4622bf1697b217c7d703b7e5162bb906b324716a376c8e123a1008cae19e050fb74a6ba93d11a99169001d7443001db271
|
||||
c447371f47e955455d0bbe9a86174d017491b5db086aa5fa1498fcdee8da3f4a1b254d8d1fff70394823fabe7769b7ef935d4aa993ecf3af249ea2612f4f774e001343a80013526e
|
||||
0732a4388de05743807cc5bc8569c059dcc523c2351e26c77d1f4092928e776e9518e24ec23f4223847a310865dcbd5bbfc26db80a2f17bc43412960d918ccf7fff08e9cfff011ad
|
||||
5a8c5fe84c4f1eca36cffaed174bf18a392d6fe3c72da331e840c25544c0ca6a2cb42562c55e136a3fe8f83034c837c31f21deafb6a3a4f1876921af48d0dbdd001df766001d3836
|
||||
3b4079c14a5000b52921a03aeb87960cc31af9421b45faf426137a2440f3f9e2d39e88d35eb92f730d3cae91b227ab17bded159b6e1465b83310f976f85da75a00140f2c001417f4
|
||||
4e070c1caa773dcbab286a14454d18ac32816069d46cf0e8a292f862c3caec00b9821d242bfd4f0137fedabf419f472d2ba1418108c3c01ca185becf2caf9646ffe27b2cffe27bc1
|
||||
37b7aac5d0db996cb2a25d681bd0613109957f9195cab8eec4d047aac29dfb65ecff0ccdcbbe0acf5af098386de3866b9368357a844364ec716625d32debca9d000659a800061d8e
|
||||
7ba0516ef5a358c76e5bdbcd69305751bf1e63bfac4c53a1508e4ce875cf2a600cc1b85116d5570af99413718ff35e4f82fcb7e16aac1005391096753cbaf2620018fe2b001870cc
|
||||
5666bc90246b68b5099e2cb4a36098bcc6f06639e69e5d060c0aa221c7da98dcf60cb03bb5b6d8ac3ef49c554d15578d2151f2dd48b93faed2ef8822242828b7ffe33067ffe317b6
|
||||
f38cddf0ffb96491b73ce59764eaaaac3ac219c5b94b44cdb2843737b5ea5a53f380ca8105d8fc32fd3b405938dbb6ec560de8c097b23fcfc8c402054cc17c5d00191b1700199d86
|
||||
5c4eec8c015c21c4b607049f294f59200e5ee57bbd891359fcae6b8d30b1cc5101bfa5dd45e3e842ef4e6ec426e5824310b6b910cf39392ec36c4794d998861a0015a4be001522d7
|
||||
a3b4acd0dc4b0586f1970463eafc71ee8e88b69a12bdd7113a49ccf68b1b9424d1bdb2627a36972bb83db94860156012f49dd4d332bcd5db079f361a9c9c1a09fff8f771fff968a8
|
||||
a020cd8fc41e4c6477a7722cfe5279cf494950879e241c7e066d7a6591946de48c4bd3d3dea96b04241af8c917c7fbe69a2a6147d6d7ea0b4fabb024796e7251fff6a9e0fff71882
|
||||
430ed7b028ceafb4fea21e580df75da704ce6d4bc48cc7903eef7b84591eab7a3e6c0346d40426abeb1ba2aefe0d24e76ed06f83cd93852a50cd83a04821425b001e76b2001e9382
|
||||
dd082366e4e22c95dfe06d2022b8a9d3689153f43f8e0e1404870ca6f19c4df381f3a8b800ecd1aeda3116c50968245cf566fe34faa9875e915621ede008f4b9001beb88001b8e90
|
||||
a2a8ae1808e78129aaceb5020a264d9c8d3c789351d8fdda76d18034b24af15d81aec9bce10a49fd99034d595cf106105597c9946b430a7fa193b3299ef92c68000cc7a8000ca89b
|
||||
6a100453cdd68638bc4762fd62b9515f1b91196e0666c90c91946a4f567bd60c5082ec35ef4d8b0e2302835a7f37b87a4129d0d41988511864077f705f4c9ac1000c06a0000c753f
|
||||
6e67df070d853e626ffee5f660415e42a8f149196f0d7bb5a2915525d197de02e6f561c401487705abb1d119e094bdb74c99e12c141d94ab3bf0794a053a6df0001555ca0016386f
|
||||
d0743e66f0a3960266d1bc1e5e6db5a30d648e645ac383052105f14e18a97c0753f7c69ded1b7091b0bf827ed32a200a821fedfd2f546cee0f7a4ac404efd0e20016b0f200163e7e
|
||||
0d993b07f6720daca7265af3791f3403cec0a1f2059b107e34f0a031a59e1d8f3ae43311e30ab12c89ad158f857e6cfafb481a852869758c22bb58b7e8059660fffee39cfffe3c5a
|
||||
e304499e3e11b296829a7540ffca28aafff608fc7eda1d27ae8278cb0ada14e6c9058c6a0fb369cf2bd3f7b90b1c9938c5d5d1068ae8eb14bc709aae1f8416ae0011606e00114349
|
||||
0b64ce02ef1a499418599a3ce159ab1b63d25cc88abed4ea8ff5e110e3c5dcd647cd5b97840093bf2e7cbcd042ddd4bd2181b4333670bcca02ae801eb0cdc0ffffff83e8ffff6484
|
||||
d7b6faa020a8a80a387c92ccffe38b796a0bdb43f4c6622a08237768b8ff3e3c0b422e3611961d4b7fac0a616378472e385d86e72ce098fa01201d4f25655792fff37433fff3eed3
|
||||
06575b54433c54a9b24b0c9c16277ff5727b875f272d5563945bc34588c03b600553d0fdba036e4984710d65280e3da3c2149ace966d9a5fed5b1c0f1906218900166d7700161525
|
||||
b3ccc0c76b2c5818c11f1394ed5959fac2013c45eedc68991c108efe4984b45021e27b435df6e947ee1c0fe6b0cbb81d9770d40340dadd53e9d15c19cec623f40018410c0017fc36
|
||||
74af374bd13e4d649028f1351dd58fb1963e2cf508ad2bd306a1ab21a86e6d771fd4dd163d4463f6ef419c6cd0cb66994e726c973078b3469c615190956ae95dffe5ea50ffe4fc0f
|
||||
540095e5a55df701ba953142f4b7c3916185028adf6ae80d9ec0a7d084b7dd40fed49994b6556aba504cf1512f71acf1bb89771c0436f77c95b7ffdf48baa08400017d3300023a7b
|
||||
ccc6e49ed774cdbc7e356d6485b663d63a35404f2d2f44d8a6a9f4fa62ba1fed29dacb980eca153467a14e8d3edd20c6d5c07bedfce9ae2992587919cb30ccb1fff8867afff8a7d1
|
||||
9d00ca71df4a2d486c3a10a860a3d9f8dcd64f4d67e56c1520be265ba044f55130ac46b857449fb2ab7b7122727fd10e8944452d6f1b44a0b9c25cf1eae1886e00032cb70002f443
|
||||
8e18a4756a32519ecaf2a922c5ea5c2ee3d59305383e0dc6757cad575e772df7a146c4e14aee3a85c327cc31093bcb13fabaee1ebe3da47ca032fdea462406ea001850ac0017e3c3
|
||||
ac579d9c8584047a3f59d70127a44e2d4a350e3135cc499eb772a57d9df342ee1c9d23dc43fbfb96c15f2ffce50772d454df1b1e62e83e5f12bc7fcf2cc2beecfff58352fff5273c
|
||||
fc162ec2cf36832ef0c5803d0005a409dcc46c13d7b1c4f67e60355ec974ce3c7f753399ebd7d7b8465c7ae16f863970884d9b21bff4f9ba9ff86b4911b9384b001c2fcb001c46e8
|
||||
26df797b9755534d4491ab8261520b3d67300c83d494056a47147da0f9c88d66b7e6f4e65aaac8ebe941e634c7530ed073d5964c731242116aa4d6f136d696f6ffe78624ffe72c17
|
||||
c853cd73de9f9170dea2d8bcd882ff4131c2211b8adaba49cf7ec61aee254ea88a5a6b3ef491c35a44584afcca74c207125caa5ec27f877ab44dd84c5e0a3dc9ffea991dffe96f33
|
||||
1c1b102211a7122becdc1fbbda5cf628bb08c80f2cadac539a77c40976683d789d4cec9ac9b57c8889ab37a643857a575a1beac6abc5f2c80caf1d1aab83b2a4001be7db001c092e
|
||||
c5fdace7052e12f67e0b50133332875e7e5e8e6ece16ebcdeb606b81ca8a35aed3cbc6db01be33dae879e20ccec78a063bc2292242790a1f994c5d56b50de4b30017abaa00178817
|
||||
9a2458a152853b9fd187c14d15c3411cd3efa7cffc3da5fce8a181cf0a136b88f6f6265f703ddb1640c7641d758ea7895a87bcef6f13ea94f4a91b41951de896fff8f9bcfff8a33d
|
||||
9a06c3ae943685ee33c5dca3fcce107f4d2904991219c44be27309a3e60e3d594ddd4993a08b08c31cc19e2bbe1ed00659004bcd4f8afb8c696114a50a1a0ce00008af5d0008899d
|
||||
f08eb8b8e70dd6cf9bc708d6c01b7432afee3f9d30710a787d99c8647bc40e14520915eb9b5bf8b4f53a3ab8012a966915b33efebaaf76ff681a65fa95737f91fff0300fffef6c0e
|
||||
68d113eb439d18aa033860de5b33bb749f5637dec021664a4231cdcbbfcb4a9c8993bcfb230da35568035e12b6a97e547395ee50b6732cc8349d72c5421573870007660b0006ac9b
|
||||
be3155c1132d60178a0d001647ff4c9e5ba9b1a221b9cd49462fb3855564f52a7883bbac248b38824574a9c0d02741060665674c33be1385ce0b3f1101a681b2000ac70b000ad808
|
||||
ed1f593b0191f74762ae5198c6f854c9a2e51c282381188bb23989590d358d12645b393afcce69096647995c6d2ad8438b84f566540449bd061204d9d6eea72d0000b95200007322
|
||||
5bcd0c247989ae1fffc66d70ca0ae5fd16d6bfe51a6c708233d034b2964943075764ccc5892faf8d747e17f6c473f86d2190e4747ad72d1122eed943e4c30c7dfff236fbfff1de60
|
||||
bd30f16e5fb1860d3a44115b1144ed3b0a77678e308449994250b5ac34b2ef75d8d43f3f5087684d76d38ed1a0b296fbed332873b825a4b83e58aadee8e2561cfffb83a2fffb9471
|
||||
2cabba310c57801bcf3689b65826a92ab59f16743749dba5aed35d09ebc8f17d02a53cb35c7f6cc727eae465bd64b1941ac6a72c9f0cc22ce6d7278f777b6f78001b45af001bc0a4
|
||||
c009f70cc86c8752869eda06d23a4bdaa5346e3ae0ce58dd18d70057a4b315872cc6648128e3ab01d5bb23687a2967d22978256daed3331aae0d144181cce2f6000227d300023a6f
|
||||
5cd96b61d4ef5690f236b1eea77605f06fe7641e196ca401949f31f5c736199b436a76adc5c07e0ade8d47b29d41cb72355dd61a5d282b38ca5a626b5fbb3746fff92f80fff920fb
|
||||
de2fe85c0b23f4544bd607d8580719d00ecb58c5afb31546c4a626c18fb685f1b760d325e245d67c05522118edaa6b6df5c024b2aa3a1fd78c67f105c7dae90effebc97effeb94f3
|
||||
270a27d729e4403c066e64ca5af0081b529e41d0704e5358f85b420e632b500a53e79aeec1176a6d5c197e8184e94e699004d4cf46c134e2fd56076ae7ade45afff7867ffff7a83e
|
||||
f73f9419655f2857ce3f8523f313f864193953f9324f3e6ed658f215d44944cce3a622c2c47131d7b1b178617155bf0412131932cab5138bc909a80d22914f0f000d036b000d52c3
|
||||
f8aa3add23893caf1a9298c02f8cc3f3b6eb0af0b3c4f7c776752760e1b2bc4ca8ae03670da77fab19e8aedca504e72248f96870635d4d27b0cc57ca8992ae68fff6814efff706d8
|
||||
c079a2ffaf6e442001fdd6e0ad38bee717fceda46411d59a47074ff052f70781c42cff708493ef845981cc36f95c6f059a4601c5825eacf24d723a05acf7f262fff45ba7fff407eb
|
||||
6806786bb75a8ea8efb2b13d1747cdbdafed31c054bfeba05ea96fb352b8381c208425fb4396ed64a4bfeff5ac5195d102c7b6339c33def40b4a4e8abacca5defff36e9efff306a4
|
||||
775cd66294313c630a979bc43f648564a648a9bbc314949ba831d560282ee371ec70c9a025033917a78cc198bdbdffab21542dde74b9e788c8ac5a72ec59e861ffe7425bffe7d921
|
||||
2f79878cf8955f5f46fc9f0a0106887c712080e9133f090a3946ed1fda26b37d5d52aac11c02c1ec88ba3a46633b8e315d0bda1ff21a33dc4b334a652471897bffee9accffef3391
|
||||
85240ee43df77b32759629c4b3f416f685596fe206a849e07fd3bb62edf6fb14eda65092842be9f102f1cd48e11568dc3ab8b16692df185a040e31520985190bffe62b7bffe52892
|
||||
b90a924f75335113ad54895c8cb2f85f984b930356b232c86193b9bca230625727932127b6adfc76efd913bc289904a61721cec7763a5aa5f14e87145f5c088dfffe2070fffdb7be
|
||||
4eafe389c902e6449e296f805e0ea7977d2efe39e5acda398053c16105cf3a871e0c243b2384eaf4fe6fac17f02a2ff21a35741fa70bbd1b91e8d42e520818e0fffcc276fffc41d2
|
||||
f22f6a02993b58fe54e31c997f00661cd10d9f685320107ea8e489d767eeb95ae1e25d49ea0b4a4122859d0a71f417b118e904baf22ae1e0b1d2e75daa7ebe18ffff77d1ffff1b49
|
||||
8f7fae072a555badc1680899424f0fa32a9e4e53ef864df6ddeca3ed867288034f8489831e6fb101e6959c76cf21e916949620f4cf6dd054cf3d82772a65d147fffad45cfffa15ba
|
||||
1220e56b3175095dbf80b9fb876fac57bbc8ca0095f6fd86515a74289121ce0394be933661629f6fa108b1dd660f32f261ac8d9a6ac7f4dac04e3d636d94da2300150f1b0014f91a
|
||||
d20c8bbca651ed7b92853a2199c1e0a8d444944aebbadbd1756f16eab73c4bf027982bdaad33c7f5a5eb0939ff3b57db9b0f544720c57467bcd4467857fabb97ffee2c68ffeed8dc
|
||||
69d3129fb4aad644c0994848a9cd4b4b6590d95117e7dcd9245d17df78c42ef124f5d5c592068b251aece26b587d733078349449164bd1fa5b8ef58f7fad99af0016a3c300169fe0
|
||||
8f3e3abbafbfec6b8618ead0a92ec3b28a23cb07f57174cfea44216b88173024132ef06c36b52e7627e77459e074deef6acc8a3fa0d0fc2820ff167b5f95425ffff7172dfff6bfa9
|
||||
1b9248069b8c8b6195caf7a2853d74a98e4e54697c762ccc8055eb7b87257e4c26deaa9a104d20a380c94c95bde9d9996f9fcede5fc5f855fc70c83aafbdb52affe4e858ffe4aa9d
|
||||
2ea1203db8e5c5a39abc6a585fbedbcdc4524b806a908a9f24bdfe040f491459a502baf1283228797e2d5e962cd343778eab5e9d20c5bdd12d2f7914ec8374c6fff69fa6fff6d568
|
||||
7a4f2c74dcc04abca6b838c2e00bc26eef1e360622fc2d6c6928f53be6907926fdaa5e997d0541ab0aadbeb57480f1526c4660e6d9fe07f0250de07153bd5161ffea5e5fffea63ad
|
||||
c6e127b6d2622231d09e7600f2d31a4a99eb36b2a426b14ab7cd62afd0b8c5eab0a6612f60fa70c7e47f01869e3e9830d96cf50bed1629c48f3b5a404cc8e51b000490a300041935
|
||||
e2116239dbeb1874a8fc74a9ad46497d6a0d3315d43133f0111b00b0b35c85d7dd61c0453fffa18693a55b2ead6f8fd7e8a65e8c75ad21275ec1a4d1f5ee2e0dffef54f6ffef42e8
|
||||
c44ca5383428bce57f4a1a8cb95ba39851b1d27a701d7d7fc16bc4276b49cff17c88e0cb01a7f4a46d2dae2fe1ac2671acff44262ea7714b176c68b39c85c7a4fffa0d07fffa6fc6
|
||||
4d3a2601c3aa638ffe45246ec00656b0f7d115ca0889985618c2898eb7fdca477fffb78f2ea673fde8c5e4adf3390d8638e26a8c5233de02a6e4f0d786b771e400016a6200015efd
|
||||
449187563eb2827baa9bc5479870d9f56b637aa328f9d361aa39f26fc2d0062ea6a0cf89875305cb0ce3b49b975121d97162f2f1bbde9cb204bd3ca1a90f85d0fff77dc1fff70155
|
||||
83a9f0694d86de4945032ff2ce6eba411f650ad527722a94180a8bf6a63229ee11c1e2855212dc77e2892c46f87af8682e88505b9e178d4a76229c6d7f46b1d8000ce3b3000cae9f
|
||||
fa3a7d500d2736bbfa6f7ac32fc0c013b19acd9be65ddc780016b8b6b4e37f0a9460037d54e3ae57998cae1b824deeb39948c8491c83df092e8d26efbc637747001c9d1a001c2e97
|
||||
3f126e8d2ac97588407667b041f952af1d06c933b644aea85924b7242d347936ae7e4f1940b0bd23fbfbefdce179133013cb611064478e8ea37f7c313475d2980014610900141737
|
||||
c9d3aae40b9e9f8ceb8d3dea8c0836842f870834d9c6513c1ccd659e8197935890f4833359633c03b2f4853ed1e58fc4e7bede1bb718317b094d9218ad9b840cffef7085ffefb705
|
||||
62ba8fadda0af0093866fa631600a2e4409f2e15254169b96b87d1ce87569ba554bd2baac1b0b931a53f1ebc7e7a79733ce43079d5d69dd97a12ed802bd444310017ed080018306d
|
||||
138ca95b2f14507854c1cf9d4a464385cd1fc69092bea68559e2265289985aaa35210f0a52bbaa64f77c981e56837a2909032f172b58c4d5901807577176f2a00005fa3c000653f8
|
||||
35fd6bdd3b23f58861edd7aea75d6e13b30cfd0817299055723bd5be0310220871d0a71f3b1beb7056a03934f7552cd3fd4049132cd37bff9aaf7d0e666ec113fff172c3fff1684b
|
||||
be71febea0d066bc8ce6bf573b565c2fd5d25087c09a320f871f93f5df576c24e97fddb72a0ffde75189fe39264056cf15fd44ee4fd04226af368c117f1a6138fffbaad8fffb6b6f
|
||||
c908bc944c2967f9a9450e1936229398aa9f0171b6dd0b2b7045a15fa17c2486748e6c5ff82da44202059364f66870ce7cfe2b73f7452d6440a10983095aa4b7ffe7bc73ffe7a079
|
||||
89aeaf706f0dbb4111e27e1e31d9de1b52adbcaef02955f800c78241e1465bec0be3ab01d2e2b751c6ba8c3ce72ab2a65bbacc0c72f498df1206f822e6c6190cffe74ec0ffe6f98a
|
||||
6d0babedbd7b6345f888810782ebe40af59458c1f6b9f6df70fdb02a1be43a2015ff3593ff7985164508af001120c2ac2afd3e75d68d6ddb032187d584d837a700187c9800189f5c
|
||||
72bcbb601961720eabbd836bd3efde76a83c168d368767f19a11e180b759f0a6054a9d1c70cb8c9de09c6dc3746219f361fa4111b5697b5f1466a2a099488d88ffebad46ffeb9015
|
||||
173696379ffc429e3f823829527f83dad585a23c5cc322b9facb75e3898fe9c5a7170501100ed378261ebd8227921752bb380fa961b50f81da79bc9c3fab3243000c9558000c6686
|
||||
cd77127811ed6cf01639b142138dd9d288213c72747406a12dd375f26547c7fceda1a165bff15be9f8305703ed9fec94a31786a46d19cc6ee52f10bc7177a793001844560018bd9a
|
||||
285976cb418722432439b03f65cd3d532dbf1f6ab618fade68ba95c217ca9e841a3f3198318014fc2e012c0a0811d4df4f40506787a581a9aa0d1a5b42276fd3ffed2b30ffed897f
|
||||
583c2b3a1b8e4a9bffb0c65320a3967335bbe68aa3975379e91661c9e4b815fa45a1dd117500166dc54aa09d054ceddaf6c42d555e60e630477794b7c0c771f80018e48800194794
|
||||
b176166c1870782a44bd95ba025c15a951f799e8b5345e7d2208696f70ebb1383f66a5b604d0725d54502e2382cfe1c3451b0428c8f7a0484e8518b57341a8f5ffe37e1cffe43f42
|
||||
24fa2ecd98d456b285df80a4f581ed64daeaa19d9db63e8aa5d842ae0f1565f7bcf5cbb52b93f8d56ad156f11e6b2c8a349ddfc6485f1eb3d374cd6aec3c085d0010d4b00010d80f
|
||||
b07f4f01e84f4e8a0e097bc1b1af226be8333dc03117127f14241e3a5931c49105830f4415d77a3c02aa60b1fb53f3bf4d0f45a66ce19ee10ccbb91d85f33fb9000545510004fd6a
|
||||
b07a29488a1789c245ffa39ff59e4e4954777955c03bb73a203b82b66a61d25d8b5e23c7ca7a865c49bd67da9c56a3636d6e691870e9bc938350a0743891c89fffe9ba56ffe9783a
|
||||
3e225f8f9f8670060563645c472d0b6a7d0e3c23cacbbde8f4c1015ab5dad7ae154cd60f994490127f5b47f68d6a0562c77004369cda62b6ef9c4f7ff05d1be6001ba7e3001c06ec
|
||||
a4e94bd0f512661dd04cdac5099d4b885d72896f09cc6ebb705e4eb01b4942506e682b24824be3c974ddd07b92928e8bd9ba966c2cba459a0d67137ce428f27a0001992000017fb3
|
||||
bbc746679d55ab39adff20a6acf879f72eb5306a2551a9588399e8743735ffeed1f6b2f60e12be389b77c7c1916af8e65a41d68aa51334217781e21f812288b9001bfac6001bb24a
|
||||
c560cecae3f35282fdccfd5ae201846d2702c9648ec7aa4dc43399ee6f383808e2fe925239eaaa565d828031adac86a1c0b5813c23c8dbcb97c42225166724a3001d6fdf001cd36f
|
||||
750488544450c64daccfe557f2eb09147717318e9b6e33333967768a6c70080d52c7a92db22c51d8bdabb929cea584075d5af4ebdd6eb6765ea02e7e43fa163d000b40ce000ad0e3
|
||||
c5c129d420b16195e4c73988ba164cc99850a3af52c05c7170276aef04c2f559a847e2e04fb740af4fd1345662b2e80b6517d19bcccce3a356074ed1f16f909cffe6e37fffe6929f
|
||||
99dbca7d6039ec66cc41f452bea75f7cf991e691457131f9539855c9d0f1593d43e0f63bec365f9f21831b236cf7e7b486a99c9f13ed8f986312a192d68b5560000314130003fc63
|
||||
c8fb8274629c5865f1c7132c7d448d60e015b2e09db7b1a0d1596500b1b44e25f9a5445f1189654e8981cd627b255fddf55c9075f8de18bc2bd6913032dafed7fff36cdffff380d5
|
||||
5c4f3055c03d2fd0b69939cfa1decb78f1804a8d895594b3389d89ba3ea65d2e4e814edc8e7089d855959f345bdbec5baa5ac6eb2a362229e3e831c0c5ae9adfffe65ab7ffe5c98d
|
||||
958201c85d9b12f7d8fbd9e5cc58520c709a01f6c9c262e371953fd03af196719c2181969a9c57256f3677c03feccb39dfb1343aff5ec3225f67eaea04793f7effedac62ffedb641
|
||||
73ebf0edaa164d18b18819f2645db1d2d335b1199071c5ba6480eb9e46e188358fc5dddb317dc46f84cdef2e77827a56d388b7f10f6a17bf7434c6023e1fa99bffed212cffed6d15
|
||||
1f9d5d3c45a475fa5bca91027ec7a809689162f20e4774c45bc2e9b7f78482c99637c14f50942fb31a9bd5222e52d829f9758d2d51a2ae5231583c9dedced895fff87b09fff75931
|
||||
e1ffba6a6f0c9913c0fd078215c0b1c44014c16c2199efc261acee2cf3589bc623e5bb96f80d61b405bb0088e337dc365c3d594c9f2b72f3ee477f7a3ea054fa001ccc7c001cad95
|
||||
5cfe0120ec89b59edfa866e4eed5a50a6f015cfea8872af4fe494c0d6ce23962de0cd1786a381d816f7cd2d3f923a1c8f8d8af47c8ef836a481b6037b9779d08ffe96b77ffe9ba0c
|
||||
077924127ebbc10f81ed969e901f9693fa53607aef2cf8bf8eaa4f71875d4adb32a877c9caf77a9ba078022d7391e6643f4b0a7f4b56768aba33e7bffa125338ffe7b42affe7660f
|
||||
06776ddae10b8db0df41cb042838d14b7e8375382e3bc471da8f54a3ba13925e10d40fd92c78f69a7ed49b3d9a2e23be67814926a3d77e26de0e4c2447e709e00016f8c000165534
|
||||
662fe36651955b44268c249823c1bd908aba9871bb352775fa52e3548631f14a230d2323c31c767d71e43e25bd07d890337b114b6c8623dbeccb2e97d5ce3b32fffd7989fffd6a95
|
||||
5446418a98ce11d98479c58721dd36b8f417fd5bc44fdae2a51aaaf6f958f9dc9b9e77f29237f4dce337e8e2e6f57865adee060d618faad9d1a177b8adbf0dcbfffb5d68fffb403d
|
||||
239ffa3e99af994193f9e783a4d10e0edaa264a410b27dd8528d50222f45edffd0d9f4af1586dfeeb1d65fb5b42d21c6bffd9175e99acc83391ef493a3ef1da4fff02446ffefd8d3
|
||||
808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000000080000
|
||||
807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f00000000fff81000
|
||||
808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080807fffffff8007ffff
|
||||
807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f7fffffff7ff80fff
|
||||
808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000000080080000
|
||||
807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f800000007ff81000
|
||||
808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080804000000040080000
|
||||
807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f400000003ff81000
|
||||
80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080c0000000c0080000
|
||||
807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807f807fc0000000bff81000
|
||||
@@ -1,313 +0,0 @@
|
||||
010102010301040105010601070108010000000000000024
|
||||
01010201030104010501060107010801000003e80000040c
|
||||
08010701060105010401030102010101000003e80000040c
|
||||
b7483466dbcb9526cdd4861542989600000a7c2b000a5814
|
||||
4815ad15958496bac69368ca9a275a0bfff723b0fff76aaf
|
||||
ae51d46e25713b1ad5ecaad9299e8191000bbe7b000bdfc9
|
||||
ef360dfed3ae2d9bf90201eabdb94f6500004cdc00007771
|
||||
6d45e4cf7242cbd0a8f8fa0d7cea95fdfffe2ae1fffe6dfd
|
||||
391199224f11253452fad45f542a4438fff04e74fff05bba
|
||||
67075abf5947d9955b0c7bc62881867d000888a700083696
|
||||
8a208357a1184f28d0588c25e0d87265ffe8b7f6ffe892e1
|
||||
931115638e31f7222ada4a82569b073d001cd276001c7169
|
||||
731f310325856ae736d5faf0ac43f6b3fff28dc3fff26476
|
||||
2f764e0c36424cd56ddc69a24dfa9ce0ffecdfe2ffeccf2c
|
||||
3f7e82c0ef5b8129eba9a2a807e72c7cffed50a4ffedb0d8
|
||||
06b04540b9ffe2f8d21b32b635c7418fffeb9092ffeb655d
|
||||
7a6e2abd117279d26748b144d75fbf0c0013decc0013efc7
|
||||
9bd460653c0826f1c0c3a20b115c6eabfffb52fcfffb76aa
|
||||
b1ce9a34dd6661c7725bb497468b8dafffed19e1ffed3d23
|
||||
d518c1d2d6d7929513761c0bee8a7133fff6f96bfff75e2e
|
||||
7195000b0ef33d3454dbaec2612409abffee5142ffee4014
|
||||
c0f320b6aadfb15c58fc7c645f7ea5c9001d1e98001d78a9
|
||||
17f25acd3f112e2b0a50912898e4c7a8000efa3d000f03b6
|
||||
bcf4f55ec369634ae2349f9b849e48b1ffef2153ffef5d7f
|
||||
94bb2b70a6b6bd7a47c7c98b3c58abf6ffee77b0ffeec2f8
|
||||
06125f9667a9ed35b3caf85b28848be0fff5d316fff58de2
|
||||
28e2a70fbdb984b5f3031ad461757455ffe454faffe4d036
|
||||
3fe63ae2d915e01534d3c1fad65ee7e8000fb011000f884e
|
||||
6ececdfa2b30df16d31aaed4b655dd3e0006db3d0006b4a7
|
||||
7392021baa4fd900d7794b8616786cbefffa4a0afff9b5a5
|
||||
811074997aae0cd6efdafce50995e959000d54a4000cec2c
|
||||
2908baf8fb17185c9becbd36a325e2450005fec20005eea2
|
||||
4b41e2013fe6c565f390be2ea9c384c7fffcc541fffce4ac
|
||||
161db028f0f5805b07197aca3bef0b4ffffd2435fffcd3d0
|
||||
6a7c39956f0e758d13c388335fbb73220016a21200166856
|
||||
b4f8d975269d81baf50f2864e451833efff987a1fff9740f
|
||||
fa9b6bd6837f7e7ab9b40197caed5c2b0003d1e20003e8dc
|
||||
d04ebcd930dc3dc5b9eedbacb07de96e000af3b1000abace
|
||||
b72ef1606f97f053c3f73f035995002400085eed0007f727
|
||||
4fc1480ee648e3d05317bd4815450ed5ffff30aaffff1735
|
||||
e0f4966f5ac1bc89d1c80b108e805d4800013bad000176cd
|
||||
c7e71f4ad3b7b9821986c4ec6f683fb800103d9300109007
|
||||
43d41faae1cce47eff2890933607d8150009b05e0009c0ae
|
||||
c71419b54020ed7001e230c5a68079cb0016a4980016a146
|
||||
dc5ec6dbe9560010a97694cc78cad72effe20228ffe1c2c0
|
||||
fad568a676736debc7f63f75da44141a001763ff00178377
|
||||
c37cb0cd6f4129b747445b712a4f699d001a8494001aa6d8
|
||||
278096d2b8fb101ee37038b0a66abdcf001146aa001112dd
|
||||
7ff9b9c1b1657ecad1521f95069de0fcfffa2433fff9da9f
|
||||
ddcceb697e44c7899b0cf20e8c60b73e0010c4850010bc4d
|
||||
772ab23f01ed4d8125f5068f0c2d8e3c000e73ac000e30e1
|
||||
e13352661fb2a04909e6823c986ddf74001ba4d5001b40d4
|
||||
c1c2bcdc194ac947351050f00d658d36fff9ac66fff9a860
|
||||
b76a21a0be48aa62ebafa461af3db86c000379090002cd0f
|
||||
0261d1b2b0c1f948b460692b49c46aacfff5cee8fff5b0f3
|
||||
e9c0904fb7dd27b28f3c5ab885482711ffe73f3affe6ccb6
|
||||
1547eb50f98216058dfd4737ce400371ffe97389ffe97c19
|
||||
5c56b7101c87a663215aa0b1b5dbe29c0015003500152a4c
|
||||
62b319bbcf47b51128ac5c080ac7fa65fffb5e1ffffb187e
|
||||
8126721ad1b97c16b4450fd19a9ba6c7000c9e7e000cd3f4
|
||||
ce2737533f358361661d0ee72067ac07000a4dd5000a4a7e
|
||||
2c87a56ba9c1e0c100c000926693b50c001d12a5001cc627
|
||||
8f181165fed8e84237925802ff7a7755fff80862fff80eb6
|
||||
b018c5975ae20076508d773b1e8652bdffef5128ffef2b0a
|
||||
96696d0e93c68585a8eab34f4b6aa1a7ffea49d0ffeaa7f9
|
||||
564b654626ede20b535a478f7856cb1000182e3a001881c5
|
||||
dfed96b14627ad18d073479c2d6bca8cffe8f3acffe913b2
|
||||
a234597ab87321659e2ec0eeb64373f8ffea1c98ffe9fc85
|
||||
3101f0a525e72c661e767690afe934ce0012e4110012cf30
|
||||
52616bb1de0ae2840a0e17faeae1a01cfff2979cfff29b09
|
||||
017c1a554e4598d50c73365b416b3877000aa153000b1eb8
|
||||
38f9390cd37ff767835832b853e49d71ffef8faeffef0911
|
||||
40e324027459d0c96e18100dd3d55765000040090000a0b7
|
||||
b9bc479b044f5c88ad11300695839b97001344e400136b22
|
||||
398a26a3e06e18bedfae126e09758723fffbb12efffb7b0a
|
||||
cbb5abd876193e0bc40940fc01f831d8fff6b317fff6d34a
|
||||
42b51761feb4bce61e9f5d2ce84ff231ffeaa3e7ffea9b50
|
||||
489911a340c4422339bd494b0beea94dffebe282ffeba4ea
|
||||
0b28392cf2316542e24558d111a91875ffe3a66bffe3b63e
|
||||
6669918d6f128b3a6f806272c8d3bb0e00009a370000dd6c
|
||||
a7c4cbc70273d47153555e620a184647000543bb0005a5c3
|
||||
9cc907a60f93c630b65295dd03739a470009a87800098637
|
||||
51cd0222befa74ebe6ca95cd2c6b63eb001b05be001b12f9
|
||||
687e3c3467638d2620c6f3a330fe7c7bfff6b617fff744e7
|
||||
871b9634b7f8a0a35057d07eb09b5db7001353b200135f2a
|
||||
6bcec96e66de4c2f289fe024e043a84400016031000100a9
|
||||
fffbd0e19af79c3e23704626e310dfa4001470380014852b
|
||||
ddd414e8c4fdf148c574ebd471a927f5fff2b2a0fff2740c
|
||||
b0839f0acb195ba0f65f5ca8d254d2e000066b8e00063ad9
|
||||
c9f59c462a8716b1a414d1144140985b001181b000112e7d
|
||||
141b1944e7bdf2ea4fdaf5838657c8adfffc118efffc0464
|
||||
93a3b9e21d8b6b3b06bb0941c5038bb1ffffde3a00003da2
|
||||
4204dde6c6bce1adf1f80b3f86c701c1001b5ec3001b9ae6
|
||||
0af0188fc7f63b343665190c1678b0f0001b9404001bbccc
|
||||
5504e54025326065298c223152247dbb0005ccd20005d245
|
||||
c2b882bdbf2aa9e751b9ce1b3789e3fbfffa067bfffa01fd
|
||||
8166387c3465a820318a96eb32229c460003096e0002d8e0
|
||||
9d225798be0e8481dd0b46eaeaa218730015ca0b0015decc
|
||||
6896242717a3cc2d6c3fa59b3c2a2723ffe4f0aeffe50743
|
||||
f2b40b0458a29c4e95d9bec686d3994cfffad160fffaad0b
|
||||
f48198675fc8c34cfb1c3665f204fa4dffee2577ffeded6b
|
||||
267abbba3a95d4a83853830e03f43b94ffe8ac83ffe8baa9
|
||||
26816495be64663ea586b4456215438400104c0400100cc2
|
||||
5932e501bd3a2b06e7d9c32950ec9c8a000578ab00059da8
|
||||
aef9f53b15bf7cfbb4e4ff43fa3720d1000ead82000ea659
|
||||
393c857a359571a58271dee965b29f65001632b200154d83
|
||||
6366e14b9f4ec873bbe05138bb0cf8560004a47b0004a08e
|
||||
59de6c333352a82f34196712144364f9ffe2e365ffe2fc17
|
||||
03326f4287af8cf9e2cb5bf59e972431fffce5ccfffd5dd8
|
||||
44b031dbd65436133f2bc04cb9e63b730005b1680005a499
|
||||
f90b283f8abd2e617f6d7bd3d1e6f114ffe6c316ffe720ff
|
||||
50641c4d226cfd156af6083e1652766cffebb325ffec1f8a
|
||||
bbb217cd36096e5ac86f326341032422ffe2202affe259c6
|
||||
94de250907cbcd843347eaafe7686669ffecd352ffed2f01
|
||||
1cdd3bfdcd1eb5207e0dbabba81ddf4efff0bcabfff0ae0a
|
||||
7674f1b8731a569ef14d18a00e4fab4b0004794a00047ba4
|
||||
629f8445178b68aa3b14780b64fdae56000434f90003ae04
|
||||
2232966739645ab5031fef6600e5fc33fffa4e5bfffa1f0a
|
||||
539d8bc5e825c28f064ff124af4a8f34ffe71026ffe6f44a
|
||||
f9d0ae2e24fcf0cd00a4f9a08bdcace7ffed3e5cffed4ed8
|
||||
16bf4181b1cb4c1e88741fcd2de58c6cffe215a2ffe196d4
|
||||
9ccf8b8deb66fdc266e909a08c08f840ffe8c8a7ffe8f68c
|
||||
4f04fb983f175c0251f2f5f960ad6504001599230015811b
|
||||
87782ca499757f68facb2e4b7756dc34fff54434fff52f93
|
||||
e7af192720bd174cf91cfa3e5db1fe74ffe5130effe4fd67
|
||||
ce233906f7fd214de2f562a7b53c3174ffebcea8ffebb708
|
||||
bca8d2e7520399b177060a7fb6ebb6e9ffee2205ffee731a
|
||||
8b90fb5630f15e7dc0f5382cfbcce5d9fffb30e8fffb9f01
|
||||
2640d8dbb3d30a991daa9ecb888cc934fffa8419fffad2a4
|
||||
a63dc30fbac127c7193dd17f15f260c4fff3d4c9fff39b4d
|
||||
946f50ec1023319003212c1c29f4253efffe4868fffe0c51
|
||||
03335ff4a956b90cd644c59b4cce80b1ffebf327ffebf385
|
||||
c6a7c433712b03fe305cc0b0ac2b28c50003c03f0003e956
|
||||
27f237587a3fd308fe5ea0d52fd211900011ad6c0011da52
|
||||
e56ed41aa68c2d8834db17a3184cd59c000d66d0000d727b
|
||||
62994ae17b180482441cc4720a6e2aa1fff456bdfff41157
|
||||
755a8ad0918d693ef848cb4a03146518ffed8634ffee08e3
|
||||
50eb182ab845a7195600ab5b97e44ccfffe546b6ffe506b6
|
||||
f3790b75211c1ada72262c58c824436bfffdd484fffe0753
|
||||
314f80096d7aced6e0b386b1772f14090015cb0f001657a7
|
||||
9a87153463862b7340a5a75ec31745c5fffa7db4fffa4981
|
||||
778d71d2da87b726362334b3428d692d000abd9d000a6787
|
||||
ef850e3b5ab9b8b0fb2639039d7f3a2effeefff6ffeee221
|
||||
232947efe675728277512e2dfa868a3b001d80bc001d5309
|
||||
8636eecb76b0fb4e3706f941b1d473f3000616200005e0f8
|
||||
f2935b6e5623b9783fb462394f3c9d490002a5430002b634
|
||||
cd443203803bf6feadc2fc2eb5b75616fff32dcafff33391
|
||||
377143a0ef27ca7606005e75181b8351ffef7e05ffef67a2
|
||||
55ade9241882593eceed313267b735980000992c00005e80
|
||||
ceed591380bd78b4949ae63db7311287fff8a49ffff8bb2b
|
||||
e259812fd85d80d85c8f8bfd259f3e4c00166be600162cc5
|
||||
3d0a9a7420c552e675e6d034105c728dffe1aecaffe13028
|
||||
ab78a726ad0a52e5867f6d718085e017001dd7ee001dc533
|
||||
ef286f9c9049c543044174687dfb6ed20010423c000ffec6
|
||||
3ad04a1fdbc29ac2b7840bf43f117015ffefc322fff01319
|
||||
60dc4ac38aadb96d0647e2cce88b4abffff0de3bfff0c710
|
||||
798ba083b24a31a7eb3056ac2aad4acffffdc4d0fffd58de
|
||||
37850ab05453191f70707ab0f708dcc100033af300034f1d
|
||||
bcf250a377ce3c755a1b41b514400646ffe195ecffe17dd9
|
||||
55ef3a16173a1aac06f36ce99d68225800099c29000971a4
|
||||
48dd3f091a221c0a332379fc33588ad8ffed5a9fffed8097
|
||||
d62507012e68669aa3d6c4ce53d1f9effff6cd53fff6bd88
|
||||
bf6552a08ce02879f29df8b6250ce282ffe3ea2effe3eb6b
|
||||
14e7a8a7c082118af4065ae66bb627860016f3090016ec67
|
||||
cb5e66cedb29effa191c03cb362098affff2a153fff29e2f
|
||||
033a1a950e741bef813584afbe3bcc5200136fa300135713
|
||||
35b83866e0a478ea565a17cc91d44253fff9dfeffffa2a91
|
||||
a3b2e2d467440fccf003cbd6692669720010e5d40011667c
|
||||
94f230ed09843b0ca98132fabfd9ee63fff837b3fff86561
|
||||
a8c0635d9360606284ad53849b35af11fffdda24fffdf5b1
|
||||
914d181d43cf2b9e1e565758d39b95a3000a478c000a6c34
|
||||
f9bd85ea6cc76aa933329767408eeac5001532280014cac6
|
||||
deb9c9b1ed4e1946114c2b4999a66b950015e9f200160e31
|
||||
04ddb3ded7a90311a47ac60bde437d42fff5b8eefff5b9bc
|
||||
f3ec704da2535324d8758cacf95e7613000f42e7000f6cc5
|
||||
84c37268c407fccfa3c9e4f77542ae46ffeb03c9ffeb6b7a
|
||||
e902db12fb364e8d5f38a2fc752cbeb7fffc0aa3fffc20f1
|
||||
cae028e53409288138e0555b94896825ffe55c3bffe5a532
|
||||
fef358ec43d67cf5622a83b027b1d82dfffcd3cffffce0ca
|
||||
0a053117ead48bc73c486f142665232b000057c50000a89e
|
||||
1779e5215c316779e0b0e887497dd193000fac1d001042cc
|
||||
91b75fb91ea20265ac1e40ddb1a5130effea9fb7ffeaa552
|
||||
dbd6cac1d3e74496d22c74a1199e1341ffeebfc4ffee83aa
|
||||
6484122c02dd089f3752232c108a5583000ef2d1000ea8ec
|
||||
2794431374116820c869dc26d47052a1ffe8eebdffe8a9f8
|
||||
42da9b6cc27932f2bc8576b18d5274490007b61700075a25
|
||||
5b9b15df3a43d7c78f40345cc2883134ffe25b3bffe26a62
|
||||
b368e7f92ed0b631dd262c35d2418f2400034b120002fe07
|
||||
c829ce6aad13ddf6a7f0b9e441c63bcd000c0727000bd789
|
||||
4567d0e8ae382d60c01cc59642bbcf40fff26ae8fff27d7f
|
||||
65a671a01470a44f91f77d37425ef3dc001a4055001a17a1
|
||||
fddee7a9390c343b5f9829996552b965ffeaf5c5ffeada92
|
||||
70b87bfa6e52079fc4460ea763112b55ffead4b1ffead278
|
||||
b6277d9d8bef3aef164aedca3d03a5fffffacd43fffaa101
|
||||
df6c71731cac38f21355b73273b16654fffd9740fffda5df
|
||||
efbf6909cf6446d2ddd8ed95f1854949fff65671fff6682a
|
||||
5ada9db6ebb22ff3a3bfe61e5bf6de78fffe8789fffe9be1
|
||||
b3901ebafe80fd3510d6158f3258b75e0012318e001235e8
|
||||
1c9917b5b6c9ffa3f378d67d75b30b55000103dd0000c7fb
|
||||
2dc85ea9cee033ca2e24bd97b5866bbfffee80fcffee7d36
|
||||
d072437559782912a143afc24a3fa445fff10b2dfff13531
|
||||
4fe4a2cb672db8c8156fc84816528b37001c39a8001c4d99
|
||||
94f1e5f9f4e61dfe33da293a340848c80014315300142cfa
|
||||
87d653da7a20cfd8ef154c3a615e600b0010c79a00111d9b
|
||||
453de9207bf11328545f8b31cfdbb7c00011deab00120a1b
|
||||
c3dc309b89a8d82d4ec2eca7c35619e20003762c00036a54
|
||||
7b82544f145637d6f6f22d59764ccd48fff8144dfff81442
|
||||
3751cbaa579062248fac167b8114ec7bffea43abffea6ab6
|
||||
6e0aea5f38eae5544ccf251bc8db74eb000b3c51000b1eb6
|
||||
f636a368c55f1b1c9664b4b4e60a0862000344400002f89f
|
||||
d6edc920fdcd92e498e7eaa37cbdc569fff244cffff2272d
|
||||
f6dea61c2754dfedbf228b183384df02fffa913afffa6b65
|
||||
3ee407b217e95227e87414ed0f95cb3cffe9a5b7ffe9882d
|
||||
06a247226e2381e403832ddfb777efc7fff57f3afff57df8
|
||||
d00022fcaf35cb061c1e493caea79a46fffd76a8fffd791f
|
||||
5a2bc58f9a38625eb1caa1ac64c6e7fc00124ba500129c0c
|
||||
76d8414f5e8d714e7acb0275f3c86f8fffee877affee3ace
|
||||
8e2eaa422098bb450b2b051c41704fa4001b6fe7001b2817
|
||||
409e7e95229c8b95752a5892065ea82c0011a85900115f44
|
||||
8b9c7d11ccefa4d9fa929f2504dec294fff13d40fff192e8
|
||||
eb08039624717eba4e5ff34e0b211ceffff63550fff63965
|
||||
fa515245fcf591aaf05a8a20b06a5149001bea7b001c05be
|
||||
175fcd87e324395316682efedae9e0bcfffe91bffffed548
|
||||
030083af7d20ded073b50710c535bce7ffebed25ffec03de
|
||||
f1d6b346756249557e8713c2b1fdca0f00107ae100106aeb
|
||||
71280cdf1ccce2fb2c642450566557de000170f70001aec9
|
||||
4e82e302fcc656c8d1287dbe9ca8acd5000e8463000e54c7
|
||||
c632e830e0b489aa6e9ac4973d2c641a0007b89b0007dbad
|
||||
60f9cfe84bd046708942d466401bb5ce000bdeb9000bd671
|
||||
5f081111e9417406bd9546d5764dd250ffe9a639ffe9cc90
|
||||
8f13dbc7cd09f3d9313ff4e5d2465651001428500014444f
|
||||
1b2eba80265c8d98e1fed0b35dcce940ffe5fb3dffe65581
|
||||
5ac7442fc82ac66f098e399c6e3fb4fb001d151f001ced83
|
||||
cae6f36567cd8caa3812749e4fff9b2bffe5dc9bffe5b5ab
|
||||
c6f3ff6084c91c035e8e28164d4be2e9ffeda203ffedb262
|
||||
d686ca96df340791934db0010fa8ebeb0017bd670017b982
|
||||
7339786ae66a19855e2ba71c87709df9fff3ba3afff3c291
|
||||
49523c1d1c49208b47f36c5ff3998ccdfffc0b35fffc638f
|
||||
22dcffda462bd2258c0a97773a6275b6ffeee4e6ffeea46b
|
||||
76dfa247cdeb846a57e2c57c7c5d778800091ec0000894cd
|
||||
b2580eb1665e3728557c839097c05fc9000538560005acf3
|
||||
b7cc4ac52f93627b3c19614e0b791ed8ffec478cffec8452
|
||||
40a9e4cce211bbb58026aea827b45a9e0010bcc300109a14
|
||||
f363168c25a8d0d3160a5ea055ee58a7ffe39321ffe338e4
|
||||
26b926e992b876e8ed4278599a386577ffe7b894ffe7fbf5
|
||||
d6d50ac33ff99775f298a0dccbb1ee25ffe30d95ffe3017c
|
||||
c7d4bdc94a344bb7f763821e7f3005cfffffd9c3fffff035
|
||||
af5a8628a5c09fc32aa6e24a837a2a10fffd4210fffcf001
|
||||
ab8ac0f6f17fcf9a18a26a0d807a7913ffe33b55ffe339a5
|
||||
5ca5d10b891a765f0cb225bee87c8271fffabcaafffa6935
|
||||
9ba2b6ce1d9a7533f6c1c3caadebfc7e0002a13a0002f4b0
|
||||
5789153690237e2688942b805575a0e3fffd18f2fffd472c
|
||||
4b852a2192aa0a6aabdc6f82d9ee78de001b3c42001b0edb
|
||||
e9289e016228f6b48b421301a9d2df380005235f00051c00
|
||||
10b0aa90b58309a9d8abeed8087fb8a4fff706b2fff776d2
|
||||
59f6232e0b63a69475a67c36f8e4e63dfff3961afff3aed7
|
||||
3766b0e18dfe9e50fccbf8a6ca48b40b000cefb7000ce2c7
|
||||
3122f997dc8fd1ddd354b07d9e011acdfffb7e6afffb62b8
|
||||
9f84dd71736442842cda1771289e6518fff789abfff7b3ef
|
||||
38b83f0ed769743d5d74ca2dd99ac132001a9e14001ac07b
|
||||
982fe5a1e5de08a630f4d1dab69f1260fffee12dffff0064
|
||||
72295afa25e39589c6ab41c61515dd78001dede7001e2172
|
||||
025dd6549d6f49ccbcce8fb88485168cfffef630ffff0e0d
|
||||
71bb53d45ff8253790a82559ddbc9e5affec9981ffec8bf8
|
||||
6d91eb73ce5674efd1c4954b8ae96531001b89a9001b4211
|
||||
d6a42acca07fe81b149b6137bfd59b43ffea12fcffe9e4d3
|
||||
823785a842d0bc686730ddb2e3c884bb001d79ff001da6f3
|
||||
347e44dc56e3347615606f6bf4fd2a2e000ce2ed000d3f24
|
||||
e8bd3bca1328e51fe561b12428279eb0fff2facffff303b9
|
||||
6a91ba12459fbccd12fb00429065ea90fff7287dfff6c618
|
||||
906767fe48cebaa9214bb5c6355fe251fffc8320fffc83d2
|
||||
f325fa3235d3789333fcc63159f16fa8ffed7727ffed006c
|
||||
efb850605a347e2948f932fa0d859036ffe3b69fffe3deda
|
||||
83ed6a54bcfc9ea33ab06d4a9361dbfd000ce23d000d177a
|
||||
1d58e66bf7f44fadd4590490158d42a4001603f50015b7ab
|
||||
2698043ee6176a07a7133a54b4266bac000f9669000f668a
|
||||
d04a625ead2bedf952008d9e2e551fb9ffe28b43ffe2c6a6
|
||||
85b7edecd24b819ba9d349141f11ef34ffea49cbffeaa695
|
||||
a6019601595263cecc658effcf7ea82b0015ae4400157bb4
|
||||
670de80e82ac2689fc5076fe7b687f700000fd7300018068
|
||||
7761858719b008971ba24237979830ca000b708d000bf17b
|
||||
c88949769c319df934fbcd3a560b7c82000a5c83000a41da
|
||||
07d2082c17e5fced450abb3c44869517ffed7254ffed38d2
|
||||
ec1f82e2bc4ac91f2542825ff34a00b6ffe9008effe8c99b
|
||||
76e6453dcd0a84951f81050d9a04ad30001490730014a676
|
||||
86e413b844cf099da91fdf799e59ac16fff5047afff4b88f
|
||||
82c549a5cb06a36f62b3946fd9a6b0380019bae800194456
|
||||
5fbcb5cc39d6ee4d6a18bab1ee2fe9a6ffe7dc4dffe7e7db
|
||||
eec7983fefc2588889b714f504f0537e000a74db000a83d0
|
||||
ed32593452602f57747c5374115bff0f000576c5000617a4
|
||||
7dbe69d3a592966ba3be2c700642cec70009d99f0009d9a4
|
||||
93f2c7e49586cd774deab8c9e31a385dffe60c79ffe64e34
|
||||
481742921c2e831e785a3278925519a4ffe60e97ffe60333
|
||||
9b717e8827ddc3c340646b0a636e7b610015b0ce0015c8b0
|
||||
4a74cfa4572a35bfc270733b6794e72b00127524001278d3
|
||||
c20a6258901d05934a89250ca4498b750000d7ce000077e2
|
||||
ae0c9595b16a80f5bef56bfb10b6da96fff27f56fff298dc
|
||||
e1cd28658ddf399e5e58498802c6ded9ffff604dffff7215
|
||||
4d90cc91e659d22777c125acea09866d0017118b00169836
|
||||
a38f5226e5b4864c7d57b7a8c56754afffefd0b0ffeffaf7
|
||||
93249eb07fb94c7ca1719d502bdf347c0017c83e0017a3e7
|
||||
bf89e99ee41a5289900b72af1b35f6f1ffed859cffed60f6
|
||||
4610fecf337e89567b1f1e182801c33b00099b35000994e5
|
||||
808080808080808080808080808080800000000000020000
|
||||
807f807f807f807f807f807f807f807f00000000fffe0400
|
||||
808080808080808080808080808080807fffffff8001ffff
|
||||
807f807f807f807f807f807f807f807f7fffffff7ffe03ff
|
||||
808080808080808080808080808080808000000080020000
|
||||
807f807f807f807f807f807f807f807f800000007ffe0400
|
||||
808080808080808080808080808080804000000040020000
|
||||
807f807f807f807f807f807f807f807f400000003ffe0400
|
||||
80808080808080808080808080808080c0000000c0020000
|
||||
807f807f807f807f807f807f807f807fc0000000bffe0400
|
||||
@@ -1,81 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Independent Python oracle for rtl/mac_unit.v and rtl/mac8.v (aspect C.1 of
|
||||
the re-certification campaign, docs/validation/01-datapath.md).
|
||||
|
||||
Deliberately reimplements the arithmetic from first principles (two's
|
||||
complement wraparound, sign extension) -- NOT by reading the Verilog and
|
||||
transcribing it. Every function below is checked against Python's own
|
||||
built-in arbitrary-precision integers, which have no width and cannot
|
||||
share a truncation/sign-extension bug with the RTL.
|
||||
|
||||
Run standalone to regenerate the golden vectors used by
|
||||
sim/mac_unit_tb.v / sim/mac8_tree_tb.v:
|
||||
python3 tools/validation/mac_oracle.py
|
||||
"""
|
||||
|
||||
def to_signed(val: int, width: int) -> int:
|
||||
"""Interpret the low `width` bits of `val` as two's complement."""
|
||||
val &= (1 << width) - 1
|
||||
if val >= (1 << (width - 1)):
|
||||
val -= (1 << width)
|
||||
return val
|
||||
|
||||
def to_unsigned(val: int, width: int) -> int:
|
||||
return val & ((1 << width) - 1)
|
||||
|
||||
def mac_unit(x: int, w: int, acc_in: int, data_width: int = 8, acc_width: int = 32) -> int:
|
||||
"""Bit-exact model of rtl/mac_unit.v: acc_out = acc_in + sign_extend(x*w)."""
|
||||
assert -(1 << (data_width - 1)) <= x < (1 << (data_width - 1))
|
||||
assert -(1 << (data_width - 1)) <= w < (1 << (data_width - 1))
|
||||
product = x * w # Python int, exact, no width -- the whole point of an independent oracle
|
||||
prod_width = 2 * data_width
|
||||
assert -(1 << (prod_width - 1)) <= product < (1 << (prod_width - 1)), \
|
||||
"product overflowed PROD_WIDTH -- data_width assumption violated"
|
||||
raw = to_unsigned(acc_in, acc_width) + to_unsigned(product, prod_width if product >= 0 else prod_width)
|
||||
# acc_in + sign_extend(product) computed directly in signed arithmetic,
|
||||
# then wrapped to acc_width bits (matches Verilog's silent wraparound
|
||||
# on a fixed-width signed reg/wire -- confirmed intentional, not a
|
||||
# bug, because callers rely on it: see docs/validation/01-datapath.md).
|
||||
return to_signed(acc_in + product, acc_width)
|
||||
|
||||
def mac8_tree(products: list[int], acc_in: int, acc_width: int = 32) -> int:
|
||||
"""
|
||||
Bit-exact model of rtl/mac8.v's balanced binary adder tree +
|
||||
final accumulator add. `products` must have length PARALLEL (a power
|
||||
of two, matching the RTL's $clog2-based tree construction).
|
||||
"""
|
||||
n = len(products)
|
||||
assert n > 0 and (n & (n - 1)) == 0, "PARALLEL must be a power of two"
|
||||
level = list(products)
|
||||
while len(level) > 1:
|
||||
level = [to_signed(level[i] + level[i + 1], acc_width) for i in range(0, len(level), 2)]
|
||||
return to_signed(acc_in + level[0], acc_width)
|
||||
|
||||
def mac8_full(x_vals: list[int], w_vals: list[int], acc_in: int,
|
||||
data_width: int = 8, acc_width: int = 32) -> int:
|
||||
"""End-to-end oracle: PARALLEL independent products -> balanced tree -> + acc_in."""
|
||||
assert len(x_vals) == len(w_vals)
|
||||
products = [mac_unit(x, w, 0, data_width, acc_width) for x, w in zip(x_vals, w_vals)]
|
||||
return mac8_tree(products, acc_in, acc_width)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Self-check: a handful of hand-verifiable cases, printed for a human
|
||||
# to eyeball before trusting this file as an oracle for anything else.
|
||||
cases = [
|
||||
(5, 7, 0, 35),
|
||||
(-128, -128, 0, 16384), # the one INT8 x INT8 case that does NOT fit in INT16 magnitude terms symmetrically
|
||||
(127, 127, 0, 16129),
|
||||
(-128, 127, 0, -16256),
|
||||
(0, 0, 0, 0),
|
||||
(-1, -1, 0, 1),
|
||||
]
|
||||
ok = True
|
||||
for x, w, acc_in, expected in cases:
|
||||
got = mac_unit(x, w, acc_in)
|
||||
status = "OK" if got == expected else "MISMATCH"
|
||||
if got != expected:
|
||||
ok = False
|
||||
print(f"mac_unit(x={x}, w={w}, acc_in={acc_in}) = {got} (expected {expected}) {status}")
|
||||
print("ALL SELF-CHECKS PASSED" if ok else "SELF-CHECK FAILURE -- oracle itself is wrong, fix before using it")
|
||||
@@ -1,486 +0,0 @@
|
||||
bde50000000000000711
|
||||
4b0f0000000000000465
|
||||
fffe0000000000000002
|
||||
7ac300000000ffffe2ee
|
||||
840a00000000fffffb28
|
||||
3a730000000000001a0e
|
||||
08f200000000ffffff90
|
||||
0c9d00000000fffffb5c
|
||||
c4ad0000000000001374
|
||||
381d0000000000000658
|
||||
7b9b00000000ffffcf79
|
||||
e45100000000fffff724
|
||||
088e00000000fffffc70
|
||||
db0200000000ffffffb6
|
||||
73080000000000000398
|
||||
adbe0000000000001566
|
||||
45610000000000001a25
|
||||
863e00000000ffffe274
|
||||
995d00000000ffffda95
|
||||
dbc300000000000008d1
|
||||
5e4f0000000000001d02
|
||||
008e0000000000000000
|
||||
0dc200000000fffffcda
|
||||
b16a00000000ffffdf4a
|
||||
0d2d0000000000000249
|
||||
246d0000000000000f54
|
||||
9f2e00000000ffffee92
|
||||
dbee000000000000029a
|
||||
5d6000000000000022e0
|
||||
36e500000000fffffa4e
|
||||
13fc00000000ffffffb4
|
||||
4fbe00000000ffffeba2
|
||||
a5c300000000000015af
|
||||
14460000000000000578
|
||||
688e00000000ffffd1b0
|
||||
ecc60000000000000488
|
||||
c7d800000000000008e8
|
||||
c47200000000ffffe548
|
||||
629000000000ffffd520
|
||||
197d0000000000000c35
|
||||
36df00000000fffff90a
|
||||
25600000000000000de0
|
||||
aa6c00000000ffffdbb8
|
||||
d4a90000000000000ef4
|
||||
9a5600000000ffffddbc
|
||||
df890000000000000f57
|
||||
f5f80000000000000058
|
||||
ba4a00000000ffffebc4
|
||||
398400000000ffffe464
|
||||
c11600000000fffffa96
|
||||
f8cd0000000100000199
|
||||
38d700000001fffff709
|
||||
bf7c00000001ffffe085
|
||||
801100000001fffff781
|
||||
7dec00000001fffff63d
|
||||
923d00000001ffffe5cb
|
||||
32e700000001fffffb1f
|
||||
239600000001fffff183
|
||||
3d750000000100001be2
|
||||
86d80000000100001311
|
||||
374b000000010000101e
|
||||
2a540000000100000dc9
|
||||
43c600000001fffff0d3
|
||||
8eff0000000100000073
|
||||
bc0100000001ffffffbd
|
||||
479100000001ffffe138
|
||||
5a8900000001ffffd62b
|
||||
bea800000001000016b1
|
||||
32c400000001fffff449
|
||||
55b700000001ffffe7c4
|
||||
5f7b0000000100002da6
|
||||
d06800000001ffffec81
|
||||
764e00000001000023f5
|
||||
dd5600000001fffff43f
|
||||
42400000000100001081
|
||||
9f5000000001ffffe1b1
|
||||
41ca00000001fffff24b
|
||||
178800000001fffff539
|
||||
c9a800000001000012e9
|
||||
57c800000001ffffecf9
|
||||
6f3d0000000100001a74
|
||||
36aa00000001ffffeddd
|
||||
99e00000000100000ce1
|
||||
59220000000100000bd3
|
||||
50a600000001ffffe3e1
|
||||
990100000001ffffff9a
|
||||
d7ae0000000100000d23
|
||||
a84500000001ffffe849
|
||||
8fa7000000010000274a
|
||||
850a00000001fffffb33
|
||||
21750000000100000f16
|
||||
51b400000001ffffe7f5
|
||||
bd1800000001fffff9b9
|
||||
e8fc0000000100000061
|
||||
0726000000010000010b
|
||||
8d0e00000001fffff9b7
|
||||
ce6f00000001ffffea53
|
||||
f2f300000001000000b7
|
||||
123c0000000100000439
|
||||
244700000001000009fd
|
||||
49e8fffffffffffff927
|
||||
3e1affffffff0000064b
|
||||
90baffffffff00001e9f
|
||||
a68effffffff00002813
|
||||
0673ffffffff000002b1
|
||||
4607ffffffff000001e9
|
||||
cfdfffffffff00000650
|
||||
ea01ffffffffffffffe9
|
||||
675effffffff000025d1
|
||||
57effffffffffffffa38
|
||||
db48fffffffffffff597
|
||||
4dd0fffffffffffff18f
|
||||
a1e0ffffffff00000bdf
|
||||
9018fffffffffffff57f
|
||||
4ebfffffffffffffec31
|
||||
1a74ffffffff00000bc7
|
||||
4d90ffffffffffffde4f
|
||||
0cc5fffffffffffffd3b
|
||||
43bdffffffffffffee76
|
||||
c45affffffffffffeae7
|
||||
fa82ffffffff000002f3
|
||||
d323fffffffffffff9d8
|
||||
518affffffffffffdaa9
|
||||
cc02ffffffffffffff97
|
||||
a9e5ffffffff0000092c
|
||||
9c2affffffffffffef97
|
||||
00eeffffffffffffffff
|
||||
f9f2ffffffff00000061
|
||||
2665ffffffff00000efd
|
||||
2de2fffffffffffffab9
|
||||
e877fffffffffffff4d7
|
||||
3c86ffffffffffffe367
|
||||
96c0ffffffff00001a7f
|
||||
b7d3ffffffff00000cd4
|
||||
1a34ffffffff00000547
|
||||
1551ffffffff000006a4
|
||||
86e4ffffffff00000d57
|
||||
25edfffffffffffffd40
|
||||
286dffffffff00001107
|
||||
8172ffffffffffffc771
|
||||
8dc3ffffffff00001b66
|
||||
5614ffffffff000006b7
|
||||
9ac1ffffffff00001919
|
||||
8fc6ffffffff00001999
|
||||
6656ffffffff00002243
|
||||
fdd8ffffffff00000077
|
||||
8b8cffffffff00003503
|
||||
2b89ffffffffffffec02
|
||||
da53fffffffffffff3ad
|
||||
0761ffffffff000002a6
|
||||
bdd17fffffff80000c4c
|
||||
23b37fffffff7ffff578
|
||||
be087fffffff7ffffdef
|
||||
226a7fffffff80000e13
|
||||
a34e7fffffff7fffe3a9
|
||||
16a27fffffff7ffff7eb
|
||||
e8e57fffffff80000287
|
||||
a5187fffffff7ffff777
|
||||
dd067fffffff7fffff2d
|
||||
b6cc7fffffff80000f07
|
||||
010f7fffffff8000000e
|
||||
f0da7fffffff8000025f
|
||||
e18b7fffffff80000e2a
|
||||
f8067fffffff7fffffcf
|
||||
f9747fffffff7ffffcd3
|
||||
a02c7fffffff7fffef7f
|
||||
d1dd7fffffff8000066c
|
||||
1d707fffffff80000caf
|
||||
67e67fffffff7ffff589
|
||||
6e9c7fffffff7fffd507
|
||||
e8be7fffffff8000062f
|
||||
22f77fffffff7ffffecd
|
||||
24647fffffff80000e0f
|
||||
6d747fffffff80003163
|
||||
d9ec7fffffff8000030b
|
||||
e7757fffffff7ffff492
|
||||
a4107fffffff7ffffa3f
|
||||
d4877fffffff800014cb
|
||||
68fb7fffffff7ffffdf7
|
||||
454c7fffffff8000147b
|
||||
42ad7fffffff7fffea99
|
||||
13857fffffff7ffff6de
|
||||
ddd47fffffff80000603
|
||||
c8dd7fffffff800007a7
|
||||
572c7fffffff80000ef3
|
||||
e4f57fffffff80000133
|
||||
10867fffffff7ffff85f
|
||||
e07b7fffffff7ffff09f
|
||||
e0877fffffff80000f1f
|
||||
8d3e7fffffff7fffe425
|
||||
5a057fffffff800001c1
|
||||
58be7fffffff7fffe94f
|
||||
1b287fffffff80000437
|
||||
8bbe7fffffff80001e29
|
||||
00c67fffffff7fffffff
|
||||
95b07fffffff8000216f
|
||||
280e7fffffff8000022f
|
||||
51857fffffff7fffd914
|
||||
047c7fffffff800001ef
|
||||
0d3a7fffffff800002f1
|
||||
cf68800000007fffec18
|
||||
9e008000000080000000
|
||||
9850800000007fffdf80
|
||||
cd0f800000007ffffd03
|
||||
27e2800000007ffffb6e
|
||||
a5e28000000080000aaa
|
||||
022e800000008000005c
|
||||
24b2800000007ffff508
|
||||
1cdc800000007ffffc10
|
||||
0fcc800000007ffffcf4
|
||||
fb7b800000007ffffd99
|
||||
ad4d800000007fffe709
|
||||
ed9780000000800007cb
|
||||
f78b800000008000041d
|
||||
be908000000080001ce0
|
||||
12d9800000007ffffd42
|
||||
5fde800000007ffff362
|
||||
8274800000007fffc6e8
|
||||
3f368000000080000d4a
|
||||
d7d4800000008000070c
|
||||
211580000000800002b5
|
||||
b88c80000000800020a0
|
||||
06cb800000007ffffec2
|
||||
f99380000000800002fb
|
||||
1092800000007ffff920
|
||||
08248000000080000120
|
||||
bcd98000000080000a5c
|
||||
defe8000000080000044
|
||||
ce7a800000007fffe82c
|
||||
98fe80000000800000d0
|
||||
e65b800000007ffff6c2
|
||||
38d5800000007ffff698
|
||||
e8e280000000800002d0
|
||||
db958000000080000f77
|
||||
ab988000000080002288
|
||||
b1d48000000080000d94
|
||||
307a80000000800016e0
|
||||
d23e800000007ffff4dc
|
||||
0d3c800000008000030c
|
||||
17bb800000007ffff9cd
|
||||
8cb9800000008000202c
|
||||
486d8000000080001ea8
|
||||
0d7d8000000080000659
|
||||
28e4800000007ffffba0
|
||||
376e80000000800017a2
|
||||
6695800000007fffd55e
|
||||
165f800000008000082a
|
||||
e4d08000000080000540
|
||||
e9ca80000000800004da
|
||||
c9818000000080001b49
|
||||
ac04400000003ffffeb0
|
||||
fbc94000000040000113
|
||||
f262400000003ffffaa4
|
||||
fc14400000003fffffb0
|
||||
7bc7400000003fffe49d
|
||||
7281400000003fffc772
|
||||
3a4b40000000400010fe
|
||||
93964000000040002d22
|
||||
1e9a400000003ffff40c
|
||||
80984000000040003400
|
||||
704f4000000040002290
|
||||
146640000000400007f8
|
||||
3b7a4000000040001c1e
|
||||
767b40000000400038b2
|
||||
f564400000003ffffbb4
|
||||
8251400000003fffd822
|
||||
2a604000000040000fc0
|
||||
22be400000003ffff73c
|
||||
bae740000000400006d6
|
||||
3ae3400000003ffff96e
|
||||
562e4000000040000f74
|
||||
625640000000400020ec
|
||||
43774000000040001f25
|
||||
7e3040000000400017a0
|
||||
8c39400000003fffe62c
|
||||
7a414000000040001efa
|
||||
e4ad4000000040000914
|
||||
5285400000003fffd89a
|
||||
ed8b40000000400008af
|
||||
67a8400000003fffdc98
|
||||
ebe64000000040000222
|
||||
ad3a400000003fffed32
|
||||
5f86400000003fffd2ba
|
||||
a076400000003fffd3c0
|
||||
55534000000040001b8f
|
||||
17e4400000003ffffd7c
|
||||
4895400000003fffe1e8
|
||||
b6cb4000000040000f52
|
||||
ac71400000003fffdaec
|
||||
5ceb400000003ffff874
|
||||
636f4000000040002aed
|
||||
e1ab4000000040000a4b
|
||||
a0c74000000040001560
|
||||
a7834000000040002b75
|
||||
1a87400000003ffff3b6
|
||||
4e73400000004000230a
|
||||
11f2400000003fffff12
|
||||
29b1400000003ffff359
|
||||
b847400000003fffec08
|
||||
dbd740000000400005ed
|
||||
1ce5c0000000bffffd0c
|
||||
343bc0000000c0000bfc
|
||||
d277c0000000bfffea9e
|
||||
2053c0000000c0000a60
|
||||
ff8ac0000000c0000076
|
||||
2be7c0000000bffffbcd
|
||||
b614c0000000bffffa38
|
||||
ad1cc0000000bffff6ec
|
||||
b8cbc0000000c0000ee8
|
||||
c1e9c0000000c00005a9
|
||||
f820c0000000bfffff00
|
||||
5f77c0000000c0002c29
|
||||
ca0ec0000000bffffd0c
|
||||
7291c0000000bfffce92
|
||||
f52cc0000000bffffe1c
|
||||
ea27c0000000bffffca6
|
||||
ecc9c0000000c000044c
|
||||
6b41c0000000c0001b2b
|
||||
0372c0000000c0000156
|
||||
f279c0000000bffff962
|
||||
e68fc0000000c0000b7a
|
||||
ebb5c0000000c0000627
|
||||
02d0c0000000bfffffa0
|
||||
af61c0000000bfffe14f
|
||||
2576c0000000c000110e
|
||||
e079c0000000bffff0e0
|
||||
1867c0000000c00009a8
|
||||
7dcfc0000000bfffe813
|
||||
ff68c0000000bfffff98
|
||||
b8bfc0000000c0001248
|
||||
da6ac0000000bffff044
|
||||
3958c0000000c0001398
|
||||
f1d1c0000000c00002c1
|
||||
44c5c0000000bffff054
|
||||
7d9ac0000000bfffce32
|
||||
5abcc0000000bfffe818
|
||||
a1efc0000000c000064f
|
||||
53e2c0000000bffff646
|
||||
85c1c0000000c0001e45
|
||||
15a4c0000000bffff874
|
||||
fb70c0000000bffffdd0
|
||||
25bfc0000000bffff69b
|
||||
7ad6c0000000bfffebfc
|
||||
c95ec0000000bfffebce
|
||||
3e54c0000000c0001458
|
||||
9bbbc0000000c0001b39
|
||||
535ac0000000c0001d2e
|
||||
adedc0000000c0000629
|
||||
bd53c0000000bfffea47
|
||||
8c71c0000000bfffcccc
|
||||
9d5a00bc614e00bc3e80
|
||||
4ea800bc614e00bc467e
|
||||
258a00bc614e00bc5040
|
||||
146f00bc614e00bc69fa
|
||||
d3a300bc614e00bc71a7
|
||||
e80c00bc614e00bc602e
|
||||
ee5400bc614e00bc5b66
|
||||
dc1b00bc614e00bc5d82
|
||||
50dd00bc614e00bc565e
|
||||
2e7e00bc614e00bc77f2
|
||||
2f7f00bc614e00bc789f
|
||||
d37000bc614e00bc4d9e
|
||||
bbd800bc614e00bc6c16
|
||||
83a000bc614e00bc902e
|
||||
0f2400bc614e00bc636a
|
||||
e85f00bc614e00bc5866
|
||||
f75600bc614e00bc5e48
|
||||
ccb200bc614e00bc7126
|
||||
6c1100bc614e00bc687a
|
||||
d8b500bc614e00bc6d06
|
||||
e8f300bc614e00bc6286
|
||||
c8f400bc614e00bc63ee
|
||||
c9c100bc614e00bc6ed7
|
||||
ddcc00bc614e00bc686a
|
||||
05fe00bc614e00bc6144
|
||||
ee0600bc614e00bc60e2
|
||||
5dc700bc614e00bc4c99
|
||||
f40200bc614e00bc6136
|
||||
ddfe00bc614e00bc6194
|
||||
5f9000bc614e00bc37be
|
||||
e5ab00bc614e00bc6a45
|
||||
c84700bc614e00bc51c6
|
||||
395a00bc614e00bc7558
|
||||
4b1e00bc614e00bc6a18
|
||||
29b900bc614e00bc55ef
|
||||
00d300bc614e00bc614e
|
||||
33b100bc614e00bc5191
|
||||
87ea00bc614e00bc6bb4
|
||||
723700bc614e00bc79cc
|
||||
195300bc614e00bc6969
|
||||
a63600bc614e00bc4e52
|
||||
37ab00bc614e00bc4f0b
|
||||
c0ae00bc614e00bc75ce
|
||||
ff5800bc614e00bc60f6
|
||||
5de100bc614e00bc560b
|
||||
9dbe00bc614e00bc7ad4
|
||||
06f000bc614e00bc60ee
|
||||
08a900bc614e00bc5e96
|
||||
577a00bc614e00bc8ac4
|
||||
38e800bc614e00bc5c0e
|
||||
1bd5ff439eb2ff439a29
|
||||
7b0cff439eb2ff43a476
|
||||
f05bff439eb2ff439902
|
||||
766fff439eb2ff43d1dc
|
||||
5f0aff439eb2ff43a268
|
||||
c577ff439eb2ff438345
|
||||
a39cff439eb2ff43c306
|
||||
5afeff439eb2ff439dfe
|
||||
e5b3ff439eb2ff43a6d1
|
||||
2d1fff439eb2ff43a425
|
||||
79bbff439eb2ff437e15
|
||||
b49dff439eb2ff43bc16
|
||||
c94dff439eb2ff438e27
|
||||
a2f6ff439eb2ff43a25e
|
||||
2783ff439eb2ff438ba7
|
||||
97fbff439eb2ff43a0bf
|
||||
c7c5ff439eb2ff43abd5
|
||||
53e9ff439eb2ff43973d
|
||||
a54cff439eb2ff4383ae
|
||||
e336ff439eb2ff439894
|
||||
6e31ff439eb2ff43b3c0
|
||||
c667ff439eb2ff43875c
|
||||
0dafff439eb2ff439a95
|
||||
3487ff439eb2ff43861e
|
||||
eecdff439eb2ff43a248
|
||||
5232ff439eb2ff43aeb6
|
||||
4069ff439eb2ff43b8f2
|
||||
073fff439eb2ff43a06b
|
||||
79cbff439eb2ff4385a5
|
||||
e659ff439eb2ff4395a8
|
||||
7cabff439eb2ff437586
|
||||
6a12ff439eb2ff43a626
|
||||
5cadff439eb2ff4380de
|
||||
cf0eff439eb2ff439c04
|
||||
19ecff439eb2ff439cbe
|
||||
1563ff439eb2ff43a6d1
|
||||
941fff439eb2ff43919e
|
||||
106eff439eb2ff43a592
|
||||
bf4cff439eb2ff438b66
|
||||
f4f6ff439eb2ff439f2a
|
||||
e5bcff439eb2ff43a5de
|
||||
9bdfff439eb2ff43abb7
|
||||
f4b3ff439eb2ff43a24e
|
||||
596aff439eb2ff43c38c
|
||||
6bacff439eb2ff437b96
|
||||
a2bbff439eb2ff43b808
|
||||
4677ff439eb2ff43bf3c
|
||||
9ab8ff439eb2ff43bb62
|
||||
5f0eff439eb2ff43a3e4
|
||||
4c11ff439eb2ff43a3be
|
||||
80800000000000004000
|
||||
80800000000100004001
|
||||
8080ffffffff00003fff
|
||||
80807fffffff80003fff
|
||||
80808000000080004000
|
||||
80804000000040004000
|
||||
8080c0000000c0004000
|
||||
808000bc614e00bca14e
|
||||
8080ff439eb2ff43deb2
|
||||
7f7f0000000000003f01
|
||||
7f7f0000000100003f02
|
||||
7f7fffffffff00003f00
|
||||
7f7f7fffffff80003f00
|
||||
7f7f8000000080003f01
|
||||
7f7f4000000040003f01
|
||||
7f7fc0000000c0003f01
|
||||
7f7f00bc614e00bca04f
|
||||
7f7fff439eb2ff43ddb3
|
||||
807f00000000ffffc080
|
||||
807f00000001ffffc081
|
||||
807fffffffffffffc07f
|
||||
807f7fffffff7fffc07f
|
||||
807f800000007fffc080
|
||||
807f400000003fffc080
|
||||
807fc0000000bfffc080
|
||||
807f00bc614e00bc21ce
|
||||
807fff439eb2ff435f32
|
||||
7f8000000000ffffc080
|
||||
7f8000000001ffffc081
|
||||
7f80ffffffffffffc07f
|
||||
7f807fffffff7fffc07f
|
||||
7f80800000007fffc080
|
||||
7f80400000003fffc080
|
||||
7f80c0000000bfffc080
|
||||
7f8000bc614e00bc21ce
|
||||
7f80ff439eb2ff435f32
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user