Repository: UC-Davis-molecular-computing/scadnano-python-package (language: python)

Issue:
automatically set Helix rolls based on crossover locations ("relax" the rolls)
Unlike "set helix coordinates based on crossovers", this would not adjust helix positions, only their rolls.

Keep each helix in the same position, but adjust the roll to minimize "something" about the strain. One way to do this is to calculate how far is each crossover from being perfect, e.g., if a crossover goes from helix i to j, but instead of the backbone angle pointing straight at j, it is 20 degrees off, then the "error" is 20 degrees. We could minimize the sum of squared errors for each crossover, for instance. This should be a straightforward linear algebra calculation to compute this roll for each helix.

See also https://github.com/UC-Davis-molecular-computing/scadnano/issues/843
export newer Excel file format
Currently scadnano uses a library [xlwt](https://pypi.org/project/xlwt/) specifically for exporting to older Excel files ending in `.xls`, which once was all IDT's website could read for uploading plates described by Excel files.

Now IDT can read the newer format, meaning we can use a newer and easier-to-use package, for instance [openpyxl](https://pypi.org/project/openpyxl/): https://www.python-excel.org/. 


Discussion / hints:
After some discussions, I think the correct thing to do here is the following:

We can model the various crossover angles as unit vectors. If all of them are on one side of a line (e.g., all with a positive x-coordinate), then take their average, interpret it as an angle, and subtract it from all others.

If the n vectors do not lie on one side of a line, there's a more complex algorithm that involves measuring an average for each of n choices... need to think about this more.
Suppose you have crossovers at angles $\{\theta_i\}$ and let $x$ be the angle you're going to adjust the helix's roll by. The goal is to find x that minimizes the sum of squared errors,

$$f(x) = \sum_{i} (x - \theta_i)^2$$

where $(x - \theta_i)$ is measured to always be at most 180 degrees.

$f(x)$ is differentiable everywhere except at points that are directly opposite a crossover - that is, points that look like $\theta_i + 180\degree$. if you restrict the domain of f(x) to remove these points, you get a set of intervals on which it's differentiable, so you can minimize $f(x)$ on each of these intervals separately by setting $f'(x) = 0$ and solving, then choose the interval giving the smallest local minimum (i think these intervals will always have a unique local minimum but maybe not).

I *believe* (though it should be verified) that if you do the math,  finding the local minimum on one of these intervals is equivalent to the following process:

1) Cut the circle at the point opposite one of the $\theta_i$
2) Treat the cut circle as an interval of real numbers, and simply take the average of all the points on the interval. 
I wanted to justify a bit why minimizing the sum of squared errors is the right thing to do to minimize crossover strain. Two arguments seem to arrive at the same conclusion, which makes me more confident in it.

In both cases, we model the crossovers connecting the current helix H1 another helix H2 as a [torsion (rotional) spring](https://en.wikipedia.org/wiki/Torsion_spring). The zero angle is defined to be the angle where H2 is relative to H1. (In reality there are crossovers to more than one other helix, which are at different angles; to account for this define their "0" angle to be the angle at which the other helix is). We can set the whole helix at some angle; this in turn strains each of the springs by an amount proportional to their angle after the twisting. The *displacement* $d_c$ of crossover $c$ is defined to be this angle (more precisely it is a nonnegative number between 0 and 180, so unlike a linear spring or conventional torsion spring, as you twist it past 180, the displacement then *lowers* back towards 0).

1. **Minimum Energy argument**: The energy stored in a spring with displacement $d_c$ is proportional to $d_c^2$. So the total energy is minimized by minimizing $\sum_c d_c^2$.

2. **Balanced Forces argument**: The helix will want to twist in the direction of net angular forces imparted by the various crossovers. So it will stop twisting when this net angular force is 0. *TODO: finish this argument.*
Hi Dr. Doty and Josh, I had to do some angle manipulation in order to split the circle, get the correct resulting angles, and use the shortest distances across the circle. Im also making the assumption that if θ is in A, then the point directly opposite θ is not in A (θ-180). Here is the pseudocode for the algorithm described in Josh's, as I understand it:

```
// A is an array containing angles, there are n angles
// the angle with the minimum squared distance is minX, the minimum squared distance itself is minSquaredDist


minX = inf 
minSquaredDist = inf
for i from 1...n
	converted[1..n] = array of size n; 
	for j from 1...n
		newAngle = A[j]-A[i]
		if newAngle < 0 // normalizing the angle to [0, 360)
			newAngle+=360
		if newAngle > 180 // left side of the number line --> we adjust the distance and make it negative
			newAngle-=360
		converted[j] = newAngle
	X = 0
	squaredDist = 0
	for j from 1...n // finding the average angle for the current domain
		X+=converted[j]
	X/=n // X is now the average angle (on the orientation of the number line)
	X+=A[i] // X is now the average angle on the standard orientation
	if X < 0 // normalizing the angle to [0, 360)
		X+=360
	if X >= 360 
		X-=360
	for j from 1...n // finding the squared distance
		dist1 = X-A[j]
		if dist1 < 0 // normalizing to [0, 360)
			dist1+=360
		dist2 = A[j]-X
		if dist2 < 0
			dist2+=360
		squaredDist+=min(dist1, dist2)*min(dist1, dist2) 
	if squaredDist < minSquaredDist
		minSquaredDist = squaredDist
		minX = X
```

I'd be happy to explain in detail how it works. Quite a bit of it is just adjusting angle values (+=360) to make the computations accurate, which could make this confusing. Given some tests I could write it in c++ and test this out. Also note that the correctness of this approach also depends on if Josh's algorithm is correct :P.


Fix patch:
diff --git a/.github/workflows/docs-check.yml b/.github/workflows/docs-check.yml
index bb6f08d1..c865b081 100644
--- a/.github/workflows/docs-check.yml
+++ b/.github/workflows/docs-check.yml
@@ -1,21 +1,21 @@
-name: "Docs Check"
-on: pull_request
-
-jobs:
-  docs:
-    runs-on: ubuntu-latest
-    steps:
-    - uses: actions/checkout@v2.3.4
-    - name: Set up Python
-      uses: actions/setup-python@v2
-      with:
-          python-version: '3.x'
-    - name: Install Sphinx
-      run: |
-        python -m pip install --upgrade pip
-        pip install sphinx sphinx_rtd_theme
-    - name: Move to docs folder and build
-      run: |
-        cd doc
-        pwd
-        sphinx-build -T -E -W -b html . _build
+name: "Docs Check"
+on: pull_request
+
+jobs:
+  docs:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2.3.4
+      - name: Set up Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: '3.x'
+      - name: Install Sphinx
+        run: |
+          python -m pip install --upgrade pip
+          pip install sphinx sphinx_rtd_theme openpyxl
+      - name: Move to docs folder and build
+        run: |
+          cd doc
+          pwd
+          sphinx-build -T -E -W -b html . _build
diff --git a/README.md b/README.md
index 58ae2708..5c0c63e7 100644
--- a/README.md
+++ b/README.md
@@ -1,313 +1,315 @@
-# scadnano Python package
-
-![Python package](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/workflows/Python%20package/badge.svg)
-[![Documentation Status](https://readthedocs.org/projects/scadnano-python-package/badge/?version=latest)](https://scadnano-python-package.readthedocs.io/en/latest/?badge=latest)
-
-[scadnano](http://scadnano.org) ("scriptable-cadnano") is a program for designing synthetic DNA structures such as DNA origami. 
-The scadnano Python package 
-([source code repository here](https://github.com/UC-Davis-molecular-computing/scadnano-python-package)) 
-is a library for programmatically creating and editing these nanostructures.
-The scadnano project is developed and maintained by the UC Davis Molecular Computing group.
-Note that [cadnano](https://cadnano.org) is a separate project, developed and maintained by the [Douglas lab](https://bionano.ucsf.edu/) at UCSF.
-
-If you find scadnano useful in a scientific project, please cite its associated paper:
-
-> scadnano: A browser-based, scriptable tool for designing DNA nanostructures.  
-  David Doty, Benjamin L Lee, and Tristan Stérin.  
-  DNA 2020: *Proceedings of the 26th International Conference on DNA Computing and Molecular Programming*  
-  [ [paper](https://doi.org/10.4230/LIPIcs.DNA.2020.9) | [BibTeX](https://web.cs.ucdavis.edu/~doty/papers/scadnano.bib) ]
-
-*Note:* If you are reading this on the PyPI website, some of the links below won't work. Many are relative links intended to be read on the [GitHub README page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package#readme).
-
-
-## Table of contents
-
-* [Overview](#overview)
-* [Reporting issues](#reporting-issues)
-* [Installation](#installation)
-* [Example](#example)
-* [Abbreviated syntax with chained methods](#abbreviated-syntax-with-chained-methods)
-* [StrandBuilder object for iteratively building up strands with many domains](#strandbuilder-object-for-iteratively-building-up-strands-with-many-domains)
-* [Tutorial](#tutorial)
-* [API documentation](#api-documentation)
-* [Other examples](#other-examples)
-* [Contributing](#contributing)
-
-## Overview
-
-This package is used to write Python scripts outputting `.sc` files readable by [scadnano](https://scadnano.org), a web application useful for displaying and manually editing these structures. The purpose of this module is to help automate some of the task of creating DNA designs, as well as making large-scale changes to them that are easier to describe programmatically than to do by hand in the scadnano web interface.
-
-We will try to announce breaking changes (and possibly new features) under the [GitHub releases page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/releases). The version numbers in this Python library repo and the [web interface repo](https://github.com/UC-Davis-molecular-computing/scadnano/releases) won't always advance at the same time, and sometimes a feature is supported in one before the other.
-
-Following [semantic versioning](https://semver.org/), version numbers are major.minor.patch, i.e., version 0.9.2 has minor version number 9. Prior to version 1.0.0, when a breaking change is made, this will increment the minor version (for example, going from 0.9.4 to 0.10.0). After version 1.0.0, breaking changes will increment the major version.
-
-
-
-
-
-## Reporting issues
-
-Please report issues in the web interface at the [scadnano web interface GitHub repository](https://github.com/UC-Davis-molecular-computing/scadnano/issues), and report issues in the Python scripting library at the [scadnano Python package GitHub repository](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/issues).
-
-
-
-
-
-
-## Installation
-
-Short version: type this at the command line:
-
-```console
-pip install scadnano
-```
-
-Read below for troubleshooting suggestions if that didn't work.
-
-### Getting Python
-The scadnano Python package requires Python version 3.7 or later (with a workaround available for version 3.6, but not for any lower version). 
-
-To check your current version of Python, open a command line and type
-
-```
-python --version
-```
-
-If it is version 2.7 or below, type
-
-```
-python3 --version
-```
-
-If that fails, or reports Python version 3.5 or below, you will have to install a later version of Python (recommended at least 3.7). Follow [this link](https://www.python.org/downloads/) to install Python. You may also use an alternative Python distribution, such as [Anaconda](https://www.anaconda.com/products/individual#Downloads).
-
-If you are using Python 3.6 and do not wish to upgrade, you can install a package providing the required features: the [dataclasses backport](https://pypi.org/project/dataclasses/); see `pip` instructions below to see how to install it.
-Python 3.7 provides the
-[dataclasses module](https://docs.python.org/3/library/dataclasses.html) automatically.
-
-
-
-### Installing the scadnano Python package
-
-Once Python is installed (and the dataclasses backport if you have Python version 3.6), there are two ways you can install the scadnano Python package:
-
-1. pip (recommended)
-
-    Use [pip](https://pypi.org/project/pip/) to install the package by executing the following at the command line:
-    ```console
-    pip install scadnano
-    ```
-
-    If it worked, you should be able to open a Python interpreter and import the scadnano module:
-
-    ```console
-    Python 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
-    Type "help", "copyright", "credits" or "license" for more information.
-    >>> import scadnano as sc
-    >>> print(sc.Domain(helix=1, forward=True, start=0, end=8))
-    Domain(, helix=1, forward=True, start=0, end=8)
-    >>>
-    ```
-
-    ### Troubleshooting
-    If the above does not work for you, here are some things to try.
-
-    If your Python installation does not already have pip installed, you may have to install it. 
-    Executing [this Python script](https://bootstrap.pypa.io/get-pip.py) should work; 
-    see also 
-    https://docs.python.org/3/installing/index.html 
-    or 
-    https://www.liquidweb.com/kb/install-pip-windows/.
-
-    Once pip is installed, or if you believe it is already installed, check your version of `pip` by typing 
-    ```
-    pip --version
-    ```
-    It should say something like 
-    ```
-    pip 19.3.1 from ...lib\site-packages\pip (python 3.8)
-    ```
-    If the version of Python at the end is Python 3.7 or higher, you are good. If it is version 2.7 or lower, type
-    ```
-    pip3 --version
-    ```
-    If that works and shows Python 3.7 or higher, you are good, but you should type `pip3` in the subsequent instructions instead of `pip`.
-    
-    If it shows Python 3.6, install the [dataclasses backport module](https://pypi.org/project/dataclasses/) via
-    ```
-    pip install dataclasses
-    ```
-    If it shows Python 3.5 or lower, then you will need to upgrade your Python version (recommended Python 3.7 or higher).
-
-    
-2. download
-
-    As a simple alternative (in case you run into trouble using pip), you can download and place the following files in your [PYTHONPATH](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH) (e.g., in the same directory as the scripts you are running). **Note:** If you are reading this on the PyPI website or anywhere other than GitHub, the links below won't work. They are relative links intended to be read on the [GitHub README page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package#readme).
-
-    * *required*: [scadnano.py](scadnano/scadnano.py) 
-    * *optional*: [modifications.py](scadnano/modifications.py); This contains some common DNA modifications such as biotin and Cy3. 
-    * *optional*: [origami_rectangle.py](scadnano/origami_rectangle.py); This can help create origami rectangles, but it is not necessary to use scadnano.
-    
-    To download them, right-click on "Raw" near the top and select (in Chrome or Firefox) "Save link as...":
-    ![](images/download_raw_screenshot.png)
-    
-    The scadnano package uses the Python package [xlwt](https://pypi.org/project/xlwt/) to write Excel files, so xlwt must be installed in order to call the method [`Design.write_idt_plate_excel_file()`](https://scadnano-python-package.readthedocs.io/#scadnano.Design.write_idt_plate_excel_file) to export an Excel file with DNA sequences. To install xlwt, type `pip install xlwt` at the command line. (If you instead use pip to install the scadnano package, xlwt will be automatically installed.)
-
-
-
-
-
-
-
-## Example
-
-Consider the following design:
-
-![](https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano/master/doc-images/screenshot-initial.png)
-
-The following Python script produces this design.
-
-```python
-import scadnano as sc
-import modifications as mod
-
-
-def create_design() -> sc.Design:
-    # helices
-    helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)]
-
-    # left staple
-    stap_left_domain1 = sc.Domain(helix=1, forward=True, start=8, end=24)
-    stap_left_domain0 = sc.Domain(helix=0, forward=False, start=8, end=24)
-    stap_left = sc.Strand(domains=[stap_left_domain1, stap_left_domain0])
-
-    # right staple
-    stap_right_domain0 = sc.Domain(helix=0, forward=False, start=24, end=40)
-    stap_right_domain1 = sc.Domain(helix=1, forward=True, start=24, end=40)
-    stap_right = sc.Strand(domains=[stap_right_domain0, stap_right_domain1])
-    stap_right.set_modification_5p(mod.biotin_5p)
-
-    # scaffold
-    scaf_domain1_left = sc.Domain(helix=1, forward=False, start=8, end=24)
-    scaf_domain0 = sc.Domain(helix=0, forward=True, start=8, end=40)
-    loopout = sc.Loopout(length=3)
-    scaf_domain1_right = sc.Domain(helix=1, forward=False, start=24, end=40)
-    scaf = sc.Strand(domains=[scaf_domain1_left, scaf_domain0, loopout, scaf_domain1_right], is_scaffold=True)
-
-    # whole design
-    design = sc.Design(helices=helices, strands=[scaf, stap_left, stap_right], grid=sc.square)
-
-    # deletions and insertions added to design are added to both strands on a helix
-    design.add_deletion(helix=1, offset=20)
-    design.add_insertion(helix=0, offset=14, length=1)
-    design.add_insertion(helix=0, offset=26, length=2)
-
-    # also assigns complement to strands other than scaf bound to it
-    design.assign_dna(scaf, 'AACGT' * 18)
-
-    return design
-
-
-if __name__ == '__main__':
-    design = create_design()
-    design.write_scadnano_file(directory='output_designs')
-```
-
-Running the code above produces a `.sc` file that, if loaded into scadnano, should appear as in the screenshot above. The [web interface README](https://github.com/UC-Davis-molecular-computing/scadnano/blob/master/README.md#terminology) explains many of the terms used in the code (domain, helix, loopout, insertion, etc.).
-
-
-## Abbreviated syntax with chained methods
-Instead of explicitly creating variables and objects representing each domain in each strand, there is a shorter syntax using chained method calls. Instead of the above, create only the helices first, then create the Design. Then strands can be added using a shorter syntax, to describe how to draw the strand starting at the 5' end and moving to the 3' end. The following is a modified version of the above `create_design` function using these chained methods:
-
-```python
-def create_design() -> sc.Design:
-    # helices
-    helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)]
-
-    # whole design
-    design = sc.Design(helices=helices, grid=sc.square)
-
-    # for absolute offsets, call method "to"
-    # left staple
-    design.draw_strand(1, 8).to(24).cross(0).to(8)
-
-    # for relative offsets, call method "move"
-    # right staple
-    design.draw_strand(0, 40).move(-16).cross(1).move(16).with_modification_5p(mod.biotin_5p)
-
-    # scaffold
-    design.draw_strand(1, 24).move(-16).cross(0).move(32).loopout(1, 3).move(-16).as_scaffold()
-
-    # deletions and insertions added to design are added to both strands on a helix
-    design.add_deletion(helix=1, offset=20)
-    design.add_insertion(helix=0, offset=14, length=1)
-    design.add_insertion(helix=0, offset=26, length=2)
-
-    # also assigns complement to strands other than scaf bound to it
-    design.assign_dna(design.scaffold, 'AACGT' * 18)
-
-    return design
-```
-
-Documentation is available in the [API docs](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.draw_strand).
-
-
-## StrandBuilder object for iteratively building up strands with many domains
-
-The method [`Design.draw_strand`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.draw_strand), as well as all those that follow it in a chained method call (e.g., `move`, `cross`, etc.) all return an instance of the class [`StrandBuilder`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.StrandBuilder).
-Above, that `StrandBuilder` instance is anonymous, i.e., never assigned to a variable. 
-Some long strands may be easier to specify with loops, for example an M13 scaffold strand for an origami. 
-If so, then to use the above methods, assign the `StrandBuilder` object to a variable, and call the relevant methods on that object to build up the strand in each iteration of the loop. 
-For example, the following modification of the above `create_design` function creates a linear scaffold strand that zig-zags back and forth across 32 helices:
-
-```python
-def create_design() -> sc.Design:
-    num_helices = 32
-    helices = [sc.Helix(max_offset=200) for _ in range(num_helices)]
-    design = sc.Design(helices=helices, grid=sc.square)
-    strand_builder = design.draw_strand(0, 0)
-    for helix in range(num_helices):
-        # move forward if on an even helix, otherwise move in reverse
-        move_distance = 200 if helix % 2 == 0 else -200
-        strand_builder.move(move_distance)
-        if helix < 31: # crossover to next helix, unless it's the last helix
-            strand_builder.cross(helix + 1)
-    strand_builder.as_scaffold()
-    return design
-```
-
-
-
-
-
-
-## API Documentation
-
-Online documentation of the package API (which classes, methods, functions, and constants are provided by the package) is located here:
-https://scadnano-python-package.readthedocs.io
-
-
-
-
-
-## Tutorial
-
-A [tutorial](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/blob/master/tutorial/tutorial.md) shows how to create a "standard" 24-helix DNA origami rectangle using the scadnano Python package.
-
-
-
-
-
-## Other examples
-
-*Note:* If you are reading this on the PyPI website, the links below won't work. They are relative links intended to be read on the [GitHub README page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package#readme).
-
-Several example scripts are located in the 
-[examples/](examples) subfolder. 
-Their output is contained in the 
-[examples/output_designs/](examples/output_designs) subfolder.
-
-
-
-## Contributing
+# scadnano Python package
+
+![Python package](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/workflows/Python%20package/badge.svg)
+[![Documentation Status](https://readthedocs.org/projects/scadnano-python-package/badge/?version=latest)](https://scadnano-python-package.readthedocs.io/en/latest/?badge=latest)
+
+[scadnano](http://scadnano.org) ("scriptable-cadnano") is a program for designing synthetic DNA structures such as DNA origami. 
+The scadnano Python package 
+([source code repository here](https://github.com/UC-Davis-molecular-computing/scadnano-python-package)) 
+is a library for programmatically creating and editing these nanostructures.
+The scadnano project is developed and maintained by the UC Davis Molecular Computing group.
+Note that [cadnano](https://cadnano.org) is a separate project, developed and maintained by the [Douglas lab](https://bionano.ucsf.edu/) at UCSF.
+
+If you find scadnano useful in a scientific project, please cite its associated paper:
+
+> scadnano: A browser-based, scriptable tool for designing DNA nanostructures.  
+  David Doty, Benjamin L Lee, and Tristan Stérin.  
+  DNA 2020: *Proceedings of the 26th International Conference on DNA Computing and Molecular Programming*  
+  [ [paper](https://doi.org/10.4230/LIPIcs.DNA.2020.9) | [BibTeX](https://web.cs.ucdavis.edu/~doty/papers/scadnano.bib) ]
+
+*Note:* If you are reading this on the PyPI website, some of the links below won't work. Many are relative links intended to be read on the [GitHub README page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package#readme).
+
+
+## Table of contents
+
+* [Overview](#overview)
+* [Reporting issues](#reporting-issues)
+* [Installation](#installation)
+* [Example](#example)
+* [Abbreviated syntax with chained methods](#abbreviated-syntax-with-chained-methods)
+* [StrandBuilder object for iteratively building up strands with many domains](#strandbuilder-object-for-iteratively-building-up-strands-with-many-domains)
+* [Tutorial](#tutorial)
+* [API documentation](#api-documentation)
+* [Other examples](#other-examples)
+* [Contributing](#contributing)
+
+## Overview
+
+This package is used to write Python scripts outputting `.sc` files readable by [scadnano](https://scadnano.org), a web application useful for displaying and manually editing these structures. The purpose of this module is to help automate some of the task of creating DNA designs, as well as making large-scale changes to them that are easier to describe programmatically than to do by hand in the scadnano web interface.
+
+We will try to announce breaking changes (and possibly new features) under the [GitHub releases page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/releases). The version numbers in this Python library repo and the [web interface repo](https://github.com/UC-Davis-molecular-computing/scadnano/releases) won't always advance at the same time, and sometimes a feature is supported in one before the other.
+
+Following [semantic versioning](https://semver.org/), version numbers are major.minor.patch, i.e., version 0.9.2 has minor version number 9. Prior to version 1.0.0, when a breaking change is made, this will increment the minor version (for example, going from 0.9.4 to 0.10.0). After version 1.0.0, breaking changes will increment the major version.
+
+
+
+
+
+## Reporting issues
+
+Please report issues in the web interface at the [scadnano web interface GitHub repository](https://github.com/UC-Davis-molecular-computing/scadnano/issues), and report issues in the Python scripting library at the [scadnano Python package GitHub repository](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/issues).
+
+
+
+
+
+
+## Installation
+
+Short version: type this at the command line:
+
+```console
+pip install scadnano
+```
+
+Read below for troubleshooting suggestions if that didn't work.
+
+### Getting Python
+The scadnano Python package requires Python version 3.7 or later (with a workaround available for version 3.6, but not for any lower version). 
+
+To check your current version of Python, open a command line and type
+
+```
+python --version
+```
+
+If it is version 2.7 or below, type
+
+```
+python3 --version
+```
+
+If that fails, or reports Python version 3.5 or below, you will have to install a later version of Python (recommended at least 3.7). Follow [this link](https://www.python.org/downloads/) to install Python. You may also use an alternative Python distribution, such as [Anaconda](https://www.anaconda.com/products/individual#Downloads).
+
+If you are using Python 3.6 and do not wish to upgrade, you can install a package providing the required features: the [dataclasses backport](https://pypi.org/project/dataclasses/); see `pip` instructions below to see how to install it.
+Python 3.7 provides the
+[dataclasses module](https://docs.python.org/3/library/dataclasses.html) automatically.
+
+
+
+### Installing the scadnano Python package
+
+Once Python is installed (and the dataclasses backport if you have Python version 3.6), there are two ways you can install the scadnano Python package:
+
+1. pip (recommended)
+
+    Use [pip](https://pypi.org/project/pip/) to install the package by executing the following at the command line:
+    ```console
+    pip install scadnano
+    ```
+
+    If it worked, you should be able to open a Python interpreter and import the scadnano module:
+
+    ```console
+    Python 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
+    Type "help", "copyright", "credits" or "license" for more information.
+    >>> import scadnano as sc
+    >>> print(sc.Domain(helix=1, forward=True, start=0, end=8))
+    Domain(, helix=1, forward=True, start=0, end=8)
+    >>>
+    ```
+
+    ### Troubleshooting
+    If the above does not work for you, here are some things to try.
+
+    If your Python installation does not already have pip installed, you may have to install it. 
+    Executing [this Python script](https://bootstrap.pypa.io/get-pip.py) should work; 
+    see also 
+    https://docs.python.org/3/installing/index.html 
+    or 
+    https://www.liquidweb.com/kb/install-pip-windows/.
+
+    Once pip is installed, or if you believe it is already installed, check your version of `pip` by typing 
+    ```
+    pip --version
+    ```
+    It should say something like 
+    ```
+    pip 19.3.1 from ...lib\site-packages\pip (python 3.8)
+    ```
+    If the version of Python at the end is Python 3.7 or higher, you are good. If it is version 2.7 or lower, type
+    ```
+    pip3 --version
+    ```
+    If that works and shows Python 3.7 or higher, you are good, but you should type `pip3` in the subsequent instructions instead of `pip`.
+    
+    If it shows Python 3.6, install the [dataclasses backport module](https://pypi.org/project/dataclasses/) via
+    ```
+    pip install dataclasses
+    ```
+    If it shows Python 3.5 or lower, then you will need to upgrade your Python version (recommended Python 3.7 or higher).
+
+    
+2. download
+
+    As a simple alternative (in case you run into trouble using pip), you can simply download the scadnano.py file. However, you need to first install two packages that are required by scadnano: Install [openpyxl](https://pypi.org/project/openpyxl/) and [tabulate](https://pypi.org/project/tabulate/) by typing the following at the command line: `pip install openpyxl tabulate`.
+    
+    Download and place the following files in your [PYTHONPATH](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH) (e.g., in the same directory as the scripts you are running). **Note:** If you are reading this on the PyPI website or anywhere other than GitHub, the links below won't work. They are relative links intended to be read on the [GitHub README page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package#readme).
+
+    - *required*: [scadnano.py](scadnano/scadnano.py) 
+    - *optional*: [modifications.py](scadnano/modifications.py); This contains some common DNA modifications such as biotin and Cy3. 
+    - *optional*: [origami_rectangle.py](scadnano/origami_rectangle.py); This can help create origami rectangles, but it is not necessary to use scadnano.
+    
+    To download them, right-click on "Raw" near the top and select (in Chrome or Firefox) "Save link as...":
+    ![](images/download_raw_screenshot.png)
+    
+    The scadnano package uses the Python package [xlwt](https://pypi.org/project/xlwt/) to write Excel files, so xlwt must be installed in order to call the method [`Design.write_idt_plate_excel_file()`](https://scadnano-python-package.readthedocs.io/#scadnano.Design.write_idt_plate_excel_file) to export an Excel file with DNA sequences. To install xlwt, type `pip install xlwt` at the command line. (If you instead use pip to install the scadnano package, xlwt will be automatically installed.)
+
+
+
+
+
+
+
+## Example
+
+Consider the following design:
+
+![](https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano/master/doc-images/screenshot-initial.png)
+
+The following Python script produces this design.
+
+```python
+import scadnano as sc
+import modifications as mod
+
+
+def create_design() -> sc.Design:
+    # helices
+    helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)]
+
+    # left staple
+    stap_left_domain1 = sc.Domain(helix=1, forward=True, start=8, end=24)
+    stap_left_domain0 = sc.Domain(helix=0, forward=False, start=8, end=24)
+    stap_left = sc.Strand(domains=[stap_left_domain1, stap_left_domain0])
+
+    # right staple
+    stap_right_domain0 = sc.Domain(helix=0, forward=False, start=24, end=40)
+    stap_right_domain1 = sc.Domain(helix=1, forward=True, start=24, end=40)
+    stap_right = sc.Strand(domains=[stap_right_domain0, stap_right_domain1])
+    stap_right.set_modification_5p(mod.biotin_5p)
+
+    # scaffold
+    scaf_domain1_left = sc.Domain(helix=1, forward=False, start=8, end=24)
+    scaf_domain0 = sc.Domain(helix=0, forward=True, start=8, end=40)
+    loopout = sc.Loopout(length=3)
+    scaf_domain1_right = sc.Domain(helix=1, forward=False, start=24, end=40)
+    scaf = sc.Strand(domains=[scaf_domain1_left, scaf_domain0, loopout, scaf_domain1_right], is_scaffold=True)
+
+    # whole design
+    design = sc.Design(helices=helices, strands=[scaf, stap_left, stap_right], grid=sc.square)
+
+    # deletions and insertions added to design are added to both strands on a helix
+    design.add_deletion(helix=1, offset=20)
+    design.add_insertion(helix=0, offset=14, length=1)
+    design.add_insertion(helix=0, offset=26, length=2)
+
+    # also assigns complement to strands other than scaf bound to it
+    design.assign_dna(scaf, 'AACGT' * 18)
+
+    return design
+
+
+if __name__ == '__main__':
+    design = create_design()
+    design.write_scadnano_file(directory='output_designs')
+```
+
+Running the code above produces a `.sc` file that, if loaded into scadnano, should appear as in the screenshot above. The [web interface README](https://github.com/UC-Davis-molecular-computing/scadnano/blob/master/README.md#terminology) explains many of the terms used in the code (domain, helix, loopout, insertion, etc.).
+
+
+## Abbreviated syntax with chained methods
+Instead of explicitly creating variables and objects representing each domain in each strand, there is a shorter syntax using chained method calls. Instead of the above, create only the helices first, then create the Design. Then strands can be added using a shorter syntax, to describe how to draw the strand starting at the 5' end and moving to the 3' end. The following is a modified version of the above `create_design` function using these chained methods:
+
+```python
+def create_design() -> sc.Design:
+    # helices
+    helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)]
+
+    # whole design
+    design = sc.Design(helices=helices, grid=sc.square)
+
+    # for absolute offsets, call method "to"
+    # left staple
+    design.draw_strand(1, 8).to(24).cross(0).to(8)
+
+    # for relative offsets, call method "move"
+    # right staple
+    design.draw_strand(0, 40).move(-16).cross(1).move(16).with_modification_5p(mod.biotin_5p)
+
+    # scaffold
+    design.draw_strand(1, 24).move(-16).cross(0).move(32).loopout(1, 3).move(-16).as_scaffold()
+
+    # deletions and insertions added to design are added to both strands on a helix
+    design.add_deletion(helix=1, offset=20)
+    design.add_insertion(helix=0, offset=14, length=1)
+    design.add_insertion(helix=0, offset=26, length=2)
+
+    # also assigns complement to strands other than scaf bound to it
+    design.assign_dna(design.scaffold, 'AACGT' * 18)
+
+    return design
+```
+
+Documentation is available in the [API docs](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.draw_strand).
+
+
+## StrandBuilder object for iteratively building up strands with many domains
+
+The method [`Design.draw_strand`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.Design.draw_strand), as well as all those that follow it in a chained method call (e.g., `move`, `cross`, etc.) all return an instance of the class [`StrandBuilder`](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.StrandBuilder).
+Above, that `StrandBuilder` instance is anonymous, i.e., never assigned to a variable. 
+Some long strands may be easier to specify with loops, for example an M13 scaffold strand for an origami. 
+If so, then to use the above methods, assign the `StrandBuilder` object to a variable, and call the relevant methods on that object to build up the strand in each iteration of the loop. 
+For example, the following modification of the above `create_design` function creates a linear scaffold strand that zig-zags back and forth across 32 helices:
+
+```python
+def create_design() -> sc.Design:
+    num_helices = 32
+    helices = [sc.Helix(max_offset=200) for _ in range(num_helices)]
+    design = sc.Design(helices=helices, grid=sc.square)
+    strand_builder = design.draw_strand(0, 0)
+    for helix in range(num_helices):
+        # move forward if on an even helix, otherwise move in reverse
+        move_distance = 200 if helix % 2 == 0 else -200
+        strand_builder.move(move_distance)
+        if helix < 31: # crossover to next helix, unless it's the last helix
+            strand_builder.cross(helix + 1)
+    strand_builder.as_scaffold()
+    return design
+```
+
+
+
+
+
+
+## API Documentation
+
+Online documentation of the package API (which classes, methods, functions, and constants are provided by the package) is located here:
+https://scadnano-python-package.readthedocs.io
+
+
+
+
+
+## Tutorial
+
+A [tutorial](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/blob/master/tutorial/tutorial.md) shows how to create a "standard" 24-helix DNA origami rectangle using the scadnano Python package.
+
+
+
+
+
+## Other examples
+
+*Note:* If you are reading this on the PyPI website, the links below won't work. They are relative links intended to be read on the [GitHub README page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package#readme).
+
+Several example scripts are located in the 
+[examples/](examples) subfolder. 
+Their output is contained in the 
+[examples/output_designs/](examples/output_designs) subfolder.
+
+
+
+## Contributing
 If you wish to contribute to scadnano, please see the [CONTRIBUTING document](CONTRIBUTING.md) to contribute to the scadnano Python package. There is also a [CONTRIBUTING document](https://github.com/UC-Davis-molecular-computing/scadnano/blob/master/CONTRIBUTING.md) for the web interface.
\ No newline at end of file
diff --git a/examples/idt-plates-explicit.py b/examples/idt-plates-explicit.py
index ff3b5831..eb23cae4 100644
--- a/examples/idt-plates-explicit.py
+++ b/examples/idt-plates-explicit.py
@@ -3,6 +3,7 @@
 ROWS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
 COLS = list(range(1, 13))
 
+
 def create_design() -> sc.Design:
     num_strands = 208
     start = 0
@@ -11,7 +12,7 @@ def create_design() -> sc.Design:
     row_idx = 0
     col_idx = 0
 
-    for s in range(1, num_strands+1):
+    for s in range(1, num_strands + 1):
         ss_f = sc.Domain(helix=0, forward=True, start=start, end=start + 10)
         ss_r = sc.Domain(helix=1, forward=False, start=start, end=start + 10)
 
@@ -44,7 +45,7 @@ def main() -> None:
     design = create_design()
     design.write_scadnano_file(directory='output_designs')
     design.write_idt_bulk_input_file(directory='idt')
-    design.write_idt_plate_excel_file(directory='idt', use_default_plates=False)
+    design.write_idt_plate_excel_file(directory='idt', use_default_plates=False, only_strands_with_idt=True)
 
 
 if __name__ == '__main__':
diff --git a/examples/idt/idt-plates-explicit.xls b/examples/idt/idt-plates-explicit.xls
deleted file mode 100644
index ee65bffc..00000000
Binary files a/examples/idt/idt-plates-explicit.xls and /dev/null differ
diff --git a/examples/idt/idt-plates-explicit.xlsx b/examples/idt/idt-plates-explicit.xlsx
new file mode 100644
index 00000000..4a830b5c
Binary files /dev/null and b/examples/idt/idt-plates-explicit.xlsx differ
diff --git a/examples/output_designs/idt-plates-explicit.sc b/examples/output_designs/idt-plates-explicit.sc
index 24c754a5..041260ef 100644
--- a/examples/output_designs/idt-plates-explicit.sc
+++ b/examples/output_designs/idt-plates-explicit.sc
@@ -1,2099 +1,2099 @@
-{
-  "version": "0.15.0",
-  "grid": "square",
-  "helices": [
-    {"grid_position": [0, 0]},
-    {"grid_position": [0, 1]}
-  ],
-  "strands": [
-    {
-      "name": "staple1",
-      "color": "#f74308",
-      "sequence": "TATTATAGTCTTACCCTGAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 0, "end": 10},
-        {"helix": 1, "forward": false, "start": 0, "end": 10}
-      ]
-    },
-    {
-      "name": "staple2",
-      "color": "#57bb00",
-      "sequence": "AGAAGCAAAGAATCAGGTCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 10, "end": 20},
-        {"helix": 1, "forward": false, "start": 10, "end": 20}
-      ]
-    },
-    {
-      "name": "staple3",
-      "color": "#888888",
-      "sequence": "CGGATTGCATATAAATCAAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 20, "end": 30},
-        {"helix": 1, "forward": false, "start": 20, "end": 30}
-      ]
-    },
-    {
-      "name": "staple4",
-      "color": "#32b86c",
-      "sequence": "CAAAAAGATTGAGAATGACC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 30, "end": 40},
-        {"helix": 1, "forward": false, "start": 30, "end": 40}
-      ]
-    },
-    {
-      "name": "staple5",
-      "color": "#333333",
-      "sequence": "AAGAGGAAGCTTCAGAAAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 40, "end": 50},
-        {"helix": 1, "forward": false, "start": 40, "end": 50}
-      ]
-    },
-    {
-      "name": "staple6",
-      "color": "#320096",
-      "sequence": "CCGAAAGACTCTTTAAACAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 50, "end": 60},
-        {"helix": 1, "forward": false, "start": 50, "end": 60}
-      ]
-    },
-    {
-      "name": "staple7",
-      "color": "#03b6a2",
-      "sequence": "TCAAATATCGCCCTCAAATG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 60, "end": 70},
-        {"helix": 1, "forward": false, "start": 60, "end": 70}
-      ]
-    },
-    {
-      "name": "staple8",
-      "color": "#7300de",
-      "sequence": "CGTTTTAATTCATTGAATCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 70, "end": 80},
-        {"helix": 1, "forward": false, "start": 70, "end": 80}
-      ]
-    },
-    {
-      "name": "staple9",
-      "color": "#aaaa00",
-      "sequence": "CGAGCTTCAACATAAATATT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 80, "end": 90},
-        {"helix": 1, "forward": false, "start": 80, "end": 90}
-      ]
-    },
-    {
-      "name": "staple10",
-      "color": "#b8056c",
-      "sequence": "AGCGAACCAGGCGGAATCGT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 90, "end": 100},
-        {"helix": 1, "forward": false, "start": 90, "end": 100}
-      ]
-    },
-    {
-      "name": "staple11",
-      "color": "#007200",
-      "sequence": "ACCGGAAGCAGTCCAATACT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 100, "end": 110},
-        {"helix": 1, "forward": false, "start": 100, "end": 110}
-      ]
-    },
-    {
-      "name": "staple12",
-      "color": "#cc0000",
-      "sequence": "AACTCCAACAACTGGATAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 110, "end": 120},
-        {"helix": 1, "forward": false, "start": 110, "end": 120}
-      ]
-    },
-    {
-      "name": "staple13",
-      "color": "#f7931e",
-      "sequence": "GGTCAGGATTAAATGTTTAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 120, "end": 130},
-        {"helix": 1, "forward": false, "start": 120, "end": 130}
-      ]
-    },
-    {
-      "name": "staple14",
-      "color": "#f74308",
-      "sequence": "AGAGAGTACCGGTAATAGTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 130, "end": 140},
-        {"helix": 1, "forward": false, "start": 130, "end": 140}
-      ]
-    },
-    {
-      "name": "staple15",
-      "color": "#57bb00",
-      "sequence": "TTTAATTGCTTGCCAGAGGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 140, "end": 150},
-        {"helix": 1, "forward": false, "start": 140, "end": 150}
-      ]
-    },
-    {
-      "name": "staple16",
-      "color": "#888888",
-      "sequence": "CCTTTTGATAAAAGAAGTTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 150, "end": 160},
-        {"helix": 1, "forward": false, "start": 150, "end": 160}
-      ]
-    },
-    {
-      "name": "staple17",
-      "color": "#32b86c",
-      "sequence": "AGAGGTCATTGGCTTTTGCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 160, "end": 170},
-        {"helix": 1, "forward": false, "start": 160, "end": 170}
-      ]
-    },
-    {
-      "name": "staple18",
-      "color": "#333333",
-      "sequence": "TTTGCGGATGAATAGCGAGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 170, "end": 180},
-        {"helix": 1, "forward": false, "start": 170, "end": 180}
-      ]
-    },
-    {
-      "name": "staple19",
-      "color": "#320096",
-      "sequence": "GCTTAGAGCTTAAAAACCAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 180, "end": 190},
-        {"helix": 1, "forward": false, "start": 180, "end": 190}
-      ]
-    },
-    {
-      "name": "staple20",
-      "color": "#03b6a2",
-      "sequence": "TAATTGCTGACAGACGACGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 190, "end": 200},
-        {"helix": 1, "forward": false, "start": 190, "end": 200}
-      ]
-    },
-    {
-      "name": "staple21",
-      "color": "#7300de",
-      "sequence": "ATATAATGCTCCTCGTTTAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 200, "end": 210},
-        {"helix": 1, "forward": false, "start": 200, "end": 210}
-      ]
-    },
-    {
-      "name": "staple22",
-      "color": "#aaaa00",
-      "sequence": "GTAGCTCAACCTATCATAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 210, "end": 220},
-        {"helix": 1, "forward": false, "start": 210, "end": 220}
-      ]
-    },
-    {
-      "name": "staple23",
-      "color": "#b8056c",
-      "sequence": "ATGTTTTAAAAAGAGCAACA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 220, "end": 230},
-        {"helix": 1, "forward": false, "start": 220, "end": 230}
-      ]
-    },
-    {
-      "name": "staple24",
-      "color": "#007200",
-      "sequence": "TATGCAACTAGAGGCATAGT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 230, "end": 240},
-        {"helix": 1, "forward": false, "start": 230, "end": 240}
-      ]
-    },
-    {
-      "name": "staple25",
-      "color": "#cc0000",
-      "sequence": "AAGTACGGTGAAGGAATTAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 240, "end": 250},
-        {"helix": 1, "forward": false, "start": 240, "end": 250}
-      ]
-    },
-    {
-      "name": "staple26",
-      "color": "#f7931e",
-      "sequence": "TCTGGAAGTTATAACGCCAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 250, "end": 260},
-        {"helix": 1, "forward": false, "start": 250, "end": 260}
-      ]
-    },
-    {
-      "name": "staple27",
-      "color": "#f74308",
-      "sequence": "TCATTCCATAATGCAGATAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 260, "end": 270},
-        {"helix": 1, "forward": false, "start": 260, "end": 270}
-      ]
-    },
-    {
-      "name": "staple28",
-      "color": "#57bb00",
-      "sequence": "TAACAGTTGACATTCAACTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 270, "end": 280},
-        {"helix": 1, "forward": false, "start": 270, "end": 280}
-      ]
-    },
-    {
-      "name": "staple29",
-      "color": "#888888",
-      "sequence": "TTCCCAATTCAGGAATACCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 280, "end": 290},
-        {"helix": 1, "forward": false, "start": 280, "end": 290}
-      ]
-    },
-    {
-      "name": "staple30",
-      "color": "#32b86c",
-      "sequence": "TGCGAACGAGGTTGAGATTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 290, "end": 300},
-        {"helix": 1, "forward": false, "start": 290, "end": 300}
-      ]
-    },
-    {
-      "name": "staple31",
-      "color": "#333333",
-      "sequence": "TAGATTTAGTAGATTCATCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 300, "end": 310},
-        {"helix": 1, "forward": false, "start": 300, "end": 310}
-      ]
-    },
-    {
-      "name": "staple32",
-      "color": "#320096",
-      "sequence": "TTGACCATTAACAGGTAGAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 310, "end": 320},
-        {"helix": 1, "forward": false, "start": 310, "end": 320}
-      ]
-    },
-    {
-      "name": "staple33",
-      "color": "#03b6a2",
-      "sequence": "GATACATTTCCAACATTATT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 320, "end": 330},
-        {"helix": 1, "forward": false, "start": 320, "end": 330}
-      ]
-    },
-    {
-      "name": "staple34",
-      "color": "#7300de",
-      "sequence": "GCAAATGGTCACTAACGGAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 330, "end": 340},
-        {"helix": 1, "forward": false, "start": 330, "end": 340}
-      ]
-    },
-    {
-      "name": "staple35",
-      "color": "#aaaa00",
-      "sequence": "AATAACCTGTAATAAAACGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 340, "end": 350},
-        {"helix": 1, "forward": false, "start": 340, "end": 350}
-      ]
-    },
-    {
-      "name": "staple36",
-      "color": "#b8056c",
-      "sequence": "TTAGCTATATAATCTACGTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 350, "end": 360},
-        {"helix": 1, "forward": false, "start": 350, "end": 360}
-      ]
-    },
-    {
-      "name": "staple37",
-      "color": "#007200",
-      "sequence": "TTTCATTTGGTGGGAAGAAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 360, "end": 370},
-        {"helix": 1, "forward": false, "start": 360, "end": 370}
-      ]
-    },
-    {
-      "name": "staple38",
-      "color": "#cc0000",
-      "sequence": "GGCGCGAGCTGTCAGGACGT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 370, "end": 380},
-        {"helix": 1, "forward": false, "start": 370, "end": 380}
-      ]
-    },
-    {
-      "name": "staple39",
-      "color": "#f7931e",
-      "sequence": "GAAAAGGTGGCATTATACCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 380, "end": 390},
-        {"helix": 1, "forward": false, "start": 380, "end": 390}
-      ]
-    },
-    {
-      "name": "staple40",
-      "color": "#f74308",
-      "sequence": "CATCAATTCTAGAACTGGCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 390, "end": 400},
-        {"helix": 1, "forward": false, "start": 390, "end": 400}
-      ]
-    },
-    {
-      "name": "staple41",
-      "color": "#57bb00",
-      "sequence": "ACTAATAGTATGCGATTTTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 400, "end": 410},
-        {"helix": 1, "forward": false, "start": 400, "end": 410}
-      ]
-    },
-    {
-      "name": "staple42",
-      "color": "#888888",
-      "sequence": "GTAGCATTAAAATTACCTTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 410, "end": 420},
-        {"helix": 1, "forward": false, "start": 410, "end": 420}
-      ]
-    },
-    {
-      "name": "staple43",
-      "color": "#32b86c",
-      "sequence": "CATCCAATAAAATCATTGTG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 420, "end": 430},
-        {"helix": 1, "forward": false, "start": 420, "end": 430}
-      ]
-    },
-    {
-      "name": "staple44",
-      "color": "#333333",
-      "sequence": "ATCATACAGGTTTCAACTTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 430, "end": 440},
-        {"helix": 1, "forward": false, "start": 430, "end": 440}
-      ]
-    },
-    {
-      "name": "staple45",
-      "color": "#320096",
-      "sequence": "CAAGGCAAAGGATGGTTTAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 440, "end": 450},
-        {"helix": 1, "forward": false, "start": 440, "end": 450}
-      ]
-    },
-    {
-      "name": "staple46",
-      "color": "#03b6a2",
-      "sequence": "AATTAGCAAATTGGGCTTGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 450, "end": 460},
-        {"helix": 1, "forward": false, "start": 450, "end": 460}
-      ]
-    },
-    {
-      "name": "staple47",
-      "color": "#7300de",
-      "sequence": "ATTAAGCAATGAGTAGTAAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 460, "end": 470},
-        {"helix": 1, "forward": false, "start": 460, "end": 470}
-      ]
-    },
-    {
-      "name": "staple48",
-      "color": "#aaaa00",
-      "sequence": "AAAGCCTCAGACACCAGAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 470, "end": 480},
-        {"helix": 1, "forward": false, "start": 470, "end": 480}
-      ]
-    },
-    {
-      "name": "staple49",
-      "color": "#b8056c",
-      "sequence": "AGCATAAAGCCTGACGAGAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 480, "end": 490},
-        {"helix": 1, "forward": false, "start": 480, "end": 490}
-      ]
-    },
-    {
-      "name": "staple50",
-      "color": "#007200",
-      "sequence": "TAAATCGGTTAAGGCTTGCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 490, "end": 500},
-        {"helix": 1, "forward": false, "start": 490, "end": 500}
-      ]
-    },
-    {
-      "name": "staple51",
-      "color": "#cc0000",
-      "sequence": "GTACCAAAAATTCAGTGAAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 500, "end": 510},
-        {"helix": 1, "forward": false, "start": 500, "end": 510}
-      ]
-    },
-    {
-      "name": "staple52",
-      "color": "#f7931e",
-      "sequence": "CATTATGACCAAGCTGCTCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 510, "end": 520},
-        {"helix": 1, "forward": false, "start": 510, "end": 520}
-      ]
-    },
-    {
-      "name": "staple53",
-      "color": "#f74308",
-      "sequence": "CTGTAATACTCAACGTAACA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 520, "end": 530},
-        {"helix": 1, "forward": false, "start": 520, "end": 530}
-      ]
-    },
-    {
-      "name": "staple54",
-      "color": "#57bb00",
-      "sequence": "TTTGCGGGAGTTACCCAAAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 530, "end": 540},
-        {"helix": 1, "forward": false, "start": 530, "end": 540}
-      ]
-    },
-    {
-      "name": "staple55",
-      "color": "#888888",
-      "sequence": "AAGCCTTTATCGGATATTCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 540, "end": 550},
-        {"helix": 1, "forward": false, "start": 540, "end": 550}
-      ]
-    },
-    {
-      "name": "staple56",
-      "color": "#32b86c",
-      "sequence": "TTCAACGCAATGACAAGAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 550, "end": 560},
-        {"helix": 1, "forward": false, "start": 550, "end": 560}
-      ]
-    },
-    {
-      "name": "staple57",
-      "color": "#333333",
-      "sequence": "GGATAAAAATAGAGTAATCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 560, "end": 570},
-        {"helix": 1, "forward": false, "start": 560, "end": 570}
-      ]
-    },
-    {
-      "name": "staple58",
-      "color": "#320096",
-      "sequence": "TTTTAGAACCACCTTCATCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 570, "end": 580},
-        {"helix": 1, "forward": false, "start": 570, "end": 580}
-      ]
-    },
-    {
-      "name": "staple59",
-      "color": "#03b6a2",
-      "sequence": "CTCATATATTAGGCTGGCTG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 580, "end": 590},
-        {"helix": 1, "forward": false, "start": 580, "end": 590}
-      ]
-    },
-    {
-      "name": "staple60",
-      "color": "#7300de",
-      "sequence": "TTAAATGCAACCAGGCGCAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 590, "end": 600},
-        {"helix": 1, "forward": false, "start": 590, "end": 600}
-      ]
-    },
-    {
-      "name": "staple61",
-      "color": "#aaaa00",
-      "sequence": "TGCCTGAGTAGGTGTACAGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 600, "end": 610},
-        {"helix": 1, "forward": false, "start": 600, "end": 610}
-      ]
-    },
-    {
-      "name": "staple62",
-      "color": "#b8056c",
-      "sequence": "ATGTGTAGGTACAGATGAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 610, "end": 620},
-        {"helix": 1, "forward": false, "start": 610, "end": 620}
-      ]
-    },
-    {
-      "name": "staple63",
-      "color": "#007200",
-      "sequence": "AAAGATTCAATTGAAAGAGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 620, "end": 630},
-        {"helix": 1, "forward": false, "start": 620, "end": 630}
-      ]
-    },
-    {
-      "name": "staple64",
-      "color": "#cc0000",
-      "sequence": "AAGGGTGAGACTGACCAACT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 630, "end": 640},
-        {"helix": 1, "forward": false, "start": 630, "end": 640}
-      ]
-    },
-    {
-      "name": "staple65",
-      "color": "#f7931e",
-      "sequence": "AAGGCCGGAGGGGAACCGAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 640, "end": 650},
-        {"helix": 1, "forward": false, "start": 640, "end": 650}
-      ]
-    },
-    {
-      "name": "staple66",
-      "color": "#f74308",
-      "sequence": "ACAGTCAAATTCAATCATAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 650, "end": 660},
-        {"helix": 1, "forward": false, "start": 650, "end": 660}
-      ]
-    },
-    {
-      "name": "staple67",
-      "color": "#57bb00",
-      "sequence": "CACCATCAATGCGCAGACGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 660, "end": 670},
-        {"helix": 1, "forward": false, "start": 660, "end": 670}
-      ]
-    },
-    {
-      "name": "staple68",
-      "color": "#888888",
-      "sequence": "ATGATATTCACCGGAACGAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 670, "end": 680},
-        {"helix": 1, "forward": false, "start": 670, "end": 680}
-      ]
-    },
-    {
-      "name": "staple69",
-      "color": "#32b86c",
-      "sequence": "ACCGTTCTAGTGTTACTTAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 680, "end": 690},
-        {"helix": 1, "forward": false, "start": 680, "end": 690}
-      ]
-    },
-    {
-      "name": "staple70",
-      "color": "#333333",
-      "sequence": "CTGATAAATTACCTGCTCCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 690, "end": 700},
-        {"helix": 1, "forward": false, "start": 690, "end": 700}
-      ]
-    },
-    {
-      "name": "staple71",
-      "color": "#320096",
-      "sequence": "AATGCCGGAGGAAATCCGCG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 700, "end": 710},
-        {"helix": 1, "forward": false, "start": 700, "end": 710}
-      ]
-    },
-    {
-      "name": "staple72",
-      "color": "#03b6a2",
-      "sequence": "AGGGTAGCTAAAATTGTGTC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 710, "end": 720},
-        {"helix": 1, "forward": false, "start": 710, "end": 720}
-      ]
-    },
-    {
-      "name": "staple73",
-      "color": "#7300de",
-      "sequence": "TTTTTGAGAGATCGCCTGAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 720, "end": 730},
-        {"helix": 1, "forward": false, "start": 720, "end": 730}
-      ]
-    },
-    {
-      "name": "staple74",
-      "color": "#aaaa00",
-      "sequence": "ATCTACAAAGGATTTGTATC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 730, "end": 740},
-        {"helix": 1, "forward": false, "start": 730, "end": 740}
-      ]
-    },
-    {
-      "name": "staple75",
-      "color": "#b8056c",
-      "sequence": "GCTATCAGGTGTACAACGGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 740, "end": 750},
-        {"helix": 1, "forward": false, "start": 740, "end": 750}
-      ]
-    },
-    {
-      "name": "staple76",
-      "color": "#007200",
-      "sequence": "CATTGCCTGAGCGAAACAAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 750, "end": 760},
-        {"helix": 1, "forward": false, "start": 750, "end": 760}
-      ]
-    },
-    {
-      "name": "staple77",
-      "color": "#cc0000",
-      "sequence": "GAGTCTGGAGTATACCAAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 760, "end": 770},
-        {"helix": 1, "forward": false, "start": 760, "end": 770}
-      ]
-    },
-    {
-      "name": "staple78",
-      "color": "#f7931e",
-      "sequence": "CAAACAAGAGCCCCAGCGAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 770, "end": 780},
-        {"helix": 1, "forward": false, "start": 770, "end": 780}
-      ]
-    },
-    {
-      "name": "staple79",
-      "color": "#f74308",
-      "sequence": "AATCGATGAACATCTTTGAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 780, "end": 790},
-        {"helix": 1, "forward": false, "start": 780, "end": 790}
-      ]
-    },
-    {
-      "name": "staple80",
-      "color": "#57bb00",
-      "sequence": "CGGTAATCGTCTAAAACACT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 790, "end": 800},
-        {"helix": 1, "forward": false, "start": 790, "end": 800}
-      ]
-    },
-    {
-      "name": "staple81",
-      "color": "#888888",
-      "sequence": "AAAACTAGCAAAAGAATACA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 800, "end": 810},
-        {"helix": 1, "forward": false, "start": 800, "end": 810}
-      ]
-    },
-    {
-      "name": "staple82",
-      "color": "#32b86c",
-      "sequence": "TGTCAATCATGAAAGAGGCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 810, "end": 820},
-        {"helix": 1, "forward": false, "start": 810, "end": 820}
-      ]
-    },
-    {
-      "name": "staple83",
-      "color": "#333333",
-      "sequence": "ATGTACCCCGAACCTAAAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 820, "end": 830},
-        {"helix": 1, "forward": false, "start": 820, "end": 830}
-      ]
-    },
-    {
-      "name": "staple84",
-      "color": "#320096",
-      "sequence": "GTTGATAATCCGAAGGCACC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 830, "end": 840},
-        {"helix": 1, "forward": false, "start": 830, "end": 840}
-      ]
-    },
-    {
-      "name": "staple85",
-      "color": "#03b6a2",
-      "sequence": "AGAAAAGCCCAATGCCACTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 840, "end": 850},
-        {"helix": 1, "forward": false, "start": 840, "end": 850}
-      ]
-    },
-    {
-      "name": "staple86",
-      "color": "#7300de",
-      "sequence": "CAAAAACAGGTAAAATACGT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 850, "end": 860},
-        {"helix": 1, "forward": false, "start": 850, "end": 860}
-      ]
-    },
-    {
-      "name": "staple87",
-      "color": "#aaaa00",
-      "sequence": "AAGATTGTATATTAAACGGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 860, "end": 870},
-        {"helix": 1, "forward": false, "start": 860, "end": 870}
-      ]
-    },
-    {
-      "name": "staple88",
-      "color": "#b8056c",
-      "sequence": "AAGCAAATATGGAAGTTTCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 870, "end": 880},
-        {"helix": 1, "forward": false, "start": 870, "end": 880}
-      ]
-    },
-    {
-      "name": "staple89",
-      "color": "#007200",
-      "sequence": "TTAAATTGTATTTTTCATGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 880, "end": 890},
-        {"helix": 1, "forward": false, "start": 880, "end": 890}
-      ]
-    },
-    {
-      "name": "staple90",
-      "color": "#cc0000",
-      "sequence": "AACGTTAATAGACTAAAGAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 890, "end": 900},
-        {"helix": 1, "forward": false, "start": 890, "end": 900}
-      ]
-    },
-    {
-      "name": "staple91",
-      "color": "#f7931e",
-      "sequence": "TTTTGTTAAAAGGCTTTGAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 900, "end": 910},
-        {"helix": 1, "forward": false, "start": 900, "end": 910}
-      ]
-    },
-    {
-      "name": "staple92",
-      "color": "#f74308",
-      "sequence": "ATTCGCATTAACGGCTACAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 910, "end": 920},
-        {"helix": 1, "forward": false, "start": 910, "end": 920}
-      ]
-    },
-    {
-      "name": "staple93",
-      "color": "#57bb00",
-      "sequence": "AATTTTTGTTGAGGGTAGCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 920, "end": 930},
-        {"helix": 1, "forward": false, "start": 920, "end": 930}
-      ]
-    },
-    {
-      "name": "staple94",
-      "color": "#888888",
-      "sequence": "AAATCAGCTCGCATCGGAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 930, "end": 940},
-        {"helix": 1, "forward": false, "start": 930, "end": 940}
-      ]
-    },
-    {
-      "name": "staple95",
-      "color": "#32b86c",
-      "sequence": "ATTTTTTAACGCGAAAGACA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 940, "end": 950},
-        {"helix": 1, "forward": false, "start": 940, "end": 950}
-      ]
-    },
-    {
-      "name": "staple96",
-      "color": "#333333",
-      "sequence": "CAATAGGAACACCCTCAGCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 950, "end": 960},
-        {"helix": 1, "forward": false, "start": 950, "end": 960}
-      ]
-    },
-    {
-      "name": "staple97",
-      "color": "#320096",
-      "sequence": "GCCATCAAAACGGGATCGTC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 960, "end": 970},
-        {"helix": 1, "forward": false, "start": 960, "end": 970}
-      ]
-    },
-    {
-      "name": "staple98",
-      "color": "#03b6a2",
-      "sequence": "ATAATTCGCGGCCGCTTTTG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 970, "end": 980},
-        {"helix": 1, "forward": false, "start": 970, "end": 980}
-      ]
-    },
-    {
-      "name": "staple99",
-      "color": "#7300de",
-      "sequence": "TCTGGCCTTCGGAGTTAAAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 980, "end": 990},
-        {"helix": 1, "forward": false, "start": 980, "end": 990}
-      ]
-    },
-    {
-      "name": "staple100",
-      "color": "#aaaa00",
-      "sequence": "CTGTAGCCAGAGGCTTGCAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 990, "end": 1000},
-        {"helix": 1, "forward": false, "start": 990, "end": 1000}
-      ]
-    },
-    {
-      "name": "staple101",
-      "color": "#b8056c",
-      "sequence": "CTTTCATCAATCGGTCGCTG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1000, "end": 1010},
-        {"helix": 1, "forward": false, "start": 1000, "end": 1010}
-      ]
-    },
-    {
-      "name": "staple102",
-      "color": "#007200",
-      "sequence": "CATTAAATGTACCGATATAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1010, "end": 1020},
-        {"helix": 1, "forward": false, "start": 1010, "end": 1020}
-      ]
-    },
-    {
-      "name": "staple103",
-      "color": "#cc0000",
-      "sequence": "GAGCGAGTAACCCACGCATA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1020, "end": 1030},
-        {"helix": 1, "forward": false, "start": 1020, "end": 1030}
-      ]
-    },
-    {
-      "name": "staple104",
-      "color": "#f7931e",
-      "sequence": "CAACCCGTCGACAACCATCG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1030, "end": 1040},
-        {"helix": 1, "forward": false, "start": 1030, "end": 1040}
-      ]
-    },
-    {
-      "name": "staple105",
-      "color": "#f74308",
-      "sequence": "GATTCTCCGTGACAATGACA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1040, "end": 1050},
-        {"helix": 1, "forward": false, "start": 1040, "end": 1050}
-      ]
-    },
-    {
-      "name": "staple106",
-      "color": "#57bb00",
-      "sequence": "GGGAACAAACTAGTTGCGCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1050, "end": 1060},
-        {"helix": 1, "forward": false, "start": 1050, "end": 1060}
-      ]
-    },
-    {
-      "name": "staple107",
-      "color": "#888888",
-      "sequence": "GGCGGATTGATTGATACCGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1060, "end": 1070},
-        {"helix": 1, "forward": false, "start": 1060, "end": 1070}
-      ]
-    },
-    {
-      "name": "staple108",
-      "color": "#32b86c",
-      "sequence": "CCGTAATGGGCTTAAACAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1070, "end": 1080},
-        {"helix": 1, "forward": false, "start": 1070, "end": 1080}
-      ]
-    },
-    {
-      "name": "staple109",
-      "color": "#333333",
-      "sequence": "ATAGGTCACGAGGTGAATTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1080, "end": 1090},
-        {"helix": 1, "forward": false, "start": 1080, "end": 1090}
-      ]
-    },
-    {
-      "name": "staple110",
-      "color": "#320096",
-      "sequence": "TTGGTGTAGACTTGCTTTCG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1090, "end": 1100},
-        {"helix": 1, "forward": false, "start": 1090, "end": 1100}
-      ]
-    },
-    {
-      "name": "staple111",
-      "color": "#03b6a2",
-      "sequence": "TGGGCGCATCGGTTTATCAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1100, "end": 1110},
-        {"helix": 1, "forward": false, "start": 1100, "end": 1110}
-      ]
-    },
-    {
-      "name": "staple112",
-      "color": "#7300de",
-      "sequence": "GTAACCGTGCTAATTGTATC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1110, "end": 1120},
-        {"helix": 1, "forward": false, "start": 1110, "end": 1120}
-      ]
-    },
-    {
-      "name": "staple113",
-      "color": "#aaaa00",
-      "sequence": "ATCTGCCAGTAAGGAGCCTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1120, "end": 1130},
-        {"helix": 1, "forward": false, "start": 1120, "end": 1130}
-      ]
-    },
-    {
-      "name": "staple114",
-      "color": "#b8056c",
-      "sequence": "TTGAGGGGACAAGGCTCCAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1130, "end": 1140},
-        {"helix": 1, "forward": false, "start": 1130, "end": 1140}
-      ]
-    },
-    {
-      "name": "staple115",
-      "color": "#007200",
-      "sequence": "GACGACAGTACTCCAAAAAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1140, "end": 1150},
-        {"helix": 1, "forward": false, "start": 1140, "end": 1150}
-      ]
-    },
-    {
-      "name": "staple116",
-      "color": "#cc0000",
-      "sequence": "TCGGCCTCAGCGTTGAAAAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1150, "end": 1160},
-        {"helix": 1, "forward": false, "start": 1150, "end": 1160}
-      ]
-    },
-    {
-      "name": "staple117",
-      "color": "#f7931e",
-      "sequence": "GAAGATCGCAAATTTTTTCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1160, "end": 1170},
-        {"helix": 1, "forward": false, "start": 1160, "end": 1170}
-      ]
-    },
-    {
-      "name": "staple118",
-      "color": "#f74308",
-      "sequence": "CTCCAGCCAGTGCGAATAAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1170, "end": 1180},
-        {"helix": 1, "forward": false, "start": 1170, "end": 1180}
-      ]
-    },
-    {
-      "name": "staple119",
-      "color": "#57bb00",
-      "sequence": "CTTTCCGGCACTAAAGGAAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1180, "end": 1190},
-        {"helix": 1, "forward": false, "start": 1180, "end": 1190}
-      ]
-    },
-    {
-      "name": "staple120",
-      "color": "#888888",
-      "sequence": "CCGCTTCTGGAAAGGAACAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H3"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1190, "end": 1200},
-        {"helix": 1, "forward": false, "start": 1190, "end": 1200}
-      ]
-    },
-    {
-      "name": "staple121",
-      "color": "#32b86c",
-      "sequence": "TGCCGGAAACGTGAGAATAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1200, "end": 1210},
-        {"helix": 1, "forward": false, "start": 1200, "end": 1210}
-      ]
-    },
-    {
-      "name": "staple122",
-      "color": "#333333",
-      "sequence": "CAGGCAAAGCTTTCAGCGGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1210, "end": 1220},
-        {"helix": 1, "forward": false, "start": 1210, "end": 1220}
-      ]
-    },
-    {
-      "name": "staple123",
-      "color": "#320096",
-      "sequence": "GCCATTCGCCCTTTCAACAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1220, "end": 1230},
-        {"helix": 1, "forward": false, "start": 1220, "end": 1230}
-      ]
-    },
-    {
-      "name": "staple124",
-      "color": "#03b6a2",
-      "sequence": "ATTCAGGCTGTGCTAAACAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1230, "end": 1240},
-        {"helix": 1, "forward": false, "start": 1230, "end": 1240}
-      ]
-    },
-    {
-      "name": "staple125",
-      "color": "#7300de",
-      "sequence": "CGCAACTGTTTATGGGATTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1240, "end": 1250},
-        {"helix": 1, "forward": false, "start": 1240, "end": 1250}
-      ]
-    },
-    {
-      "name": "staple126",
-      "color": "#aaaa00",
-      "sequence": "GGGAAGGGCGGAATTTTCTG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1250, "end": 1260},
-        {"helix": 1, "forward": false, "start": 1250, "end": 1260}
-      ]
-    },
-    {
-      "name": "staple127",
-      "color": "#b8056c",
-      "sequence": "ATCGGTGCGGGTTAGTAAAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1260, "end": 1270},
-        {"helix": 1, "forward": false, "start": 1260, "end": 1270}
-      ]
-    },
-    {
-      "name": "staple128",
-      "color": "#007200",
-      "sequence": "GCCTCTTCGCCTTTCCAGAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H4"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1270, "end": 1280},
-        {"helix": 1, "forward": false, "start": 1270, "end": 1280}
-      ]
-    },
-    {
-      "name": "staple129",
-      "color": "#cc0000",
-      "sequence": "TATTACGCCAGTTTTGTCGT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1280, "end": 1290},
-        {"helix": 1, "forward": false, "start": 1280, "end": 1290}
-      ]
-    },
-    {
-      "name": "staple130",
-      "color": "#f7931e",
-      "sequence": "GCTGGCGAAAACGATCTAAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1290, "end": 1300},
-        {"helix": 1, "forward": false, "start": 1290, "end": 1300}
-      ]
-    },
-    {
-      "name": "staple131",
-      "color": "#f74308",
-      "sequence": "GGGGGATGTGAGTTAGCGTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1300, "end": 1310},
-        {"helix": 1, "forward": false, "start": 1300, "end": 1310}
-      ]
-    },
-    {
-      "name": "staple132",
-      "color": "#57bb00",
-      "sequence": "CTGCAAGGCGCAGCCCTCAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1310, "end": 1320},
-        {"helix": 1, "forward": false, "start": 1310, "end": 1320}
-      ]
-    },
-    {
-      "name": "staple133",
-      "color": "#888888",
-      "sequence": "ATTAAGTTGGATTCCACAGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1320, "end": 1330},
-        {"helix": 1, "forward": false, "start": 1320, "end": 1330}
-      ]
-    },
-    {
-      "name": "staple134",
-      "color": "#32b86c",
-      "sequence": "GTAACGCCAGCGCCTGTAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1330, "end": 1340},
-        {"helix": 1, "forward": false, "start": 1330, "end": 1340}
-      ]
-    },
-    {
-      "name": "staple135",
-      "color": "#333333",
-      "sequence": "GGTTTTCCCACAAACTACAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1340, "end": 1350},
-        {"helix": 1, "forward": false, "start": 1340, "end": 1350}
-      ]
-    },
-    {
-      "name": "staple136",
-      "color": "#320096",
-      "sequence": "GTCACGACGTGTCACCAGTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H5"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1350, "end": 1360},
-        {"helix": 1, "forward": false, "start": 1350, "end": 1360}
-      ]
-    },
-    {
-      "name": "staple137",
-      "color": "#03b6a2",
-      "sequence": "TGTAAAACGAACTGAGTTTC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1360, "end": 1370},
-        {"helix": 1, "forward": false, "start": 1360, "end": 1370}
-      ]
-    },
-    {
-      "name": "staple138",
-      "color": "#7300de",
-      "sequence": "CGGCCAGTGCGTACCGTAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1370, "end": 1380},
-        {"helix": 1, "forward": false, "start": 1370, "end": 1380}
-      ]
-    },
-    {
-      "name": "staple139",
-      "color": "#aaaa00",
-      "sequence": "CAAGCTTGCAAGGAACCCAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1380, "end": 1390},
-        {"helix": 1, "forward": false, "start": 1380, "end": 1390}
-      ]
-    },
-    {
-      "name": "staple140",
-      "color": "#b8056c",
-      "sequence": "TGCCTGCAGGCAAGCCCAAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1390, "end": 1400},
-        {"helix": 1, "forward": false, "start": 1390, "end": 1400}
-      ]
-    },
-    {
-      "name": "staple141",
-      "color": "#007200",
-      "sequence": "TCGACTCTAGTCAGGGATAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1400, "end": 1410},
-        {"helix": 1, "forward": false, "start": 1400, "end": 1410}
-      ]
-    },
-    {
-      "name": "staple142",
-      "color": "#cc0000",
-      "sequence": "AGGATCCCCGACCCTCATTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1410, "end": 1420},
-        {"helix": 1, "forward": false, "start": 1410, "end": 1420}
-      ]
-    },
-    {
-      "name": "staple143",
-      "color": "#f7931e",
-      "sequence": "GGTACCGAGCCAGAGCCACC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1420, "end": 1430},
-        {"helix": 1, "forward": false, "start": 1420, "end": 1430}
-      ]
-    },
-    {
-      "name": "staple144",
-      "color": "#f74308",
-      "sequence": "TCGAATTCGTCCGCCACCCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H6"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1430, "end": 1440},
-        {"helix": 1, "forward": false, "start": 1430, "end": 1440}
-      ]
-    },
-    {
-      "name": "staple145",
-      "color": "#57bb00",
-      "sequence": "AATCATGGTCACCCTCAGAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1440, "end": 1450},
-        {"helix": 1, "forward": false, "start": 1440, "end": 1450}
-      ]
-    },
-    {
-      "name": "staple146",
-      "color": "#888888",
-      "sequence": "ATAGCTGTTTCAGAACCGCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1450, "end": 1460},
-        {"helix": 1, "forward": false, "start": 1450, "end": 1460}
-      ]
-    },
-    {
-      "name": "staple147",
-      "color": "#32b86c",
-      "sequence": "CCTGTGTGAACCGCCACCCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1460, "end": 1470},
-        {"helix": 1, "forward": false, "start": 1460, "end": 1470}
-      ]
-    },
-    {
-      "name": "staple148",
-      "color": "#333333",
-      "sequence": "ATTGTTATCCAGGTTTAGTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1470, "end": 1480},
-        {"helix": 1, "forward": false, "start": 1470, "end": 1480}
-      ]
-    },
-    {
-      "name": "staple149",
-      "color": "#320096",
-      "sequence": "GCTCACAATTCGTACTCAGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1480, "end": 1490},
-        {"helix": 1, "forward": false, "start": 1480, "end": 1490}
-      ]
-    },
-    {
-      "name": "staple150",
-      "color": "#03b6a2",
-      "sequence": "CCACACAACAGGTGTATCAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1490, "end": 1500},
-        {"helix": 1, "forward": false, "start": 1490, "end": 1500}
-      ]
-    },
-    {
-      "name": "staple151",
-      "color": "#7300de",
-      "sequence": "TACGAGCCGGGCCCGGAATA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1500, "end": 1510},
-        {"helix": 1, "forward": false, "start": 1500, "end": 1510}
-      ]
-    },
-    {
-      "name": "staple152",
-      "color": "#aaaa00",
-      "sequence": "AAGCATAAAGTATAAGTATA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H7"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1510, "end": 1520},
-        {"helix": 1, "forward": false, "start": 1510, "end": 1520}
-      ]
-    },
-    {
-      "name": "staple153",
-      "color": "#b8056c",
-      "sequence": "TGTAAAGCCTAGAGGGTTGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1520, "end": 1530},
-        {"helix": 1, "forward": false, "start": 1520, "end": 1530}
-      ]
-    },
-    {
-      "name": "staple154",
-      "color": "#007200",
-      "sequence": "GGGGTGCCTAAGTGCCGTCG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1530, "end": 1540},
-        {"helix": 1, "forward": false, "start": 1530, "end": 1540}
-      ]
-    },
-    {
-      "name": "staple155",
-      "color": "#cc0000",
-      "sequence": "ATGAGTGAGCCAGGCGGATA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1540, "end": 1550},
-        {"helix": 1, "forward": false, "start": 1540, "end": 1550}
-      ]
-    },
-    {
-      "name": "staple156",
-      "color": "#f7931e",
-      "sequence": "TAACTCACATTGCTCAGTAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1550, "end": 1560},
-        {"helix": 1, "forward": false, "start": 1550, "end": 1560}
-      ]
-    },
-    {
-      "name": "staple157",
-      "color": "#f74308",
-      "sequence": "TAATTGCGTTAGCGGGGTTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1560, "end": 1570},
-        {"helix": 1, "forward": false, "start": 1560, "end": 1570}
-      ]
-    },
-    {
-      "name": "staple158",
-      "color": "#57bb00",
-      "sequence": "GCGCTCACTGGATTAGGATT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1570, "end": 1580},
-        {"helix": 1, "forward": false, "start": 1570, "end": 1580}
-      ]
-    },
-    {
-      "name": "staple159",
-      "color": "#888888",
-      "sequence": "CCCGCTTTCCTCAAGAGAAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1580, "end": 1590},
-        {"helix": 1, "forward": false, "start": 1580, "end": 1590}
-      ]
-    },
-    {
-      "name": "staple160",
-      "color": "#32b86c",
-      "sequence": "AGTCGGGAAACTGAGACTCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H8"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1590, "end": 1600},
-        {"helix": 1, "forward": false, "start": 1590, "end": 1600}
-      ]
-    },
-    {
-      "name": "staple161",
-      "color": "#333333",
-      "sequence": "CCTGTCGTGCTATTAAGAGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1600, "end": 1610},
-        {"helix": 1, "forward": false, "start": 1600, "end": 1610}
-      ]
-    },
-    {
-      "name": "staple162",
-      "color": "#320096",
-      "sequence": "CAGCTGCATTAACATGAAAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1610, "end": 1620},
-        {"helix": 1, "forward": false, "start": 1610, "end": 1620}
-      ]
-    },
-    {
-      "name": "staple163",
-      "color": "#03b6a2",
-      "sequence": "AATGAATCGGATTATTCTGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1620, "end": 1630},
-        {"helix": 1, "forward": false, "start": 1620, "end": 1630}
-      ]
-    },
-    {
-      "name": "staple164",
-      "color": "#7300de",
-      "sequence": "CCAACGCGCGTTCGGAACCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1630, "end": 1640},
-        {"helix": 1, "forward": false, "start": 1630, "end": 1640}
-      ]
-    },
-    {
-      "name": "staple165",
-      "color": "#aaaa00",
-      "sequence": "GGGAGAGGCGCCCTGCCTAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1640, "end": 1650},
-        {"helix": 1, "forward": false, "start": 1640, "end": 1650}
-      ]
-    },
-    {
-      "name": "staple166",
-      "color": "#b8056c",
-      "sequence": "GTTTGCGTATAGTTAATGCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1650, "end": 1660},
-        {"helix": 1, "forward": false, "start": 1650, "end": 1660}
-      ]
-    },
-    {
-      "name": "staple167",
-      "color": "#007200",
-      "sequence": "TGGGCGCCAGCCGTATAAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1660, "end": 1670},
-        {"helix": 1, "forward": false, "start": 1660, "end": 1670}
-      ]
-    },
-    {
-      "name": "staple168",
-      "color": "#cc0000",
-      "sequence": "GGTGGTTTTTGTAACAGTGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H9"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1670, "end": 1680},
-        {"helix": 1, "forward": false, "start": 1670, "end": 1680}
-      ]
-    },
-    {
-      "name": "staple169",
-      "color": "#f7931e",
-      "sequence": "CTTTTCACCAAGTGCCTTGA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1680, "end": 1690},
-        {"helix": 1, "forward": false, "start": 1680, "end": 1690}
-      ]
-    },
-    {
-      "name": "staple170",
-      "color": "#f74308",
-      "sequence": "GTGAGACGGGTAACGGGGTC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1690, "end": 1700},
-        {"helix": 1, "forward": false, "start": 1690, "end": 1700}
-      ]
-    },
-    {
-      "name": "staple171",
-      "color": "#57bb00",
-      "sequence": "CAACAGCTGATAATAAGTTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1700, "end": 1710},
-        {"helix": 1, "forward": false, "start": 1700, "end": 1710}
-      ]
-    },
-    {
-      "name": "staple172",
-      "color": "#888888",
-      "sequence": "TTGCCCTTCAAGTGTACTGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1710, "end": 1720},
-        {"helix": 1, "forward": false, "start": 1710, "end": 1720}
-      ]
-    },
-    {
-      "name": "staple173",
-      "color": "#32b86c",
-      "sequence": "CCGCCTGGCCATGATACAGG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1720, "end": 1730},
-        {"helix": 1, "forward": false, "start": 1720, "end": 1730}
-      ]
-    },
-    {
-      "name": "staple174",
-      "color": "#333333",
-      "sequence": "CTGAGAGAGTATGGCTTTTG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1730, "end": 1740},
-        {"helix": 1, "forward": false, "start": 1730, "end": 1740}
-      ]
-    },
-    {
-      "name": "staple175",
-      "color": "#320096",
-      "sequence": "TGCAGCAAGCAGCGTCATAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1740, "end": 1750},
-        {"helix": 1, "forward": false, "start": 1740, "end": 1750}
-      ]
-    },
-    {
-      "name": "staple176",
-      "color": "#03b6a2",
-      "sequence": "GGTCCACGCTCGTTCCAGTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H10"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1750, "end": 1760},
-        {"helix": 1, "forward": false, "start": 1750, "end": 1760}
-      ]
-    },
-    {
-      "name": "staple177",
-      "color": "#7300de",
-      "sequence": "GGTTTGCCCCCTGAATTTAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1760, "end": 1770},
-        {"helix": 1, "forward": false, "start": 1760, "end": 1770}
-      ]
-    },
-    {
-      "name": "staple178",
-      "color": "#aaaa00",
-      "sequence": "AGCAGGCGAAAGCGCAGTCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1770, "end": 1780},
-        {"helix": 1, "forward": false, "start": 1770, "end": 1780}
-      ]
-    },
-    {
-      "name": "staple179",
-      "color": "#b8056c",
-      "sequence": "AATCCTGTTTCAGAATGGAA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1780, "end": 1790},
-        {"helix": 1, "forward": false, "start": 1780, "end": 1790}
-      ]
-    },
-    {
-      "name": "staple180",
-      "color": "#007200",
-      "sequence": "GATGGTGGTTTCATTAAAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1790, "end": 1800},
-        {"helix": 1, "forward": false, "start": 1790, "end": 1800}
-      ]
-    },
-    {
-      "name": "staple181",
-      "color": "#cc0000",
-      "sequence": "CCGAAATCGGAAATAAATCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1800, "end": 1810},
-        {"helix": 1, "forward": false, "start": 1800, "end": 1810}
-      ]
-    },
-    {
-      "name": "staple182",
-      "color": "#f7931e",
-      "sequence": "CAAAATCCCTATTCACAAAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1810, "end": 1820},
-        {"helix": 1, "forward": false, "start": 1810, "end": 1820}
-      ]
-    },
-    {
-      "name": "staple183",
-      "color": "#f74308",
-      "sequence": "TATAAATCAATGGCCTTGAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1820, "end": 1830},
-        {"helix": 1, "forward": false, "start": 1820, "end": 1830}
-      ]
-    },
-    {
-      "name": "staple184",
-      "color": "#57bb00",
-      "sequence": "AAGAATAGCCGTCAGACGAT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H11"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1830, "end": 1840},
-        {"helix": 1, "forward": false, "start": 1830, "end": 1840}
-      ]
-    },
-    {
-      "name": "staple185",
-      "color": "#888888",
-      "sequence": "CGAGATAGGGGTTGAGGCAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1840, "end": 1850},
-        {"helix": 1, "forward": false, "start": 1840, "end": 1850}
-      ]
-    },
-    {
-      "name": "staple186",
-      "color": "#32b86c",
-      "sequence": "TTGAGTGTTGTTGACAGGAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1850, "end": 1860},
-        {"helix": 1, "forward": false, "start": 1850, "end": 1860}
-      ]
-    },
-    {
-      "name": "staple187",
-      "color": "#333333",
-      "sequence": "TTCCAGTTTGGCCGCCAGCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1860, "end": 1870},
-        {"helix": 1, "forward": false, "start": 1860, "end": 1870}
-      ]
-    },
-    {
-      "name": "staple188",
-      "color": "#320096",
-      "sequence": "GAACAAGAGTCACCAGAGCC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1870, "end": 1880},
-        {"helix": 1, "forward": false, "start": 1870, "end": 1880}
-      ]
-    },
-    {
-      "name": "staple189",
-      "color": "#03b6a2",
-      "sequence": "CCACTATTAACCAGAACCAC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1880, "end": 1890},
-        {"helix": 1, "forward": false, "start": 1880, "end": 1890}
-      ]
-    },
-    {
-      "name": "staple190",
-      "color": "#7300de",
-      "sequence": "AGAACGTGGAAGAGCCGCCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1890, "end": 1900},
-        {"helix": 1, "forward": false, "start": 1890, "end": 1900}
-      ]
-    },
-    {
-      "name": "staple191",
-      "color": "#aaaa00",
-      "sequence": "CTCCAACGTCCACCACCCTC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1900, "end": 1910},
-        {"helix": 1, "forward": false, "start": 1900, "end": 1910}
-      ]
-    },
-    {
-      "name": "staple192",
-      "color": "#b8056c",
-      "sequence": "AAAGGGCGAACCCTCAGAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H12"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1910, "end": 1920},
-        {"helix": 1, "forward": false, "start": 1910, "end": 1920}
-      ]
-    },
-    {
-      "name": "staple193",
-      "color": "#007200",
-      "sequence": "AAACCGTCTAAGAACCGCCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1920, "end": 1930},
-        {"helix": 1, "forward": false, "start": 1920, "end": 1930}
-      ]
-    },
-    {
-      "name": "staple194",
-      "color": "#cc0000",
-      "sequence": "TCAGGGCGATCGCCACCCTC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1930, "end": 1940},
-        {"helix": 1, "forward": false, "start": 1930, "end": 1940}
-      ]
-    },
-    {
-      "name": "staple195",
-      "color": "#f7931e",
-      "sequence": "GGCCCACTACCCCTCAGAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1940, "end": 1950},
-        {"helix": 1, "forward": false, "start": 1940, "end": 1950}
-      ]
-    },
-    {
-      "name": "staple196",
-      "color": "#f74308",
-      "sequence": "GTGAACCATCGGAACCGCCT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1950, "end": 1960},
-        {"helix": 1, "forward": false, "start": 1950, "end": 1960}
-      ]
-    },
-    {
-      "name": "staple197",
-      "color": "#57bb00",
-      "sequence": "ACCCAAATCAAGCCACCACC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1960, "end": 1970},
-        {"helix": 1, "forward": false, "start": 1960, "end": 1970}
-      ]
-    },
-    {
-      "name": "staple198",
-      "color": "#888888",
-      "sequence": "AGTTTTTTGGCCGGAACCAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1970, "end": 1980},
-        {"helix": 1, "forward": false, "start": 1970, "end": 1980}
-      ]
-    },
-    {
-      "name": "staple199",
-      "color": "#32b86c",
-      "sequence": "GGTCGAGGTGATCAAAATCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1980, "end": 1990},
-        {"helix": 1, "forward": false, "start": 1980, "end": 1990}
-      ]
-    },
-    {
-      "name": "staple200",
-      "color": "#333333",
-      "sequence": "CCGTAAAGCATCTTTTCATA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H1"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 1990, "end": 2000},
-        {"helix": 1, "forward": false, "start": 1990, "end": 2000}
-      ]
-    },
-    {
-      "name": "staple201",
-      "color": "#320096",
-      "sequence": "CTAAATCGGAGCGTTTGCCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2000, "end": 2010},
-        {"helix": 1, "forward": false, "start": 2000, "end": 2010}
-      ]
-    },
-    {
-      "name": "staple202",
-      "color": "#03b6a2",
-      "sequence": "ACCCTAAAGGCCCCTTATTA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2010, "end": 2020},
-        {"helix": 1, "forward": false, "start": 2010, "end": 2020}
-      ]
-    },
-    {
-      "name": "staple203",
-      "color": "#7300de",
-      "sequence": "GAGCCCCCGACGGTCATAGC",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2020, "end": 2030},
-        {"helix": 1, "forward": false, "start": 2020, "end": 2030}
-      ]
-    },
-    {
-      "name": "staple204",
-      "color": "#aaaa00",
-      "sequence": "TTTAGAGCTTTCGGCATTTT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2030, "end": 2040},
-        {"helix": 1, "forward": false, "start": 2030, "end": 2040}
-      ]
-    },
-    {
-      "name": "staple205",
-      "color": "#b8056c",
-      "sequence": "GACGGGGAAACGCGTTTTCA",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2040, "end": 2050},
-        {"helix": 1, "forward": false, "start": 2040, "end": 2050}
-      ]
-    },
-    {
-      "name": "staple206",
-      "color": "#007200",
-      "sequence": "GCCGGCGAACCAGACTGTAG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2050, "end": 2060},
-        {"helix": 1, "forward": false, "start": 2050, "end": 2060}
-      ]
-    },
-    {
-      "name": "staple207",
-      "color": "#cc0000",
-      "sequence": "GTGGCGAGAACCTTTAGCGT",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2060, "end": 2070},
-        {"helix": 1, "forward": false, "start": 2060, "end": 2070}
-      ]
-    },
-    {
-      "name": "staple208",
-      "color": "#f7931e",
-      "sequence": "AGGAAGGGAAATCAAGTTTG",
-      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H2"},
-      "domains": [
-        {"helix": 0, "forward": true, "start": 2070, "end": 2080},
-        {"helix": 1, "forward": false, "start": 2070, "end": 2080}
-      ]
-    },
-    {
-      "color": "#0066cc",
-      "sequence": "TTCCCTTCCTTTCTCGCCACGTTCGCCGGCTTTCCCCGTCAAGCTCTAAATCGGGGGCTCCCTTTAGGGTTCCGATTTAGTGCTTTACGGCACCTCGACCCCAAAAAACTTGATTTGGGTGATGGTTCACGTAGTGGGCCATCGCCCTGATAGACGGTTTTTCGCCCTTTGACGTTGGAGTCCACGTTCTTTAATAGTGGACTCTTGTTCCAAACTGGAACAACACTCAACCCTATCTCGGGCTATTCTTTTGATTTATAAGGGATTTTGCCGATTTCGGAACCACCATCAAACAGGATTTTCGCCTGCTGGGGCAAACCAGCGTGGACCGCTTGCTGCAACTCTCTCAGGGCCAGGCGGTGAAGGGCAATCAGCTGTTGCCCGTCTCACTGGTGAAAAGAAAAACCACCCTGGCGCCCAATACGCAAACCGCCTCTCCCCGCGCGTTGGCCGATTCATTAATGCAGCTGGCACGACAGGTTTCCCGACTGGAAAGCGGGCAGTGAGCGCAACGCAATTAATGTGAGTTAGCTCACTCATTAGGCACCCCAGGCTTTACACTTTATGCTTCCGGCTCGTATGTTGTGTGGAATTGTGAGCGGATAACAATTTCACACAGGAAACAGCTATGACCATGATTACGAATTCGAGCTCGGTACCCGGGGATCCTCTAGAGTCGACCTGCAGGCATGCAAGCTTGGCACTGGCCGTCGTTTTACAACGTCGTGACTGGGAAAACCCTGGCGTTACCCAACTTAATCGCCTTGCAGCACATCCCCCTTTCGCCAGCTGGCGTAATAGCGAAGAGGCCCGCACCGATCGCCCTTCCCAACAGTTGCGCAGCCTGAATGGCGAATGGCGCTTTGCCTGGTTTCCGGCACCAGAAGCGGTGCCGGAAAGCTGGCTGGAGTGCGATCTTCCTGAGGCCGATACTGTCGTCGTCCCCTCAAACTGGCAGATGCACGGTTACGATGCGCCCATCTACACCAACGTGACCTATCCCATTACGGTCAATCCGCCGTTTGTTCCCACGGAGAATCCGACGGGTTGTTACTCGCTCACATTTAATGTTGATGAAAGCTGGCTACAGGAAGGCCAGACGCGAATTATTTTTGATGGCGTTCCTATTGGTTAAAAAATGAGCTGATTTAACAAAAATTTAATGCGAATTTTAACAAAATATTAACGTTTACAATTTAAATATTTGCTTATACAATCTTCCTGTTTTTGGGGCTTTTCTGATTATCAACCGGGGTACATATGATTGACATGCTAGTTTTACGATTACCGTTCATCGATTCTCTTGTTTGCTCCAGACTCTCAGGCAATGACCTGATAGCCTTTGTAGATCTCTCAAAAATAGCTACCCTCTCCGGCATTAATTTATCAGCTAGAACGGTTGAATATCATATTGATGGTGATTTGACTGTCTCCGGCCTTTCTCACCCTTTTGAATCTTTACCTACACATTACTCAGGCATTGCATTTAAAATATATGAGGGTTCTAAAAATTTTTATCCTTGCGTTGAAATAAAGGCTTCTCCCGCAAAAGTATTACAGGGTCATAATGTTTTTGGTACAACCGATTTAGCTTTATGCTCTGAGGCTTTATTGCTTAATTTTGCTAATTCTTTGCCTTGCCTGTATGATTTATTGGATGTTAATGCTACTACTATTAGTAGAATTGATGCCACCTTTTCAGCTCGCGCCCCAAATGAAAATATAGCTAAACAGGTTATTGACCATTTGCGAAATGTATCTAATGGTCAAACTAAATCTACTCGTTCGCAGAATTGGGAATCAACTGTTATATGGAATGAAACTTCCAGACACCGTACTTTAGTTGCATATTTAAAACATGTTGAGCTACAGCATTATATTCAGCAATTAAGCTCTAAGCCATCCGCAAAAATGACCTCTTATCAAAAGGAGCAATTAAAGGTACTCTCTAATCCTGACCTGTTGGAGTTTGCTTCCGGTCTGGTTCGCTTTGAAGCTCGAATTAAAACGCGATATTTGAAGTCTTTCGGGCTTCCTCTTAATCTTTTTGATGCAATCCGCTTTGCTTCTGACTATAATAGTCAGGGTAAAGACCTGATTTTTGATTTATGGTCATTCTCGTTTTCTGAACTGTTTAAAGCATTTGAGGGGGATTCAATGAATATTTATGACGATTCCGCAGTATTGGACGCTATCCAGTCTAAACATTTTACTATTACCCCCTCTGGCAAAACTTCTTTTGCAAAAGCCTCTCGCTATTTTGGTTTTTATCGTCGTCTGGTAAACGAGGGTTATGATAGTGTTGCTCTTACTATGCCTCGTAATTCCTTTTGGCGTTATGTATCTGCATTAGTTGAATGTGGTATTCCTAAATCTCAACTGATGAATCTTTCTACCTGTAATAATGTTGTTCCGTTAGTTCGTTTTATTAACGTAGATTTTTCTTCCCAACGTCCTGACTGGTATAATGAGCCAGTTCTTAAAATCGCATAAGGTAATTCACAATGATTAAAGTTGAAATTAAACCATCTCAAGCCCAATTTACTACTCGTTCTGGTGTTTCTCGTCAGGGCAAGCCTTATTCACTGAATGAGCAGCTTTGTTACGTTGATTTGGGTAATGAATATCCGGTTCTTGTCAAGATTACTCTTGATGAAGGTCAGCCAGCCTATGCGCCTGGTCTGTACACCGTTCATCTGTCCTCTTTCAAAGTTGGTCAGTTCGGTTCCCTTATGATTGACCGTCTGCGCCTCGTTCCGGCTAAGTAACATGGAGCAGGTCGCGGATTTCGACACAATTTATCAGGCGATGATACAAATCTCCGTTGTACTTTGTTTCGCGCTTGGTATAATCGCTGGGGGTCAAAGATGAGTGTTTTAGTGTATTCTTTTGCCTCTTTCGTTTTAGGTTGGTGCCTTCGTAGTGGCATTACGTATTTTACCCGTTTAATGGAAACTTCCTCATGAAAAAGTCTTTAGTCCTCAAAGCCTCTGTAGCCGTTGCTACCCTCGTTCCGATGCTGTCTTTCGCTGCTGAGGGTGACGATCCCGCAAAAGCGGCCTTTAACTCCCTGCAAGCCTCAGCGACCGAATATATCGGTTATGCGTGGGCGATGGTTGTTGTCATTGTCGGCGCAACTATCGGTATCAAGCTGTTTAAGAAATTCACCTCGAAAGCAAGCTGATAAACCGATACAATTAAAGGCTCCTTTTGGAGCCTTTTTTTTGGAGATTTTCAACGTGAAAAAATTATTATTCGCAATTCCTTTAGTTGTTCCTTTCTATTCTCACTCCGCTGAAACTGTTGAAAGTTGTTTAGCAAAATCCCATACAGAAAATTCATTTACTAACGTCTGGAAAGACGACAAAACTTTAGATCGTTACGCTAACTATGAGGGCTGTCTGTGGAATGCTACAGGCGTTGTAGTTTGTACTGGTGACGAAACTCAGTGTTACGGTACATGGGTTCCTATTGGGCTTGCTATCCCTGAAAATGAGGGTGGTGGCTCTGAGGGTGGCGGTTCTGAGGGTGGCGGTTCTGAGGGTGGCGGTACTAAACCTCCTGAGTACGGTGATACACCTATTCCGGGCTATACTTATATCAACCCTCTCGACGGCACTTATCCGCCTGGTACTGAGCAAAACCCCGCTAATCCTAATCCTTCTCTTGAGGAGTCTCAGCCTCTTAATACTTTCATGTTTCAGAATAATAGGTTCCGAAATAGGCAGGGGGCATTAACTGTTTATACGGGCACTGTTACTCAAGGCACTGACCCCGTTAAAACTTATTACCAGTACACTCCTGTATCATCAAAAGCCATGTATGACGCTTACTGGAACGGTAAATTCAGAGACTGCGCTTTCCATTCTGGCTTTAATGAGGATTTATTTGTTTGTGAATATCAAGGCCAATCGTCTGACCTGCCTCAACCTCCTGTCAATGCTGGCGGCGGCTCTGGTGGTGGTTCTGGTGGCGGCTCTGAGGGTGGTGGCTCTGAGGGTGGCGGTTCTGAGGGTGGCGGCTCTGAGGGAGGCGGTTCCGGTGGTGGCTCTGGTTCCGGTGATTTTGATTATGAAAAGATGGCAAACGCTAATAAGGGGGCTATGACCGAAAATGCCGATGAAAACGCGCTACAGTCTGACGCTAAAGGCAAACTTGAT",
-      "domains": [
-        {"helix": 0, "forward": false, "start": 0, "end": 2080},
-        {"helix": 1, "forward": true, "start": 0, "end": 2080}
-      ],
-      "is_scaffold": true
-    }
-  ]
+{
+  "version": "0.18.1",
+  "grid": "square",
+  "helices": [
+    {"grid_position": [0, 0]},
+    {"grid_position": [0, 1]}
+  ],
+  "strands": [
+    {
+      "name": "staple1",
+      "color": "#f74308",
+      "sequence": "TATTATAGTCTTACCCTGAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 0, "end": 10},
+        {"helix": 1, "forward": false, "start": 0, "end": 10}
+      ]
+    },
+    {
+      "name": "staple2",
+      "color": "#57bb00",
+      "sequence": "AGAAGCAAAGAATCAGGTCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 10, "end": 20},
+        {"helix": 1, "forward": false, "start": 10, "end": 20}
+      ]
+    },
+    {
+      "name": "staple3",
+      "color": "#888888",
+      "sequence": "CGGATTGCATATAAATCAAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 20, "end": 30},
+        {"helix": 1, "forward": false, "start": 20, "end": 30}
+      ]
+    },
+    {
+      "name": "staple4",
+      "color": "#32b86c",
+      "sequence": "CAAAAAGATTGAGAATGACC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 30, "end": 40},
+        {"helix": 1, "forward": false, "start": 30, "end": 40}
+      ]
+    },
+    {
+      "name": "staple5",
+      "color": "#333333",
+      "sequence": "AAGAGGAAGCTTCAGAAAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 40, "end": 50},
+        {"helix": 1, "forward": false, "start": 40, "end": 50}
+      ]
+    },
+    {
+      "name": "staple6",
+      "color": "#320096",
+      "sequence": "CCGAAAGACTCTTTAAACAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 50, "end": 60},
+        {"helix": 1, "forward": false, "start": 50, "end": 60}
+      ]
+    },
+    {
+      "name": "staple7",
+      "color": "#03b6a2",
+      "sequence": "TCAAATATCGCCCTCAAATG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 60, "end": 70},
+        {"helix": 1, "forward": false, "start": 60, "end": 70}
+      ]
+    },
+    {
+      "name": "staple8",
+      "color": "#7300de",
+      "sequence": "CGTTTTAATTCATTGAATCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 70, "end": 80},
+        {"helix": 1, "forward": false, "start": 70, "end": 80}
+      ]
+    },
+    {
+      "name": "staple9",
+      "color": "#aaaa00",
+      "sequence": "CGAGCTTCAACATAAATATT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 80, "end": 90},
+        {"helix": 1, "forward": false, "start": 80, "end": 90}
+      ]
+    },
+    {
+      "name": "staple10",
+      "color": "#b8056c",
+      "sequence": "AGCGAACCAGGCGGAATCGT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 90, "end": 100},
+        {"helix": 1, "forward": false, "start": 90, "end": 100}
+      ]
+    },
+    {
+      "name": "staple11",
+      "color": "#007200",
+      "sequence": "ACCGGAAGCAGTCCAATACT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 100, "end": 110},
+        {"helix": 1, "forward": false, "start": 100, "end": 110}
+      ]
+    },
+    {
+      "name": "staple12",
+      "color": "#cc0000",
+      "sequence": "AACTCCAACAACTGGATAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 110, "end": 120},
+        {"helix": 1, "forward": false, "start": 110, "end": 120}
+      ]
+    },
+    {
+      "name": "staple13",
+      "color": "#f7931e",
+      "sequence": "GGTCAGGATTAAATGTTTAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 120, "end": 130},
+        {"helix": 1, "forward": false, "start": 120, "end": 130}
+      ]
+    },
+    {
+      "name": "staple14",
+      "color": "#f74308",
+      "sequence": "AGAGAGTACCGGTAATAGTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 130, "end": 140},
+        {"helix": 1, "forward": false, "start": 130, "end": 140}
+      ]
+    },
+    {
+      "name": "staple15",
+      "color": "#57bb00",
+      "sequence": "TTTAATTGCTTGCCAGAGGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 140, "end": 150},
+        {"helix": 1, "forward": false, "start": 140, "end": 150}
+      ]
+    },
+    {
+      "name": "staple16",
+      "color": "#888888",
+      "sequence": "CCTTTTGATAAAAGAAGTTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 150, "end": 160},
+        {"helix": 1, "forward": false, "start": 150, "end": 160}
+      ]
+    },
+    {
+      "name": "staple17",
+      "color": "#32b86c",
+      "sequence": "AGAGGTCATTGGCTTTTGCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 160, "end": 170},
+        {"helix": 1, "forward": false, "start": 160, "end": 170}
+      ]
+    },
+    {
+      "name": "staple18",
+      "color": "#333333",
+      "sequence": "TTTGCGGATGAATAGCGAGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 170, "end": 180},
+        {"helix": 1, "forward": false, "start": 170, "end": 180}
+      ]
+    },
+    {
+      "name": "staple19",
+      "color": "#320096",
+      "sequence": "GCTTAGAGCTTAAAAACCAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 180, "end": 190},
+        {"helix": 1, "forward": false, "start": 180, "end": 190}
+      ]
+    },
+    {
+      "name": "staple20",
+      "color": "#03b6a2",
+      "sequence": "TAATTGCTGACAGACGACGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 190, "end": 200},
+        {"helix": 1, "forward": false, "start": 190, "end": 200}
+      ]
+    },
+    {
+      "name": "staple21",
+      "color": "#7300de",
+      "sequence": "ATATAATGCTCCTCGTTTAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 200, "end": 210},
+        {"helix": 1, "forward": false, "start": 200, "end": 210}
+      ]
+    },
+    {
+      "name": "staple22",
+      "color": "#aaaa00",
+      "sequence": "GTAGCTCAACCTATCATAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 210, "end": 220},
+        {"helix": 1, "forward": false, "start": 210, "end": 220}
+      ]
+    },
+    {
+      "name": "staple23",
+      "color": "#b8056c",
+      "sequence": "ATGTTTTAAAAAGAGCAACA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 220, "end": 230},
+        {"helix": 1, "forward": false, "start": 220, "end": 230}
+      ]
+    },
+    {
+      "name": "staple24",
+      "color": "#007200",
+      "sequence": "TATGCAACTAGAGGCATAGT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 230, "end": 240},
+        {"helix": 1, "forward": false, "start": 230, "end": 240}
+      ]
+    },
+    {
+      "name": "staple25",
+      "color": "#cc0000",
+      "sequence": "AAGTACGGTGAAGGAATTAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 240, "end": 250},
+        {"helix": 1, "forward": false, "start": 240, "end": 250}
+      ]
+    },
+    {
+      "name": "staple26",
+      "color": "#f7931e",
+      "sequence": "TCTGGAAGTTATAACGCCAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 250, "end": 260},
+        {"helix": 1, "forward": false, "start": 250, "end": 260}
+      ]
+    },
+    {
+      "name": "staple27",
+      "color": "#f74308",
+      "sequence": "TCATTCCATAATGCAGATAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 260, "end": 270},
+        {"helix": 1, "forward": false, "start": 260, "end": 270}
+      ]
+    },
+    {
+      "name": "staple28",
+      "color": "#57bb00",
+      "sequence": "TAACAGTTGACATTCAACTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 270, "end": 280},
+        {"helix": 1, "forward": false, "start": 270, "end": 280}
+      ]
+    },
+    {
+      "name": "staple29",
+      "color": "#888888",
+      "sequence": "TTCCCAATTCAGGAATACCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 280, "end": 290},
+        {"helix": 1, "forward": false, "start": 280, "end": 290}
+      ]
+    },
+    {
+      "name": "staple30",
+      "color": "#32b86c",
+      "sequence": "TGCGAACGAGGTTGAGATTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 290, "end": 300},
+        {"helix": 1, "forward": false, "start": 290, "end": 300}
+      ]
+    },
+    {
+      "name": "staple31",
+      "color": "#333333",
+      "sequence": "TAGATTTAGTAGATTCATCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 300, "end": 310},
+        {"helix": 1, "forward": false, "start": 300, "end": 310}
+      ]
+    },
+    {
+      "name": "staple32",
+      "color": "#320096",
+      "sequence": "TTGACCATTAACAGGTAGAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 310, "end": 320},
+        {"helix": 1, "forward": false, "start": 310, "end": 320}
+      ]
+    },
+    {
+      "name": "staple33",
+      "color": "#03b6a2",
+      "sequence": "GATACATTTCCAACATTATT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 320, "end": 330},
+        {"helix": 1, "forward": false, "start": 320, "end": 330}
+      ]
+    },
+    {
+      "name": "staple34",
+      "color": "#7300de",
+      "sequence": "GCAAATGGTCACTAACGGAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 330, "end": 340},
+        {"helix": 1, "forward": false, "start": 330, "end": 340}
+      ]
+    },
+    {
+      "name": "staple35",
+      "color": "#aaaa00",
+      "sequence": "AATAACCTGTAATAAAACGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 340, "end": 350},
+        {"helix": 1, "forward": false, "start": 340, "end": 350}
+      ]
+    },
+    {
+      "name": "staple36",
+      "color": "#b8056c",
+      "sequence": "TTAGCTATATAATCTACGTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 350, "end": 360},
+        {"helix": 1, "forward": false, "start": 350, "end": 360}
+      ]
+    },
+    {
+      "name": "staple37",
+      "color": "#007200",
+      "sequence": "TTTCATTTGGTGGGAAGAAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 360, "end": 370},
+        {"helix": 1, "forward": false, "start": 360, "end": 370}
+      ]
+    },
+    {
+      "name": "staple38",
+      "color": "#cc0000",
+      "sequence": "GGCGCGAGCTGTCAGGACGT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 370, "end": 380},
+        {"helix": 1, "forward": false, "start": 370, "end": 380}
+      ]
+    },
+    {
+      "name": "staple39",
+      "color": "#f7931e",
+      "sequence": "GAAAAGGTGGCATTATACCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 380, "end": 390},
+        {"helix": 1, "forward": false, "start": 380, "end": 390}
+      ]
+    },
+    {
+      "name": "staple40",
+      "color": "#f74308",
+      "sequence": "CATCAATTCTAGAACTGGCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 390, "end": 400},
+        {"helix": 1, "forward": false, "start": 390, "end": 400}
+      ]
+    },
+    {
+      "name": "staple41",
+      "color": "#57bb00",
+      "sequence": "ACTAATAGTATGCGATTTTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 400, "end": 410},
+        {"helix": 1, "forward": false, "start": 400, "end": 410}
+      ]
+    },
+    {
+      "name": "staple42",
+      "color": "#888888",
+      "sequence": "GTAGCATTAAAATTACCTTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 410, "end": 420},
+        {"helix": 1, "forward": false, "start": 410, "end": 420}
+      ]
+    },
+    {
+      "name": "staple43",
+      "color": "#32b86c",
+      "sequence": "CATCCAATAAAATCATTGTG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 420, "end": 430},
+        {"helix": 1, "forward": false, "start": 420, "end": 430}
+      ]
+    },
+    {
+      "name": "staple44",
+      "color": "#333333",
+      "sequence": "ATCATACAGGTTTCAACTTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 430, "end": 440},
+        {"helix": 1, "forward": false, "start": 430, "end": 440}
+      ]
+    },
+    {
+      "name": "staple45",
+      "color": "#320096",
+      "sequence": "CAAGGCAAAGGATGGTTTAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 440, "end": 450},
+        {"helix": 1, "forward": false, "start": 440, "end": 450}
+      ]
+    },
+    {
+      "name": "staple46",
+      "color": "#03b6a2",
+      "sequence": "AATTAGCAAATTGGGCTTGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 450, "end": 460},
+        {"helix": 1, "forward": false, "start": 450, "end": 460}
+      ]
+    },
+    {
+      "name": "staple47",
+      "color": "#7300de",
+      "sequence": "ATTAAGCAATGAGTAGTAAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 460, "end": 470},
+        {"helix": 1, "forward": false, "start": 460, "end": 470}
+      ]
+    },
+    {
+      "name": "staple48",
+      "color": "#aaaa00",
+      "sequence": "AAAGCCTCAGACACCAGAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 470, "end": 480},
+        {"helix": 1, "forward": false, "start": 470, "end": 480}
+      ]
+    },
+    {
+      "name": "staple49",
+      "color": "#b8056c",
+      "sequence": "AGCATAAAGCCTGACGAGAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 480, "end": 490},
+        {"helix": 1, "forward": false, "start": 480, "end": 490}
+      ]
+    },
+    {
+      "name": "staple50",
+      "color": "#007200",
+      "sequence": "TAAATCGGTTAAGGCTTGCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 490, "end": 500},
+        {"helix": 1, "forward": false, "start": 490, "end": 500}
+      ]
+    },
+    {
+      "name": "staple51",
+      "color": "#cc0000",
+      "sequence": "GTACCAAAAATTCAGTGAAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 500, "end": 510},
+        {"helix": 1, "forward": false, "start": 500, "end": 510}
+      ]
+    },
+    {
+      "name": "staple52",
+      "color": "#f7931e",
+      "sequence": "CATTATGACCAAGCTGCTCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 510, "end": 520},
+        {"helix": 1, "forward": false, "start": 510, "end": 520}
+      ]
+    },
+    {
+      "name": "staple53",
+      "color": "#f74308",
+      "sequence": "CTGTAATACTCAACGTAACA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 520, "end": 530},
+        {"helix": 1, "forward": false, "start": 520, "end": 530}
+      ]
+    },
+    {
+      "name": "staple54",
+      "color": "#57bb00",
+      "sequence": "TTTGCGGGAGTTACCCAAAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 530, "end": 540},
+        {"helix": 1, "forward": false, "start": 530, "end": 540}
+      ]
+    },
+    {
+      "name": "staple55",
+      "color": "#888888",
+      "sequence": "AAGCCTTTATCGGATATTCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 540, "end": 550},
+        {"helix": 1, "forward": false, "start": 540, "end": 550}
+      ]
+    },
+    {
+      "name": "staple56",
+      "color": "#32b86c",
+      "sequence": "TTCAACGCAATGACAAGAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 550, "end": 560},
+        {"helix": 1, "forward": false, "start": 550, "end": 560}
+      ]
+    },
+    {
+      "name": "staple57",
+      "color": "#333333",
+      "sequence": "GGATAAAAATAGAGTAATCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 560, "end": 570},
+        {"helix": 1, "forward": false, "start": 560, "end": 570}
+      ]
+    },
+    {
+      "name": "staple58",
+      "color": "#320096",
+      "sequence": "TTTTAGAACCACCTTCATCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 570, "end": 580},
+        {"helix": 1, "forward": false, "start": 570, "end": 580}
+      ]
+    },
+    {
+      "name": "staple59",
+      "color": "#03b6a2",
+      "sequence": "CTCATATATTAGGCTGGCTG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 580, "end": 590},
+        {"helix": 1, "forward": false, "start": 580, "end": 590}
+      ]
+    },
+    {
+      "name": "staple60",
+      "color": "#7300de",
+      "sequence": "TTAAATGCAACCAGGCGCAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 590, "end": 600},
+        {"helix": 1, "forward": false, "start": 590, "end": 600}
+      ]
+    },
+    {
+      "name": "staple61",
+      "color": "#aaaa00",
+      "sequence": "TGCCTGAGTAGGTGTACAGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 600, "end": 610},
+        {"helix": 1, "forward": false, "start": 600, "end": 610}
+      ]
+    },
+    {
+      "name": "staple62",
+      "color": "#b8056c",
+      "sequence": "ATGTGTAGGTACAGATGAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 610, "end": 620},
+        {"helix": 1, "forward": false, "start": 610, "end": 620}
+      ]
+    },
+    {
+      "name": "staple63",
+      "color": "#007200",
+      "sequence": "AAAGATTCAATTGAAAGAGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 620, "end": 630},
+        {"helix": 1, "forward": false, "start": 620, "end": 630}
+      ]
+    },
+    {
+      "name": "staple64",
+      "color": "#cc0000",
+      "sequence": "AAGGGTGAGACTGACCAACT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 630, "end": 640},
+        {"helix": 1, "forward": false, "start": 630, "end": 640}
+      ]
+    },
+    {
+      "name": "staple65",
+      "color": "#f7931e",
+      "sequence": "AAGGCCGGAGGGGAACCGAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 640, "end": 650},
+        {"helix": 1, "forward": false, "start": 640, "end": 650}
+      ]
+    },
+    {
+      "name": "staple66",
+      "color": "#f74308",
+      "sequence": "ACAGTCAAATTCAATCATAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 650, "end": 660},
+        {"helix": 1, "forward": false, "start": 650, "end": 660}
+      ]
+    },
+    {
+      "name": "staple67",
+      "color": "#57bb00",
+      "sequence": "CACCATCAATGCGCAGACGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 660, "end": 670},
+        {"helix": 1, "forward": false, "start": 660, "end": 670}
+      ]
+    },
+    {
+      "name": "staple68",
+      "color": "#888888",
+      "sequence": "ATGATATTCACCGGAACGAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 670, "end": 680},
+        {"helix": 1, "forward": false, "start": 670, "end": 680}
+      ]
+    },
+    {
+      "name": "staple69",
+      "color": "#32b86c",
+      "sequence": "ACCGTTCTAGTGTTACTTAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 680, "end": 690},
+        {"helix": 1, "forward": false, "start": 680, "end": 690}
+      ]
+    },
+    {
+      "name": "staple70",
+      "color": "#333333",
+      "sequence": "CTGATAAATTACCTGCTCCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 690, "end": 700},
+        {"helix": 1, "forward": false, "start": 690, "end": 700}
+      ]
+    },
+    {
+      "name": "staple71",
+      "color": "#320096",
+      "sequence": "AATGCCGGAGGAAATCCGCG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 700, "end": 710},
+        {"helix": 1, "forward": false, "start": 700, "end": 710}
+      ]
+    },
+    {
+      "name": "staple72",
+      "color": "#03b6a2",
+      "sequence": "AGGGTAGCTAAAATTGTGTC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 710, "end": 720},
+        {"helix": 1, "forward": false, "start": 710, "end": 720}
+      ]
+    },
+    {
+      "name": "staple73",
+      "color": "#7300de",
+      "sequence": "TTTTTGAGAGATCGCCTGAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 720, "end": 730},
+        {"helix": 1, "forward": false, "start": 720, "end": 730}
+      ]
+    },
+    {
+      "name": "staple74",
+      "color": "#aaaa00",
+      "sequence": "ATCTACAAAGGATTTGTATC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 730, "end": 740},
+        {"helix": 1, "forward": false, "start": 730, "end": 740}
+      ]
+    },
+    {
+      "name": "staple75",
+      "color": "#b8056c",
+      "sequence": "GCTATCAGGTGTACAACGGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 740, "end": 750},
+        {"helix": 1, "forward": false, "start": 740, "end": 750}
+      ]
+    },
+    {
+      "name": "staple76",
+      "color": "#007200",
+      "sequence": "CATTGCCTGAGCGAAACAAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 750, "end": 760},
+        {"helix": 1, "forward": false, "start": 750, "end": 760}
+      ]
+    },
+    {
+      "name": "staple77",
+      "color": "#cc0000",
+      "sequence": "GAGTCTGGAGTATACCAAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 760, "end": 770},
+        {"helix": 1, "forward": false, "start": 760, "end": 770}
+      ]
+    },
+    {
+      "name": "staple78",
+      "color": "#f7931e",
+      "sequence": "CAAACAAGAGCCCCAGCGAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 770, "end": 780},
+        {"helix": 1, "forward": false, "start": 770, "end": 780}
+      ]
+    },
+    {
+      "name": "staple79",
+      "color": "#f74308",
+      "sequence": "AATCGATGAACATCTTTGAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 780, "end": 790},
+        {"helix": 1, "forward": false, "start": 780, "end": 790}
+      ]
+    },
+    {
+      "name": "staple80",
+      "color": "#57bb00",
+      "sequence": "CGGTAATCGTCTAAAACACT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 790, "end": 800},
+        {"helix": 1, "forward": false, "start": 790, "end": 800}
+      ]
+    },
+    {
+      "name": "staple81",
+      "color": "#888888",
+      "sequence": "AAAACTAGCAAAAGAATACA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 800, "end": 810},
+        {"helix": 1, "forward": false, "start": 800, "end": 810}
+      ]
+    },
+    {
+      "name": "staple82",
+      "color": "#32b86c",
+      "sequence": "TGTCAATCATGAAAGAGGCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 810, "end": 820},
+        {"helix": 1, "forward": false, "start": 810, "end": 820}
+      ]
+    },
+    {
+      "name": "staple83",
+      "color": "#333333",
+      "sequence": "ATGTACCCCGAACCTAAAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 820, "end": 830},
+        {"helix": 1, "forward": false, "start": 820, "end": 830}
+      ]
+    },
+    {
+      "name": "staple84",
+      "color": "#320096",
+      "sequence": "GTTGATAATCCGAAGGCACC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 830, "end": 840},
+        {"helix": 1, "forward": false, "start": 830, "end": 840}
+      ]
+    },
+    {
+      "name": "staple85",
+      "color": "#03b6a2",
+      "sequence": "AGAAAAGCCCAATGCCACTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 840, "end": 850},
+        {"helix": 1, "forward": false, "start": 840, "end": 850}
+      ]
+    },
+    {
+      "name": "staple86",
+      "color": "#7300de",
+      "sequence": "CAAAAACAGGTAAAATACGT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 850, "end": 860},
+        {"helix": 1, "forward": false, "start": 850, "end": 860}
+      ]
+    },
+    {
+      "name": "staple87",
+      "color": "#aaaa00",
+      "sequence": "AAGATTGTATATTAAACGGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 860, "end": 870},
+        {"helix": 1, "forward": false, "start": 860, "end": 870}
+      ]
+    },
+    {
+      "name": "staple88",
+      "color": "#b8056c",
+      "sequence": "AAGCAAATATGGAAGTTTCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 870, "end": 880},
+        {"helix": 1, "forward": false, "start": 870, "end": 880}
+      ]
+    },
+    {
+      "name": "staple89",
+      "color": "#007200",
+      "sequence": "TTAAATTGTATTTTTCATGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "A12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 880, "end": 890},
+        {"helix": 1, "forward": false, "start": 880, "end": 890}
+      ]
+    },
+    {
+      "name": "staple90",
+      "color": "#cc0000",
+      "sequence": "AACGTTAATAGACTAAAGAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "B12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 890, "end": 900},
+        {"helix": 1, "forward": false, "start": 890, "end": 900}
+      ]
+    },
+    {
+      "name": "staple91",
+      "color": "#f7931e",
+      "sequence": "TTTTGTTAAAAGGCTTTGAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "C12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 900, "end": 910},
+        {"helix": 1, "forward": false, "start": 900, "end": 910}
+      ]
+    },
+    {
+      "name": "staple92",
+      "color": "#f74308",
+      "sequence": "ATTCGCATTAACGGCTACAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "D12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 910, "end": 920},
+        {"helix": 1, "forward": false, "start": 910, "end": 920}
+      ]
+    },
+    {
+      "name": "staple93",
+      "color": "#57bb00",
+      "sequence": "AATTTTTGTTGAGGGTAGCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "E12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 920, "end": 930},
+        {"helix": 1, "forward": false, "start": 920, "end": 930}
+      ]
+    },
+    {
+      "name": "staple94",
+      "color": "#888888",
+      "sequence": "AAATCAGCTCGCATCGGAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "F12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 930, "end": 940},
+        {"helix": 1, "forward": false, "start": 930, "end": 940}
+      ]
+    },
+    {
+      "name": "staple95",
+      "color": "#32b86c",
+      "sequence": "ATTTTTTAACGCGAAAGACA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "G12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 940, "end": 950},
+        {"helix": 1, "forward": false, "start": 940, "end": 950}
+      ]
+    },
+    {
+      "name": "staple96",
+      "color": "#333333",
+      "sequence": "CAATAGGAACACCCTCAGCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate1", "well": "H12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 950, "end": 960},
+        {"helix": 1, "forward": false, "start": 950, "end": 960}
+      ]
+    },
+    {
+      "name": "staple97",
+      "color": "#320096",
+      "sequence": "GCCATCAAAACGGGATCGTC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 960, "end": 970},
+        {"helix": 1, "forward": false, "start": 960, "end": 970}
+      ]
+    },
+    {
+      "name": "staple98",
+      "color": "#03b6a2",
+      "sequence": "ATAATTCGCGGCCGCTTTTG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 970, "end": 980},
+        {"helix": 1, "forward": false, "start": 970, "end": 980}
+      ]
+    },
+    {
+      "name": "staple99",
+      "color": "#7300de",
+      "sequence": "TCTGGCCTTCGGAGTTAAAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 980, "end": 990},
+        {"helix": 1, "forward": false, "start": 980, "end": 990}
+      ]
+    },
+    {
+      "name": "staple100",
+      "color": "#aaaa00",
+      "sequence": "CTGTAGCCAGAGGCTTGCAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 990, "end": 1000},
+        {"helix": 1, "forward": false, "start": 990, "end": 1000}
+      ]
+    },
+    {
+      "name": "staple101",
+      "color": "#b8056c",
+      "sequence": "CTTTCATCAATCGGTCGCTG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1000, "end": 1010},
+        {"helix": 1, "forward": false, "start": 1000, "end": 1010}
+      ]
+    },
+    {
+      "name": "staple102",
+      "color": "#007200",
+      "sequence": "CATTAAATGTACCGATATAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1010, "end": 1020},
+        {"helix": 1, "forward": false, "start": 1010, "end": 1020}
+      ]
+    },
+    {
+      "name": "staple103",
+      "color": "#cc0000",
+      "sequence": "GAGCGAGTAACCCACGCATA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1020, "end": 1030},
+        {"helix": 1, "forward": false, "start": 1020, "end": 1030}
+      ]
+    },
+    {
+      "name": "staple104",
+      "color": "#f7931e",
+      "sequence": "CAACCCGTCGACAACCATCG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1030, "end": 1040},
+        {"helix": 1, "forward": false, "start": 1030, "end": 1040}
+      ]
+    },
+    {
+      "name": "staple105",
+      "color": "#f74308",
+      "sequence": "GATTCTCCGTGACAATGACA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1040, "end": 1050},
+        {"helix": 1, "forward": false, "start": 1040, "end": 1050}
+      ]
+    },
+    {
+      "name": "staple106",
+      "color": "#57bb00",
+      "sequence": "GGGAACAAACTAGTTGCGCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1050, "end": 1060},
+        {"helix": 1, "forward": false, "start": 1050, "end": 1060}
+      ]
+    },
+    {
+      "name": "staple107",
+      "color": "#888888",
+      "sequence": "GGCGGATTGATTGATACCGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1060, "end": 1070},
+        {"helix": 1, "forward": false, "start": 1060, "end": 1070}
+      ]
+    },
+    {
+      "name": "staple108",
+      "color": "#32b86c",
+      "sequence": "CCGTAATGGGCTTAAACAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1070, "end": 1080},
+        {"helix": 1, "forward": false, "start": 1070, "end": 1080}
+      ]
+    },
+    {
+      "name": "staple109",
+      "color": "#333333",
+      "sequence": "ATAGGTCACGAGGTGAATTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1080, "end": 1090},
+        {"helix": 1, "forward": false, "start": 1080, "end": 1090}
+      ]
+    },
+    {
+      "name": "staple110",
+      "color": "#320096",
+      "sequence": "TTGGTGTAGACTTGCTTTCG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1090, "end": 1100},
+        {"helix": 1, "forward": false, "start": 1090, "end": 1100}
+      ]
+    },
+    {
+      "name": "staple111",
+      "color": "#03b6a2",
+      "sequence": "TGGGCGCATCGGTTTATCAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1100, "end": 1110},
+        {"helix": 1, "forward": false, "start": 1100, "end": 1110}
+      ]
+    },
+    {
+      "name": "staple112",
+      "color": "#7300de",
+      "sequence": "GTAACCGTGCTAATTGTATC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1110, "end": 1120},
+        {"helix": 1, "forward": false, "start": 1110, "end": 1120}
+      ]
+    },
+    {
+      "name": "staple113",
+      "color": "#aaaa00",
+      "sequence": "ATCTGCCAGTAAGGAGCCTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1120, "end": 1130},
+        {"helix": 1, "forward": false, "start": 1120, "end": 1130}
+      ]
+    },
+    {
+      "name": "staple114",
+      "color": "#b8056c",
+      "sequence": "TTGAGGGGACAAGGCTCCAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1130, "end": 1140},
+        {"helix": 1, "forward": false, "start": 1130, "end": 1140}
+      ]
+    },
+    {
+      "name": "staple115",
+      "color": "#007200",
+      "sequence": "GACGACAGTACTCCAAAAAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1140, "end": 1150},
+        {"helix": 1, "forward": false, "start": 1140, "end": 1150}
+      ]
+    },
+    {
+      "name": "staple116",
+      "color": "#cc0000",
+      "sequence": "TCGGCCTCAGCGTTGAAAAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1150, "end": 1160},
+        {"helix": 1, "forward": false, "start": 1150, "end": 1160}
+      ]
+    },
+    {
+      "name": "staple117",
+      "color": "#f7931e",
+      "sequence": "GAAGATCGCAAATTTTTTCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1160, "end": 1170},
+        {"helix": 1, "forward": false, "start": 1160, "end": 1170}
+      ]
+    },
+    {
+      "name": "staple118",
+      "color": "#f74308",
+      "sequence": "CTCCAGCCAGTGCGAATAAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1170, "end": 1180},
+        {"helix": 1, "forward": false, "start": 1170, "end": 1180}
+      ]
+    },
+    {
+      "name": "staple119",
+      "color": "#57bb00",
+      "sequence": "CTTTCCGGCACTAAAGGAAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1180, "end": 1190},
+        {"helix": 1, "forward": false, "start": 1180, "end": 1190}
+      ]
+    },
+    {
+      "name": "staple120",
+      "color": "#888888",
+      "sequence": "CCGCTTCTGGAAAGGAACAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H3"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1190, "end": 1200},
+        {"helix": 1, "forward": false, "start": 1190, "end": 1200}
+      ]
+    },
+    {
+      "name": "staple121",
+      "color": "#32b86c",
+      "sequence": "TGCCGGAAACGTGAGAATAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1200, "end": 1210},
+        {"helix": 1, "forward": false, "start": 1200, "end": 1210}
+      ]
+    },
+    {
+      "name": "staple122",
+      "color": "#333333",
+      "sequence": "CAGGCAAAGCTTTCAGCGGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1210, "end": 1220},
+        {"helix": 1, "forward": false, "start": 1210, "end": 1220}
+      ]
+    },
+    {
+      "name": "staple123",
+      "color": "#320096",
+      "sequence": "GCCATTCGCCCTTTCAACAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1220, "end": 1230},
+        {"helix": 1, "forward": false, "start": 1220, "end": 1230}
+      ]
+    },
+    {
+      "name": "staple124",
+      "color": "#03b6a2",
+      "sequence": "ATTCAGGCTGTGCTAAACAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1230, "end": 1240},
+        {"helix": 1, "forward": false, "start": 1230, "end": 1240}
+      ]
+    },
+    {
+      "name": "staple125",
+      "color": "#7300de",
+      "sequence": "CGCAACTGTTTATGGGATTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1240, "end": 1250},
+        {"helix": 1, "forward": false, "start": 1240, "end": 1250}
+      ]
+    },
+    {
+      "name": "staple126",
+      "color": "#aaaa00",
+      "sequence": "GGGAAGGGCGGAATTTTCTG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1250, "end": 1260},
+        {"helix": 1, "forward": false, "start": 1250, "end": 1260}
+      ]
+    },
+    {
+      "name": "staple127",
+      "color": "#b8056c",
+      "sequence": "ATCGGTGCGGGTTAGTAAAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1260, "end": 1270},
+        {"helix": 1, "forward": false, "start": 1260, "end": 1270}
+      ]
+    },
+    {
+      "name": "staple128",
+      "color": "#007200",
+      "sequence": "GCCTCTTCGCCTTTCCAGAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H4"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1270, "end": 1280},
+        {"helix": 1, "forward": false, "start": 1270, "end": 1280}
+      ]
+    },
+    {
+      "name": "staple129",
+      "color": "#cc0000",
+      "sequence": "TATTACGCCAGTTTTGTCGT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1280, "end": 1290},
+        {"helix": 1, "forward": false, "start": 1280, "end": 1290}
+      ]
+    },
+    {
+      "name": "staple130",
+      "color": "#f7931e",
+      "sequence": "GCTGGCGAAAACGATCTAAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1290, "end": 1300},
+        {"helix": 1, "forward": false, "start": 1290, "end": 1300}
+      ]
+    },
+    {
+      "name": "staple131",
+      "color": "#f74308",
+      "sequence": "GGGGGATGTGAGTTAGCGTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1300, "end": 1310},
+        {"helix": 1, "forward": false, "start": 1300, "end": 1310}
+      ]
+    },
+    {
+      "name": "staple132",
+      "color": "#57bb00",
+      "sequence": "CTGCAAGGCGCAGCCCTCAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1310, "end": 1320},
+        {"helix": 1, "forward": false, "start": 1310, "end": 1320}
+      ]
+    },
+    {
+      "name": "staple133",
+      "color": "#888888",
+      "sequence": "ATTAAGTTGGATTCCACAGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1320, "end": 1330},
+        {"helix": 1, "forward": false, "start": 1320, "end": 1330}
+      ]
+    },
+    {
+      "name": "staple134",
+      "color": "#32b86c",
+      "sequence": "GTAACGCCAGCGCCTGTAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1330, "end": 1340},
+        {"helix": 1, "forward": false, "start": 1330, "end": 1340}
+      ]
+    },
+    {
+      "name": "staple135",
+      "color": "#333333",
+      "sequence": "GGTTTTCCCACAAACTACAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1340, "end": 1350},
+        {"helix": 1, "forward": false, "start": 1340, "end": 1350}
+      ]
+    },
+    {
+      "name": "staple136",
+      "color": "#320096",
+      "sequence": "GTCACGACGTGTCACCAGTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H5"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1350, "end": 1360},
+        {"helix": 1, "forward": false, "start": 1350, "end": 1360}
+      ]
+    },
+    {
+      "name": "staple137",
+      "color": "#03b6a2",
+      "sequence": "TGTAAAACGAACTGAGTTTC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1360, "end": 1370},
+        {"helix": 1, "forward": false, "start": 1360, "end": 1370}
+      ]
+    },
+    {
+      "name": "staple138",
+      "color": "#7300de",
+      "sequence": "CGGCCAGTGCGTACCGTAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1370, "end": 1380},
+        {"helix": 1, "forward": false, "start": 1370, "end": 1380}
+      ]
+    },
+    {
+      "name": "staple139",
+      "color": "#aaaa00",
+      "sequence": "CAAGCTTGCAAGGAACCCAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1380, "end": 1390},
+        {"helix": 1, "forward": false, "start": 1380, "end": 1390}
+      ]
+    },
+    {
+      "name": "staple140",
+      "color": "#b8056c",
+      "sequence": "TGCCTGCAGGCAAGCCCAAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1390, "end": 1400},
+        {"helix": 1, "forward": false, "start": 1390, "end": 1400}
+      ]
+    },
+    {
+      "name": "staple141",
+      "color": "#007200",
+      "sequence": "TCGACTCTAGTCAGGGATAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1400, "end": 1410},
+        {"helix": 1, "forward": false, "start": 1400, "end": 1410}
+      ]
+    },
+    {
+      "name": "staple142",
+      "color": "#cc0000",
+      "sequence": "AGGATCCCCGACCCTCATTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1410, "end": 1420},
+        {"helix": 1, "forward": false, "start": 1410, "end": 1420}
+      ]
+    },
+    {
+      "name": "staple143",
+      "color": "#f7931e",
+      "sequence": "GGTACCGAGCCAGAGCCACC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1420, "end": 1430},
+        {"helix": 1, "forward": false, "start": 1420, "end": 1430}
+      ]
+    },
+    {
+      "name": "staple144",
+      "color": "#f74308",
+      "sequence": "TCGAATTCGTCCGCCACCCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H6"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1430, "end": 1440},
+        {"helix": 1, "forward": false, "start": 1430, "end": 1440}
+      ]
+    },
+    {
+      "name": "staple145",
+      "color": "#57bb00",
+      "sequence": "AATCATGGTCACCCTCAGAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1440, "end": 1450},
+        {"helix": 1, "forward": false, "start": 1440, "end": 1450}
+      ]
+    },
+    {
+      "name": "staple146",
+      "color": "#888888",
+      "sequence": "ATAGCTGTTTCAGAACCGCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1450, "end": 1460},
+        {"helix": 1, "forward": false, "start": 1450, "end": 1460}
+      ]
+    },
+    {
+      "name": "staple147",
+      "color": "#32b86c",
+      "sequence": "CCTGTGTGAACCGCCACCCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1460, "end": 1470},
+        {"helix": 1, "forward": false, "start": 1460, "end": 1470}
+      ]
+    },
+    {
+      "name": "staple148",
+      "color": "#333333",
+      "sequence": "ATTGTTATCCAGGTTTAGTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1470, "end": 1480},
+        {"helix": 1, "forward": false, "start": 1470, "end": 1480}
+      ]
+    },
+    {
+      "name": "staple149",
+      "color": "#320096",
+      "sequence": "GCTCACAATTCGTACTCAGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1480, "end": 1490},
+        {"helix": 1, "forward": false, "start": 1480, "end": 1490}
+      ]
+    },
+    {
+      "name": "staple150",
+      "color": "#03b6a2",
+      "sequence": "CCACACAACAGGTGTATCAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1490, "end": 1500},
+        {"helix": 1, "forward": false, "start": 1490, "end": 1500}
+      ]
+    },
+    {
+      "name": "staple151",
+      "color": "#7300de",
+      "sequence": "TACGAGCCGGGCCCGGAATA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1500, "end": 1510},
+        {"helix": 1, "forward": false, "start": 1500, "end": 1510}
+      ]
+    },
+    {
+      "name": "staple152",
+      "color": "#aaaa00",
+      "sequence": "AAGCATAAAGTATAAGTATA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H7"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1510, "end": 1520},
+        {"helix": 1, "forward": false, "start": 1510, "end": 1520}
+      ]
+    },
+    {
+      "name": "staple153",
+      "color": "#b8056c",
+      "sequence": "TGTAAAGCCTAGAGGGTTGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1520, "end": 1530},
+        {"helix": 1, "forward": false, "start": 1520, "end": 1530}
+      ]
+    },
+    {
+      "name": "staple154",
+      "color": "#007200",
+      "sequence": "GGGGTGCCTAAGTGCCGTCG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1530, "end": 1540},
+        {"helix": 1, "forward": false, "start": 1530, "end": 1540}
+      ]
+    },
+    {
+      "name": "staple155",
+      "color": "#cc0000",
+      "sequence": "ATGAGTGAGCCAGGCGGATA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1540, "end": 1550},
+        {"helix": 1, "forward": false, "start": 1540, "end": 1550}
+      ]
+    },
+    {
+      "name": "staple156",
+      "color": "#f7931e",
+      "sequence": "TAACTCACATTGCTCAGTAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1550, "end": 1560},
+        {"helix": 1, "forward": false, "start": 1550, "end": 1560}
+      ]
+    },
+    {
+      "name": "staple157",
+      "color": "#f74308",
+      "sequence": "TAATTGCGTTAGCGGGGTTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1560, "end": 1570},
+        {"helix": 1, "forward": false, "start": 1560, "end": 1570}
+      ]
+    },
+    {
+      "name": "staple158",
+      "color": "#57bb00",
+      "sequence": "GCGCTCACTGGATTAGGATT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1570, "end": 1580},
+        {"helix": 1, "forward": false, "start": 1570, "end": 1580}
+      ]
+    },
+    {
+      "name": "staple159",
+      "color": "#888888",
+      "sequence": "CCCGCTTTCCTCAAGAGAAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1580, "end": 1590},
+        {"helix": 1, "forward": false, "start": 1580, "end": 1590}
+      ]
+    },
+    {
+      "name": "staple160",
+      "color": "#32b86c",
+      "sequence": "AGTCGGGAAACTGAGACTCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H8"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1590, "end": 1600},
+        {"helix": 1, "forward": false, "start": 1590, "end": 1600}
+      ]
+    },
+    {
+      "name": "staple161",
+      "color": "#333333",
+      "sequence": "CCTGTCGTGCTATTAAGAGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1600, "end": 1610},
+        {"helix": 1, "forward": false, "start": 1600, "end": 1610}
+      ]
+    },
+    {
+      "name": "staple162",
+      "color": "#320096",
+      "sequence": "CAGCTGCATTAACATGAAAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1610, "end": 1620},
+        {"helix": 1, "forward": false, "start": 1610, "end": 1620}
+      ]
+    },
+    {
+      "name": "staple163",
+      "color": "#03b6a2",
+      "sequence": "AATGAATCGGATTATTCTGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1620, "end": 1630},
+        {"helix": 1, "forward": false, "start": 1620, "end": 1630}
+      ]
+    },
+    {
+      "name": "staple164",
+      "color": "#7300de",
+      "sequence": "CCAACGCGCGTTCGGAACCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1630, "end": 1640},
+        {"helix": 1, "forward": false, "start": 1630, "end": 1640}
+      ]
+    },
+    {
+      "name": "staple165",
+      "color": "#aaaa00",
+      "sequence": "GGGAGAGGCGCCCTGCCTAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1640, "end": 1650},
+        {"helix": 1, "forward": false, "start": 1640, "end": 1650}
+      ]
+    },
+    {
+      "name": "staple166",
+      "color": "#b8056c",
+      "sequence": "GTTTGCGTATAGTTAATGCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1650, "end": 1660},
+        {"helix": 1, "forward": false, "start": 1650, "end": 1660}
+      ]
+    },
+    {
+      "name": "staple167",
+      "color": "#007200",
+      "sequence": "TGGGCGCCAGCCGTATAAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1660, "end": 1670},
+        {"helix": 1, "forward": false, "start": 1660, "end": 1670}
+      ]
+    },
+    {
+      "name": "staple168",
+      "color": "#cc0000",
+      "sequence": "GGTGGTTTTTGTAACAGTGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H9"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1670, "end": 1680},
+        {"helix": 1, "forward": false, "start": 1670, "end": 1680}
+      ]
+    },
+    {
+      "name": "staple169",
+      "color": "#f7931e",
+      "sequence": "CTTTTCACCAAGTGCCTTGA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1680, "end": 1690},
+        {"helix": 1, "forward": false, "start": 1680, "end": 1690}
+      ]
+    },
+    {
+      "name": "staple170",
+      "color": "#f74308",
+      "sequence": "GTGAGACGGGTAACGGGGTC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1690, "end": 1700},
+        {"helix": 1, "forward": false, "start": 1690, "end": 1700}
+      ]
+    },
+    {
+      "name": "staple171",
+      "color": "#57bb00",
+      "sequence": "CAACAGCTGATAATAAGTTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1700, "end": 1710},
+        {"helix": 1, "forward": false, "start": 1700, "end": 1710}
+      ]
+    },
+    {
+      "name": "staple172",
+      "color": "#888888",
+      "sequence": "TTGCCCTTCAAGTGTACTGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1710, "end": 1720},
+        {"helix": 1, "forward": false, "start": 1710, "end": 1720}
+      ]
+    },
+    {
+      "name": "staple173",
+      "color": "#32b86c",
+      "sequence": "CCGCCTGGCCATGATACAGG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1720, "end": 1730},
+        {"helix": 1, "forward": false, "start": 1720, "end": 1730}
+      ]
+    },
+    {
+      "name": "staple174",
+      "color": "#333333",
+      "sequence": "CTGAGAGAGTATGGCTTTTG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1730, "end": 1740},
+        {"helix": 1, "forward": false, "start": 1730, "end": 1740}
+      ]
+    },
+    {
+      "name": "staple175",
+      "color": "#320096",
+      "sequence": "TGCAGCAAGCAGCGTCATAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1740, "end": 1750},
+        {"helix": 1, "forward": false, "start": 1740, "end": 1750}
+      ]
+    },
+    {
+      "name": "staple176",
+      "color": "#03b6a2",
+      "sequence": "GGTCCACGCTCGTTCCAGTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H10"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1750, "end": 1760},
+        {"helix": 1, "forward": false, "start": 1750, "end": 1760}
+      ]
+    },
+    {
+      "name": "staple177",
+      "color": "#7300de",
+      "sequence": "GGTTTGCCCCCTGAATTTAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1760, "end": 1770},
+        {"helix": 1, "forward": false, "start": 1760, "end": 1770}
+      ]
+    },
+    {
+      "name": "staple178",
+      "color": "#aaaa00",
+      "sequence": "AGCAGGCGAAAGCGCAGTCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1770, "end": 1780},
+        {"helix": 1, "forward": false, "start": 1770, "end": 1780}
+      ]
+    },
+    {
+      "name": "staple179",
+      "color": "#b8056c",
+      "sequence": "AATCCTGTTTCAGAATGGAA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1780, "end": 1790},
+        {"helix": 1, "forward": false, "start": 1780, "end": 1790}
+      ]
+    },
+    {
+      "name": "staple180",
+      "color": "#007200",
+      "sequence": "GATGGTGGTTTCATTAAAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1790, "end": 1800},
+        {"helix": 1, "forward": false, "start": 1790, "end": 1800}
+      ]
+    },
+    {
+      "name": "staple181",
+      "color": "#cc0000",
+      "sequence": "CCGAAATCGGAAATAAATCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1800, "end": 1810},
+        {"helix": 1, "forward": false, "start": 1800, "end": 1810}
+      ]
+    },
+    {
+      "name": "staple182",
+      "color": "#f7931e",
+      "sequence": "CAAAATCCCTATTCACAAAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1810, "end": 1820},
+        {"helix": 1, "forward": false, "start": 1810, "end": 1820}
+      ]
+    },
+    {
+      "name": "staple183",
+      "color": "#f74308",
+      "sequence": "TATAAATCAATGGCCTTGAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1820, "end": 1830},
+        {"helix": 1, "forward": false, "start": 1820, "end": 1830}
+      ]
+    },
+    {
+      "name": "staple184",
+      "color": "#57bb00",
+      "sequence": "AAGAATAGCCGTCAGACGAT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H11"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1830, "end": 1840},
+        {"helix": 1, "forward": false, "start": 1830, "end": 1840}
+      ]
+    },
+    {
+      "name": "staple185",
+      "color": "#888888",
+      "sequence": "CGAGATAGGGGTTGAGGCAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "A12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1840, "end": 1850},
+        {"helix": 1, "forward": false, "start": 1840, "end": 1850}
+      ]
+    },
+    {
+      "name": "staple186",
+      "color": "#32b86c",
+      "sequence": "TTGAGTGTTGTTGACAGGAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "B12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1850, "end": 1860},
+        {"helix": 1, "forward": false, "start": 1850, "end": 1860}
+      ]
+    },
+    {
+      "name": "staple187",
+      "color": "#333333",
+      "sequence": "TTCCAGTTTGGCCGCCAGCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "C12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1860, "end": 1870},
+        {"helix": 1, "forward": false, "start": 1860, "end": 1870}
+      ]
+    },
+    {
+      "name": "staple188",
+      "color": "#320096",
+      "sequence": "GAACAAGAGTCACCAGAGCC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "D12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1870, "end": 1880},
+        {"helix": 1, "forward": false, "start": 1870, "end": 1880}
+      ]
+    },
+    {
+      "name": "staple189",
+      "color": "#03b6a2",
+      "sequence": "CCACTATTAACCAGAACCAC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "E12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1880, "end": 1890},
+        {"helix": 1, "forward": false, "start": 1880, "end": 1890}
+      ]
+    },
+    {
+      "name": "staple190",
+      "color": "#7300de",
+      "sequence": "AGAACGTGGAAGAGCCGCCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "F12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1890, "end": 1900},
+        {"helix": 1, "forward": false, "start": 1890, "end": 1900}
+      ]
+    },
+    {
+      "name": "staple191",
+      "color": "#aaaa00",
+      "sequence": "CTCCAACGTCCACCACCCTC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "G12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1900, "end": 1910},
+        {"helix": 1, "forward": false, "start": 1900, "end": 1910}
+      ]
+    },
+    {
+      "name": "staple192",
+      "color": "#b8056c",
+      "sequence": "AAAGGGCGAACCCTCAGAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate2", "well": "H12"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1910, "end": 1920},
+        {"helix": 1, "forward": false, "start": 1910, "end": 1920}
+      ]
+    },
+    {
+      "name": "staple193",
+      "color": "#007200",
+      "sequence": "AAACCGTCTAAGAACCGCCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1920, "end": 1930},
+        {"helix": 1, "forward": false, "start": 1920, "end": 1930}
+      ]
+    },
+    {
+      "name": "staple194",
+      "color": "#cc0000",
+      "sequence": "TCAGGGCGATCGCCACCCTC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1930, "end": 1940},
+        {"helix": 1, "forward": false, "start": 1930, "end": 1940}
+      ]
+    },
+    {
+      "name": "staple195",
+      "color": "#f7931e",
+      "sequence": "GGCCCACTACCCCTCAGAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1940, "end": 1950},
+        {"helix": 1, "forward": false, "start": 1940, "end": 1950}
+      ]
+    },
+    {
+      "name": "staple196",
+      "color": "#f74308",
+      "sequence": "GTGAACCATCGGAACCGCCT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1950, "end": 1960},
+        {"helix": 1, "forward": false, "start": 1950, "end": 1960}
+      ]
+    },
+    {
+      "name": "staple197",
+      "color": "#57bb00",
+      "sequence": "ACCCAAATCAAGCCACCACC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1960, "end": 1970},
+        {"helix": 1, "forward": false, "start": 1960, "end": 1970}
+      ]
+    },
+    {
+      "name": "staple198",
+      "color": "#888888",
+      "sequence": "AGTTTTTTGGCCGGAACCAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1970, "end": 1980},
+        {"helix": 1, "forward": false, "start": 1970, "end": 1980}
+      ]
+    },
+    {
+      "name": "staple199",
+      "color": "#32b86c",
+      "sequence": "GGTCGAGGTGATCAAAATCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1980, "end": 1990},
+        {"helix": 1, "forward": false, "start": 1980, "end": 1990}
+      ]
+    },
+    {
+      "name": "staple200",
+      "color": "#333333",
+      "sequence": "CCGTAAAGCATCTTTTCATA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H1"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 1990, "end": 2000},
+        {"helix": 1, "forward": false, "start": 1990, "end": 2000}
+      ]
+    },
+    {
+      "name": "staple201",
+      "color": "#320096",
+      "sequence": "CTAAATCGGAGCGTTTGCCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "A2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2000, "end": 2010},
+        {"helix": 1, "forward": false, "start": 2000, "end": 2010}
+      ]
+    },
+    {
+      "name": "staple202",
+      "color": "#03b6a2",
+      "sequence": "ACCCTAAAGGCCCCTTATTA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "B2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2010, "end": 2020},
+        {"helix": 1, "forward": false, "start": 2010, "end": 2020}
+      ]
+    },
+    {
+      "name": "staple203",
+      "color": "#7300de",
+      "sequence": "GAGCCCCCGACGGTCATAGC",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "C2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2020, "end": 2030},
+        {"helix": 1, "forward": false, "start": 2020, "end": 2030}
+      ]
+    },
+    {
+      "name": "staple204",
+      "color": "#aaaa00",
+      "sequence": "TTTAGAGCTTTCGGCATTTT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "D2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2030, "end": 2040},
+        {"helix": 1, "forward": false, "start": 2030, "end": 2040}
+      ]
+    },
+    {
+      "name": "staple205",
+      "color": "#b8056c",
+      "sequence": "GACGGGGAAACGCGTTTTCA",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "E2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2040, "end": 2050},
+        {"helix": 1, "forward": false, "start": 2040, "end": 2050}
+      ]
+    },
+    {
+      "name": "staple206",
+      "color": "#007200",
+      "sequence": "GCCGGCGAACCAGACTGTAG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "F2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2050, "end": 2060},
+        {"helix": 1, "forward": false, "start": 2050, "end": 2060}
+      ]
+    },
+    {
+      "name": "staple207",
+      "color": "#cc0000",
+      "sequence": "GTGGCGAGAACCTTTAGCGT",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "G2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2060, "end": 2070},
+        {"helix": 1, "forward": false, "start": 2060, "end": 2070}
+      ]
+    },
+    {
+      "name": "staple208",
+      "color": "#f7931e",
+      "sequence": "AGGAAGGGAAATCAAGTTTG",
+      "idt": {"scale": "25nm", "purification": "STD", "plate": "plate3", "well": "H2"},
+      "domains": [
+        {"helix": 0, "forward": true, "start": 2070, "end": 2080},
+        {"helix": 1, "forward": false, "start": 2070, "end": 2080}
+      ]
+    },
+    {
+      "color": "#0066cc",
+      "sequence": "TTCCCTTCCTTTCTCGCCACGTTCGCCGGCTTTCCCCGTCAAGCTCTAAATCGGGGGCTCCCTTTAGGGTTCCGATTTAGTGCTTTACGGCACCTCGACCCCAAAAAACTTGATTTGGGTGATGGTTCACGTAGTGGGCCATCGCCCTGATAGACGGTTTTTCGCCCTTTGACGTTGGAGTCCACGTTCTTTAATAGTGGACTCTTGTTCCAAACTGGAACAACACTCAACCCTATCTCGGGCTATTCTTTTGATTTATAAGGGATTTTGCCGATTTCGGAACCACCATCAAACAGGATTTTCGCCTGCTGGGGCAAACCAGCGTGGACCGCTTGCTGCAACTCTCTCAGGGCCAGGCGGTGAAGGGCAATCAGCTGTTGCCCGTCTCACTGGTGAAAAGAAAAACCACCCTGGCGCCCAATACGCAAACCGCCTCTCCCCGCGCGTTGGCCGATTCATTAATGCAGCTGGCACGACAGGTTTCCCGACTGGAAAGCGGGCAGTGAGCGCAACGCAATTAATGTGAGTTAGCTCACTCATTAGGCACCCCAGGCTTTACACTTTATGCTTCCGGCTCGTATGTTGTGTGGAATTGTGAGCGGATAACAATTTCACACAGGAAACAGCTATGACCATGATTACGAATTCGAGCTCGGTACCCGGGGATCCTCTAGAGTCGACCTGCAGGCATGCAAGCTTGGCACTGGCCGTCGTTTTACAACGTCGTGACTGGGAAAACCCTGGCGTTACCCAACTTAATCGCCTTGCAGCACATCCCCCTTTCGCCAGCTGGCGTAATAGCGAAGAGGCCCGCACCGATCGCCCTTCCCAACAGTTGCGCAGCCTGAATGGCGAATGGCGCTTTGCCTGGTTTCCGGCACCAGAAGCGGTGCCGGAAAGCTGGCTGGAGTGCGATCTTCCTGAGGCCGATACTGTCGTCGTCCCCTCAAACTGGCAGATGCACGGTTACGATGCGCCCATCTACACCAACGTGACCTATCCCATTACGGTCAATCCGCCGTTTGTTCCCACGGAGAATCCGACGGGTTGTTACTCGCTCACATTTAATGTTGATGAAAGCTGGCTACAGGAAGGCCAGACGCGAATTATTTTTGATGGCGTTCCTATTGGTTAAAAAATGAGCTGATTTAACAAAAATTTAATGCGAATTTTAACAAAATATTAACGTTTACAATTTAAATATTTGCTTATACAATCTTCCTGTTTTTGGGGCTTTTCTGATTATCAACCGGGGTACATATGATTGACATGCTAGTTTTACGATTACCGTTCATCGATTCTCTTGTTTGCTCCAGACTCTCAGGCAATGACCTGATAGCCTTTGTAGATCTCTCAAAAATAGCTACCCTCTCCGGCATTAATTTATCAGCTAGAACGGTTGAATATCATATTGATGGTGATTTGACTGTCTCCGGCCTTTCTCACCCTTTTGAATCTTTACCTACACATTACTCAGGCATTGCATTTAAAATATATGAGGGTTCTAAAAATTTTTATCCTTGCGTTGAAATAAAGGCTTCTCCCGCAAAAGTATTACAGGGTCATAATGTTTTTGGTACAACCGATTTAGCTTTATGCTCTGAGGCTTTATTGCTTAATTTTGCTAATTCTTTGCCTTGCCTGTATGATTTATTGGATGTTAATGCTACTACTATTAGTAGAATTGATGCCACCTTTTCAGCTCGCGCCCCAAATGAAAATATAGCTAAACAGGTTATTGACCATTTGCGAAATGTATCTAATGGTCAAACTAAATCTACTCGTTCGCAGAATTGGGAATCAACTGTTATATGGAATGAAACTTCCAGACACCGTACTTTAGTTGCATATTTAAAACATGTTGAGCTACAGCATTATATTCAGCAATTAAGCTCTAAGCCATCCGCAAAAATGACCTCTTATCAAAAGGAGCAATTAAAGGTACTCTCTAATCCTGACCTGTTGGAGTTTGCTTCCGGTCTGGTTCGCTTTGAAGCTCGAATTAAAACGCGATATTTGAAGTCTTTCGGGCTTCCTCTTAATCTTTTTGATGCAATCCGCTTTGCTTCTGACTATAATAGTCAGGGTAAAGACCTGATTTTTGATTTATGGTCATTCTCGTTTTCTGAACTGTTTAAAGCATTTGAGGGGGATTCAATGAATATTTATGACGATTCCGCAGTATTGGACGCTATCCAGTCTAAACATTTTACTATTACCCCCTCTGGCAAAACTTCTTTTGCAAAAGCCTCTCGCTATTTTGGTTTTTATCGTCGTCTGGTAAACGAGGGTTATGATAGTGTTGCTCTTACTATGCCTCGTAATTCCTTTTGGCGTTATGTATCTGCATTAGTTGAATGTGGTATTCCTAAATCTCAACTGATGAATCTTTCTACCTGTAATAATGTTGTTCCGTTAGTTCGTTTTATTAACGTAGATTTTTCTTCCCAACGTCCTGACTGGTATAATGAGCCAGTTCTTAAAATCGCATAAGGTAATTCACAATGATTAAAGTTGAAATTAAACCATCTCAAGCCCAATTTACTACTCGTTCTGGTGTTTCTCGTCAGGGCAAGCCTTATTCACTGAATGAGCAGCTTTGTTACGTTGATTTGGGTAATGAATATCCGGTTCTTGTCAAGATTACTCTTGATGAAGGTCAGCCAGCCTATGCGCCTGGTCTGTACACCGTTCATCTGTCCTCTTTCAAAGTTGGTCAGTTCGGTTCCCTTATGATTGACCGTCTGCGCCTCGTTCCGGCTAAGTAACATGGAGCAGGTCGCGGATTTCGACACAATTTATCAGGCGATGATACAAATCTCCGTTGTACTTTGTTTCGCGCTTGGTATAATCGCTGGGGGTCAAAGATGAGTGTTTTAGTGTATTCTTTTGCCTCTTTCGTTTTAGGTTGGTGCCTTCGTAGTGGCATTACGTATTTTACCCGTTTAATGGAAACTTCCTCATGAAAAAGTCTTTAGTCCTCAAAGCCTCTGTAGCCGTTGCTACCCTCGTTCCGATGCTGTCTTTCGCTGCTGAGGGTGACGATCCCGCAAAAGCGGCCTTTAACTCCCTGCAAGCCTCAGCGACCGAATATATCGGTTATGCGTGGGCGATGGTTGTTGTCATTGTCGGCGCAACTATCGGTATCAAGCTGTTTAAGAAATTCACCTCGAAAGCAAGCTGATAAACCGATACAATTAAAGGCTCCTTTTGGAGCCTTTTTTTTGGAGATTTTCAACGTGAAAAAATTATTATTCGCAATTCCTTTAGTTGTTCCTTTCTATTCTCACTCCGCTGAAACTGTTGAAAGTTGTTTAGCAAAATCCCATACAGAAAATTCATTTACTAACGTCTGGAAAGACGACAAAACTTTAGATCGTTACGCTAACTATGAGGGCTGTCTGTGGAATGCTACAGGCGTTGTAGTTTGTACTGGTGACGAAACTCAGTGTTACGGTACATGGGTTCCTATTGGGCTTGCTATCCCTGAAAATGAGGGTGGTGGCTCTGAGGGTGGCGGTTCTGAGGGTGGCGGTTCTGAGGGTGGCGGTACTAAACCTCCTGAGTACGGTGATACACCTATTCCGGGCTATACTTATATCAACCCTCTCGACGGCACTTATCCGCCTGGTACTGAGCAAAACCCCGCTAATCCTAATCCTTCTCTTGAGGAGTCTCAGCCTCTTAATACTTTCATGTTTCAGAATAATAGGTTCCGAAATAGGCAGGGGGCATTAACTGTTTATACGGGCACTGTTACTCAAGGCACTGACCCCGTTAAAACTTATTACCAGTACACTCCTGTATCATCAAAAGCCATGTATGACGCTTACTGGAACGGTAAATTCAGAGACTGCGCTTTCCATTCTGGCTTTAATGAGGATTTATTTGTTTGTGAATATCAAGGCCAATCGTCTGACCTGCCTCAACCTCCTGTCAATGCTGGCGGCGGCTCTGGTGGTGGTTCTGGTGGCGGCTCTGAGGGTGGTGGCTCTGAGGGTGGCGGTTCTGAGGGTGGCGGCTCTGAGGGAGGCGGTTCCGGTGGTGGCTCTGGTTCCGGTGATTTTGATTATGAAAAGATGGCAAACGCTAATAAGGGGGCTATGACCGAAAATGCCGATGAAAACGCGCTACAGTCTGACGCTAAAGGCAAACTTGAT",
+      "domains": [
+        {"helix": 0, "forward": false, "start": 0, "end": 2080},
+        {"helix": 1, "forward": true, "start": 0, "end": 2080}
+      ],
+      "is_scaffold": true
+    }
+  ]
 }
\ No newline at end of file
diff --git a/examples/output_designs/relax_helix_rolls.sc b/examples/output_designs/relax_helix_rolls.sc
new file mode 100644
index 00000000..0b3a949b
--- /dev/null
+++ b/examples/output_designs/relax_helix_rolls.sc
@@ -0,0 +1,40 @@
+{
+  "version": "0.18.1",
+  "grid": "square",
+  "helices": [
+    {
+      "max_offset": 60,
+      "grid_position": [0, 0],
+      "roll": 40.71428571400003,
+      "major_ticks": [0, 5, 13]
+    },
+    {
+      "max_offset": 60,
+      "grid_position": [0, 1],
+      "roll": 72.85714285699999,
+      "major_ticks": [0, 5, 13]
+    },
+    {
+      "max_offset": 60,
+      "grid_position": [1, 0],
+      "roll": 68.57142857100001,
+      "major_ticks": [0, 5, 13]
+    }
+  ],
+  "strands": [
+    {
+      "color": "#f74308",
+      "domains": [
+        {"helix": 0, "forward": true, "start": 0, "end": 5},
+        {"helix": 1, "forward": false, "start": 0, "end": 5}
+      ]
+    },
+    {
+      "color": "#57bb00",
+      "domains": [
+        {"helix": 0, "forward": true, "start": 5, "end": 13},
+        {"helix": 2, "forward": false, "start": 5, "end": 13}
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/examples/relax_helix_rolls.py b/examples/relax_helix_rolls.py
new file mode 100644
index 00000000..bf16edd1
--- /dev/null
+++ b/examples/relax_helix_rolls.py
@@ -0,0 +1,78 @@
+import scadnano as sc
+import modifications as mod
+import dataclasses
+
+
+def create_design() -> sc.Design:
+    # '''
+    #   0123456789012345678901234567890123456789
+    # 0 [---+[--------+[----------+
+    #       |         |           |
+    # 1 [---+<--------+<----------+
+    #
+    # angle (fraction of 360)
+    #      5/10.5
+    #              (15-10.5)/10.5 = 4.5/10.5
+    #                        (27-21)/10.5 = 6/10.5
+    # '''
+    # design2h = sc.Design(helices=[sc.Helix(max_offset=50) for _ in range(2)], grid=sc.square)
+    # # helix 0 forward
+    # design2h.draw_strand(0, 0).move(5).cross(1).move(-5)
+    # design2h.draw_strand(0, 5).move(10).cross(1).move(-10)
+    # design2h.draw_strand(0, 15).move(12).cross(1).move(-12)
+    #
+    # for helix in design2h.helices.values():
+    #     helix.major_ticks = [0, 5, 15, 27]
+    #
+    # design2h.relax_helix_rolls()
+
+    '''
+      0         1         2         3         4         5         6
+      012345678901234567890123456789012345678901234567890123456789
+    0 [---+[--------+[----------+[------+[--------+[--------+
+          |         |           |       |         |         |
+    1 [---+<--------+<----------+       |         |         |
+                                        |         |         |
+    2                            <------+<--------+<--------+
+
+    angle (fraction of 360)
+         5/10.5
+                 (15-10.5)/10.5 = 4.5/10.5
+                           (27-21)/10.5 = 6/10.5
+    '''
+    helices = [sc.Helix(max_offset=60) for _ in range(3)]
+    helices[2].grid_position = (1, 0)
+    design3h = sc.Design(helices=helices, grid=sc.square)
+
+    # helix 0 forward
+    design3h.draw_strand(0, 0).move(5).cross(1).move(-5)
+    design3h.draw_strand(0, 5).move(10).cross(1).move(-10)
+    design3h.draw_strand(0, 15).move(12).cross(1).move(-12)
+    design3h.draw_strand(0, 27).move(7).cross(2).move(-7)
+    design3h.draw_strand(0, 34).move(10).cross(2).move(-10)
+    design3h.draw_strand(0, 44).move(10).cross(2).move(-10)
+
+    for helix in design3h.helices.values():
+        helix.major_ticks = [0, 5, 15, 27, 34, 44, 54]
+
+    design3h.relax_helix_rolls()
+
+    # return design3h
+
+    helices = [sc.Helix(max_offset=60) for _ in range(3)]
+    helices[2].grid_position = (1, 0)
+    design3h2 = sc.Design(helices=helices, grid=sc.square)
+    design3h2.draw_strand(0, 0).move(5).cross(1).move(-5)
+    design3h2.draw_strand(0, 5).move(8).cross(2).move(-8)
+
+    for helix in design3h2.helices.values():
+        helix.major_ticks = [0, 5, 13]
+
+    design3h2.relax_helix_rolls()
+
+    return design3h2
+
+
+if __name__ == '__main__':
+    d = create_design()
+    d.write_scadnano_file(directory='output_designs')
diff --git a/scadnano/scadnano.py b/scadnano/scadnano.py
index a4b73ff8..15ae3f84 100644
--- a/scadnano/scadnano.py
+++ b/scadnano/scadnano.py
@@ -53,7 +53,7 @@
 # needed to use forward annotations: https://docs.python.org/3/whatsnew/3.7.html#whatsnew37-pep563
 from __future__ import annotations
 
-__version__ = "0.18.0"  # version line; WARNING: do not remove or change this line or comment
+__version__ = "0.18.1"  # version line; WARNING: do not remove or change this line or comment
 
 import collections
 import dataclasses
@@ -62,6 +62,7 @@
 import enum
 import itertools
 import re
+import math
 from builtins import ValueError
 from dataclasses import dataclass, field, InitVar, replace
 from typing import Iterator, Tuple, List, Sequence, Iterable, Set, Dict, Union, Optional, Type, cast, Any, \
@@ -72,6 +73,13 @@
 from math import sqrt, sin, cos, pi
 from random import randint
 
+# we import like this so that we can use openpyxl.Workbook in the type hints, but still allow
+# someone to use the library without having openpyxl installed
+try:
+    import openpyxl
+except ImportError as import_error:
+    raise import_error
+
 default_scadnano_file_extension = 'sc'
 """Default filename extension when writing a scadnano file."""
 
@@ -328,9 +336,6 @@ class Grid(str, enum.Enum):
     Represents default patterns for laying out helices in the side view.
     Each :any:`Grid` except :py:data:`Grid.none` has an interpretation of a "grid position",
     which is a 2D integer coordinate (`h`, `v`).
-    (scadnano also allows a 3rd coordinate (`h`, `v`, `b`) specifying a "base offset" at which to position
-    the start of the :any:`Helix`, which is not relevant for the side view but will eventually be
-    supported to adjust the main view.)
     """
 
     square = "square"
@@ -1195,7 +1200,7 @@ def from_json(json_map: Dict[str, Any]) -> Position3D:
             z = json_map[position_z_key]
         return Position3D(x=x, y=y, z=z)
 
-    def __add__(self, other: 'Position3D') -> 'Position3D':
+    def __add__(self, other: Position3D) -> Position3D:
         """
         :param other:
             other position to add to this one
@@ -1204,7 +1209,7 @@ def __add__(self, other: 'Position3D') -> 'Position3D':
         """
         return Position3D(self.x + other.x, self.y + other.y, self.z + other.z)
 
-    def clone(self) -> 'Position3D':
+    def clone(self) -> Position3D:
         """
         :return:
             copy of this :any:`Position3D`
@@ -1692,6 +1697,26 @@ def calculate_major_ticks(self, grid: Grid) -> List[int]:
             distance = default_major_tick_distance(grid)
             return list(range(self.major_tick_start, self.max_offset + 1, distance))
 
+    def calculate_position(self, grid: Grid, geometry: Optional[Geometry] = None) -> Position3D:
+        """
+        :param grid:
+            :any:`Grid` of this :any:`Helix` used to interpret the field :data:`Helix.grid_position`.
+            Must be None if :data:`Helix.grid_position` is None.
+        :param geometry:
+            :any:`Geometry` parameters to determine distance between helices in a grid.
+            Must be None if :data:`Helix.grid_position` is None.
+        :return:
+            Position of this :any:`Helix` in 3D space, based on its :data:`Helix.grid_position`
+            if it is not None, or its :data:`Helix.position` otherwise.
+        """
+        if self.grid_position is None:
+            assert grid == Grid.none
+            return self.position
+        else:
+            assert grid is not None
+            assert geometry is not None
+            return grid_position_to_position(self.grid_position, grid, geometry)
+
     @property
     def domains(self) -> List[Domain]:
         """
@@ -1735,8 +1760,184 @@ def backbone_angle_at_offset(self, offset: int, forward: bool, geometry: Geometr
         angle = self.roll + offset * degrees_per_base
         if not forward:
             angle += geometry.minor_groove_angle
+        angle %= 360
         return angle
 
+    def crossovers(self) -> List[Tuple[int, int, bool]]:
+        """
+        :return:
+            list of triples (`offset`, `helix_idx`, `forward`) of all crossovers incident to this
+            :any:`Helix`, where `offset` is the offset of the crossover and `helix_idx` is the
+            :data:`Helix.idx` of the other :any:`Helix` incident to the crossover.
+        """
+        crossovers: List[Tuple[int, int, bool]] = []
+        for domain in self.domains:
+            strand = domain.strand()
+            domains = strand.bound_domains()
+            num_domains = len(domains)
+            domain_idx = domains.index(domain)
+
+            # if not first domain, then there is a crossover to the previous domain
+            if domain_idx > 0:
+                offset = domain.offset_5p()
+                other_domain = domains[domain_idx - 1]
+                other_helix_idx = other_domain.helix
+                crossovers.append((offset, other_helix_idx, domain.forward))
+
+            # if not last domain, then there is a crossover to the next domain
+            if domain_idx < num_domains - 1:
+                offset = domain.offset_3p()
+                other_domain = domains[domain_idx + 1]
+                other_helix_idx = other_domain.helix
+                crossovers.append((offset, other_helix_idx, domain.forward))
+
+        return crossovers
+
+    def relax_roll(self, helices: Dict[int, Helix], grid: Grid, geometry: Geometry) -> None:
+        """
+        Like :meth:`Design.relax_helix_rolls`, but only for this :any:`Helix`.
+        """
+        angle = self.compute_relaxed_roll(helices, grid, geometry)
+        self.roll = angle
+
+    def compute_relaxed_roll(self, helices: Dict[int, Helix], grid: Grid, geometry: Geometry) -> float:
+        """
+        Like :meth:`Helix.relax_roll`, but just returns the new roll without altering this :any:`Helix`,
+        rather than changing the field :data:`Helix.roll`.
+        """
+        angles = []
+        for offset, helix_idx, forward in self.crossovers():
+            other_helix = helices[helix_idx]
+            angle_of_other_helix = angle_from_helix_to_helix(self, other_helix, grid, geometry)
+            crossover_angle = self.backbone_angle_at_offset(offset, forward, geometry)
+            relative_angle = (crossover_angle, angle_of_other_helix)
+            angles.append(relative_angle)
+        angle = minimum_strain_angle(angles)
+        return angle
+
+
+def angle_from_helix_to_helix(helix: Helix, other_helix: Helix,
+                              grid: Optional[Grid] = None, geometry: Optional[Geometry] = None) -> float:
+    """
+    Computes angle between `helix` and `other_helix` in degrees.
+
+    :param helix:
+        first helix
+    :param other_helix:
+        second helix
+    :param grid:
+        :any:`Grid` to use when calculating Helix positions
+    :param geometry:
+        :any:`Geometry` to use when calculating Helix positions
+    :return:
+        angle between `helix` and `other_helix` in degrees.
+    """
+    p1 = helix.calculate_position(grid, geometry)
+    p2 = other_helix.calculate_position(grid, geometry)
+
+    # negate y_diff because y increases going down in the main view
+    y_diff = -(p2.y - p1.y)
+    x_diff = p2.x - p1.x
+
+    angle = math.degrees(math.atan2(y_diff, x_diff))
+
+    # negate angle because we rotate clockwise
+    angle = -angle
+
+    # subtract 90 since we define 0 angle to be up instead of right
+    angle += 90
+
+    # normalize to be in range [0, 360)
+    angle %= 360
+
+    return angle
+
+
+def minimum_strain_angle(relative_angles: List[Tuple[float, float]]) -> float:
+    r"""
+    Computes the angle that minimizes the "strain" of all relative angles in the given list.
+
+    A "relative angle" is a pair :math:`(\theta, \mu)`. The strain is set to 0 by setting
+    :math:`\theta = \mu`; more generally the strain is :math:`(\theta-\mu)^2`, where :math:`\theta-\mu`
+    is the "angular difference" (e.g., 10-350 is 20 since 350 is also -10 mod 360).
+
+    The constraint is that in the list
+    [:math:`(\theta_1, \mu_1)`, :math:`(\theta_2, \mu_2)`, ..., :math:`(\theta_n, \mu_n)`],
+    we can rotate all angles :math:`\theta_i` by the same amount :math:`\theta`.
+    So this calculates the angle :math:`\theta` that minimizes
+    :math:`\sum_i [(\theta + \theta_i) - \mu_i]^2`
+
+    :param relative_angles:
+        List of :math:`(\theta_i, \mu_i)` pairs, where :math:`\theta_i = \mu_i` means 0 strain, and angles
+        are in units of degrees.
+    :return:
+        angle :math:`\theta` by which to rotate all angles :math:`\theta_i`
+        (but not changing any "zero angle" :math:`\mu_i`)
+        such that :math:`\sum_i [(\theta + \theta_i) - \mu_i]^2` is minimized.
+    """
+    adjusted_angles = [angle - zero_angle for angle, zero_angle in relative_angles]
+    ave_angle = average_angle(adjusted_angles)
+    min_strain_angle = -ave_angle
+    min_strain_angle %= 360
+    return min_strain_angle
+
+
+def angle_distance(x: float, y: float) -> float:
+    """
+    :param x: angle in degrees
+    :param y: angle in degrees
+    :return: signed difference between angles `x` and `y`, in degrees, in range [-180, 180]
+    """
+    a = (x - y) % 360
+    b = (y - x) % 360
+    diff = -a if a < b else b
+    return diff
+
+
+def sum_squared_angle_distances(angles: List[float], angle: float) -> float:
+    """
+    :param angles: list of angles in degrees
+    :param angle: angle in degrees
+    :return: sum of squared distances from each angle in `angles` to `angle`
+    """
+    return sum(angle_distance(angle, a) ** 2 for a in angles)
+
+
+def average_angle(angles: List[float]) -> float:
+    """
+    Calculate the "circular mean" of the angles in `angles`. Note this coincides with the arithemtic mean
+    for certain lists of angles, e.g., [0, 10, 50], in a way that the circular mean calculated via
+    interpreting angles as unit vectors (https://en.wikipedia.org/wiki/Circular_mean) does not.
+
+    This algorithm is due to Julian Panetta. (https://julianpanetta.com/)
+
+    :param angles:
+        List of angles in degrees.
+    :return:
+        average angle of the list of angles, normalized to be between 0 and 360.
+    """
+    num_angles = len(angles)
+    mean_angle = sum(angles) / num_angles
+    min_dist = float('inf')
+    optimal_angle = 0
+    for n in range(num_angles):
+        candidate_angle = mean_angle + 360.0 * n / num_angles
+        candidate_dist = sum_squared_angle_distances(angles, candidate_angle)
+        if min_dist > candidate_dist:
+            min_dist = candidate_dist
+            optimal_angle = candidate_angle
+
+    optimal_angle %= 360.0
+
+    # taking mod 360 sometimes results in 360.0 instead of 0.0. This is hacky but fixes it.
+    if abs(360.0 - optimal_angle) < 10 ** (-8):
+        optimal_angle = 0.0
+
+    # in case it's a nice round number, let's get rid of the floating-point error artifacts here
+    optimal_angle = round(optimal_angle, 9)
+
+    return optimal_angle
+
 
 def _is_close(x1: float, x2: float) -> bool:
     return abs(x1 - x2) < _floating_point_tolerance
@@ -5186,8 +5387,8 @@ def from_scadnano_json_str(json_str: str) -> Design:
         try:
             design = Design.from_scadnano_json_map(json_map)
             return design
-        except KeyError as e:
-            raise IllegalDesignError(f'I was expecting a JSON key but did not find it: {e}')
+        except KeyError as error:
+            raise IllegalDesignError(f'I was expecting a JSON key but did not find it: {error}')
 
     @staticmethod
     def _check_mutually_exclusive_fields(json_map: dict) -> None:
@@ -7192,30 +7393,33 @@ def _write_plates_assuming_explicit_plates_in_each_strand(self, directory: str,
             for row, strand in enumerate(strands_in_plate):
                 if strand.idt is None:
                     raise ValueError(f'cannot export strand {strand} to IDT because it has no idt field')
-                worksheet.write(row + 1, 0, strand.idt.well)
-                worksheet.write(row + 1, 1, strand.idt_export_name())
-                worksheet.write(row + 1, 2, strand.idt_dna_sequence())
+                worksheet.cell(row + 2, 1).value = strand.idt.well
+                worksheet.cell(row + 2, 2).value = strand.idt_export_name()
+                worksheet.cell(row + 2, 3).value = strand.idt_dna_sequence()
 
             workbook.save(filename_plate)
 
+    # TODO: fix types when openpyxl supports type hints
     @staticmethod
-    def _add_new_excel_plate_sheet(plate_name: str, workbook: Any) -> Any:
-        worksheet = workbook.add_sheet(plate_name)
-        worksheet.write(0, 0, 'Well Position')
-        worksheet.write(0, 1, 'Name')
-        worksheet.write(0, 2, 'Sequence')
+    def _add_new_excel_plate_sheet(plate_name: str,
+                                   workbook: 'openpyxl.Workbook') -> 'openpyxl.Worksheet':
+        worksheet = workbook.create_sheet(title=plate_name)
+        worksheet.cell(1, 1).value = 'Well Position'
+        worksheet.cell(1, 2).value = 'Name'
+        worksheet.cell(1, 3).value = 'Sequence'
         return worksheet
 
     @staticmethod
-    def _setup_excel_file(directory: str, filename: Optional[str]) -> Tuple[str, Any]:
-        import xlwt  # type: ignore
-        plate_extension = f'xls'
+    def _setup_excel_file(directory: str, filename: Optional[str]) -> Tuple[str, 'openpyxl.Workbook']:
+        import openpyxl  # type: ignore
+        plate_extension = f'xlsx'
         if filename is None:
             filename_plate = _get_filename_same_name_as_running_python_script(
                 directory, plate_extension, filename)
         else:
             filename_plate = _create_directory_and_set_filename(directory, filename)
-        workbook = xlwt.Workbook()
+        workbook = openpyxl.Workbook()
+        workbook.remove(workbook.active)  # removed automatically created default sheet
         return filename_plate, workbook
 
     def _write_plates_default(self, directory: str, filename: Optional[str], strands: List[Strand],
@@ -7253,9 +7457,9 @@ def _write_plates_default(self, directory: str, filename: Optional[str], strands
                         f"which is being ignored since we are using default plate/well addressing")
 
             well = plate_coord.well()
-            worksheet.write(excel_row, 0, well)
-            worksheet.write(excel_row, 1, strand.idt_export_name())
-            worksheet.write(excel_row, 2, strand.idt_dna_sequence())
+            worksheet.cell(excel_row + 1, 1).value = well
+            worksheet.cell(excel_row + 1, 2).value = strand.idt_export_name()
+            worksheet.cell(excel_row + 1, 3).value = strand.idt_dna_sequence()
             num_strands_remaining -= 1
 
             # IDT charges extra for a plate with < 24 strands for 96-well plate
@@ -8164,9 +8368,6 @@ def strand_with_name(self, name: str) -> Optional[Strand]:
                 return strand
         return None
 
-    def grid_of_helix(self, helix):
-        pass
-
     def add_helix(self, idx: int, helix: Helix) -> None:
         """
         Adds `helix` as a new :any:`Helix` with index `idx` to this Design.
@@ -8192,6 +8393,18 @@ def add_helix(self, idx: int, helix: Helix) -> None:
         self._set_helices_grid_positions_or_positions()
         self._assign_default_helices_view_orders_to_groups()
 
+    def relax_helix_rolls(self) -> None:
+        """
+        Sets all helix rolls to "relax" them based on their crossovers.
+
+        This calculates the "strain" of each crossover c as the absolute value d_c of the distance between
+        the angle to the helix to which it is connected and the angle of that crossover given the
+        current helix roll. It minimizes sum_c d_c^2, i.e., minimize the sum of the squares of the strains.
+        """
+        for helix in self.helices.values():
+            helix_group = self.groups[helix.group]
+            helix.relax_roll(self.helices, helix_group.grid, self.geometry)
+
 
 def _find_index_pair_same_object(elts: Union[List, Dict]) -> Optional[Tuple]:
     # return pair of indices representing same object in elts, or None if they do not exist
diff --git a/setup.py b/setup.py
index 144d4ad5..77dba7a9 100644
--- a/setup.py
+++ b/setup.py
@@ -51,11 +51,12 @@ def extract_version(filename: str):
       url="https://github.com/UC-Davis-molecular-computing/scadnano-python-package",
       long_description=long_description,
       long_description_content_type='text/markdown; variant=GFM',
-      python_requires='>=3.6',
+      python_requires='>=3.7',
       install_requires=[
-        'xlwt',
-        'dataclasses>=0.6; python_version < "3.7"',
-        'tabulate',
+          'openpyxl',
+          'tabulate',
       ],
-      tests_require=['xlrd'],
-)
+      tests_require=[
+          'openpyxl',
+      ],
+      )


Test patch:
diff --git a/.github/workflows/run_unit_tests.yml b/.github/workflows/run_unit_tests.yml
index a0baddf4..3e860978 100644
--- a/.github/workflows/run_unit_tests.yml
+++ b/.github/workflows/run_unit_tests.yml
@@ -1,28 +1,28 @@
-name: Run Unit Tests
-
-on: pull_request
-
-jobs:
-  build:
-
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        python-version: [3.7, 3.8, 3.9, "3.10", "3.11"]
-
-    steps:
-    - uses: actions/checkout@v2
-    - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v1
-      with:
-        python-version: ${{ matrix.python-version }}
-    - name: Setup conda
-      uses: s-weigand/setup-conda@v1
-      with:
-        activate-conda: true
-    - name: Install xlwt, xlrd, tabulate with conda
-      run: conda install xlwt=1.3.0 xlrd=2.0.1 tabulate=0.8.9
-    - name: Install docutils with conda
-      run: conda install docutils=0.16
-    - name: Test with unittest
-      run: python -m unittest -v tests/scadnano_tests.py
+name: Run Unit Tests
+
+on: pull_request
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: [ 3.7, 3.8, 3.9, "3.10", "3.11" ]
+
+    steps:
+      - uses: actions/checkout@v2
+      - name: Set up Python ${{ matrix.python-version }}
+        uses: actions/setup-python@v1
+        with:
+          python-version: ${{ matrix.python-version }}
+      - name: Setup conda
+        uses: s-weigand/setup-conda@v1
+        with:
+          activate-conda: true
+      - name: Install openpyxl,tabulate with conda
+        run: conda install openpyxl=3.0.10 tabulate=0.8.10
+      - name: Install docutils with conda
+        run: conda install docutils=0.16
+      - name: Test with unittest
+        run: python -m unittest -v tests/scadnano_tests.py
diff --git a/tests/scadnano_tests.py b/tests/scadnano_tests.py
index a8e3fd50..753c0c39 100644
--- a/tests/scadnano_tests.py
+++ b/tests/scadnano_tests.py
@@ -8,7 +8,7 @@
 import math
 from typing import Iterable, Union, Dict, Any
 
-import xlrd  # type: ignore
+import openpyxl  # type: ignore
 
 import scadnano as sc
 import scadnano.origami_rectangle as rect
@@ -1228,7 +1228,7 @@ def test_write_idt_plate_excel_file(self) -> None:
         # add 10 strands in excess of 3 plates
         for plate_type in [sc.PlateType.wells96, sc.PlateType.wells384]:
             num_strands = 3 * plate_type.num_wells_per_plate() + 10
-            filename = f'test_excel_export_{plate_type.num_wells_per_plate()}.xls'
+            filename = f'test_excel_export_{plate_type.num_wells_per_plate()}.xlsx'
             max_offset = num_strands * strand_len
             helices = [sc.Helix(max_offset=max_offset) for _ in range(1)]
             design = sc.Design(helices=helices, strands=[], grid=sc.square)
@@ -1238,11 +1238,11 @@ def test_write_idt_plate_excel_file(self) -> None:
 
             design.write_idt_plate_excel_file(filename=filename, plate_type=plate_type)
 
-            book = xlrd.open_workbook(filename)
-            self.assertEqual(4, book.nsheets)
+            book = openpyxl.load_workbook(filename=filename)
+            self.assertEqual(4, len(book.worksheets))
             for plate in range(4):
-                sheet = book.sheet_by_index(plate)
-                self.assertEqual(3, sheet.ncols)
+                sheet = book.worksheets[plate]
+                self.assertEqual(3, sheet.max_column)
 
                 if plate == 2:  # penultimate plate
                     expected_wells = plate_type.num_wells_per_plate() - plate_type.min_wells_per_plate() + 10
@@ -1251,7 +1251,7 @@ def test_write_idt_plate_excel_file(self) -> None:
                 else:
                     expected_wells = plate_type.num_wells_per_plate()
 
-                self.assertEqual(expected_wells + 1, sheet.nrows)
+                self.assertEqual(expected_wells + 1, sheet.max_row)
 
             os.remove(filename)
 
@@ -3711,7 +3711,7 @@ def test_nick_on_extension(self) -> None:
             sc.Domain(0, True, 4, 8),
             sc.Extension(5)
         ])
-        self.assertEquals(2, len(design.strands))
+        self.assertEqual(2, len(design.strands))
         self.assertIn(expected_strand1, design.strands)
         self.assertIn(expected_strand2, design.strands)
 
@@ -7714,14 +7714,19 @@ def test_file_output(self) -> None:
         with tempfile.TemporaryDirectory() as tmpdir:
             # First, write to the directory, in which case the names should be the script name
             design.write_oxdna_files(directory=tmpdir)
-            self.assertEqual(top, open(tmpdir + '/' + scriptname + '.top').read())
-            self.assertEqual(dat, open(tmpdir + '/' + scriptname + '.dat').read())
+            with open(tmpdir + '/' + scriptname + '.top') as f:
+                self.assertEqual(top, f.read())
+            with open(tmpdir + '/' + scriptname + '.dat') as f:
+                self.assertEqual(dat, f.read())
 
             # Now, write, to a specific filename without extensions
             design.write_oxdna_files(directory=tmpdir,
                                      filename_no_extension='oxdna-Export with spaces in name')
-            self.assertEqual(top, open(tmpdir + '/oxdna-Export with spaces in name.top').read())
-            self.assertEqual(dat, open(tmpdir + '/oxdna-Export with spaces in name.dat').read())
+            with open(tmpdir + '/oxdna-Export with spaces in name.top') as f:
+                self.assertEqual(top, f.read())
+
+            with open(tmpdir + '/oxdna-Export with spaces in name.dat') as f:
+                self.assertEqual(dat, f.read())
 
 
 class TestPlateMaps(unittest.TestCase):
@@ -8135,3 +8140,397 @@ def test_base_pairs_on_forward_strand_ahead_of_reverse_strand(self) -> None:
         self.assertIn(3, base_pairs[0])
         self.assertIn(4, base_pairs[0])
         self.assertIn(5, base_pairs[0])
+
+
+class TestHelixRollRelax(unittest.TestCase):
+
+    def setUp(self) -> None:
+        '''
+          0123456789012345678901234567890123456789
+        0 [---+[--------+[----------+
+              |         |           |
+        1 [---+<--------+<----------+
+
+        angle (fraction of 360)
+             4/10.5
+                     (14-10.5)/10.5 = 3.5/10.5
+                               (26-21)/10.5 = 5/10.5
+        '''
+        self.design2h = sc.Design(helices=[sc.Helix(max_offset=50) for _ in range(2)])
+        # helix 0 forward
+        self.design2h.draw_strand(0, 0).move(5).cross(1).move(-5)
+        self.design2h.draw_strand(0, 5).move(10).cross(1).move(-10)
+        self.design2h.draw_strand(0, 15).move(12).cross(1).move(-12)
+
+        '''
+          0123456789012345678901234567890123456789
+        0 [---+[--------+[----------+
+              |         |           |
+        1 [---+         |<----------+
+                        |
+        2      <--------+
+        '''
+        self.design3helix3strand = sc.Design(helices=[sc.Helix(max_offset=50) for _ in range(3)])
+        # helix 0 forward
+        self.design3helix3strand.draw_strand(0, 0).move(5).cross(1).move(-5)
+        self.design3helix3strand.draw_strand(0, 5).move(10).cross(2).move(-10)
+        self.design3helix3strand.draw_strand(0, 15).move(12).cross(1).move(-12)
+
+    def test_3_helix_2_crossovers(self) -> None:
+        '''
+          0         1
+          012345678901234
+        0 [---+[------+
+              |       |
+        1 [---+       |
+                      |
+        2      <------+
+        '''
+        helices = [sc.Helix(max_offset=60) for _ in range(3)]
+        helices[2].grid_position = (1, 0)
+        design3h = sc.Design(helices=helices, grid=sc.square)
+        design3h.draw_strand(0, 0).move(5).cross(1).move(-5)
+        design3h.draw_strand(0, 5).move(8).cross(2).move(-8)
+        f1 = 4 / 10.5
+        f2 = 12 / 10.5
+        a1 = f1 * 360 % 360
+        a2 = f2 * 360 % 360
+
+        # rules for angles:
+        # - add 150 if on reverse strand to account of minor groove
+        # - subtract angle of helix crossover is connecting to
+
+        ave_h0 = (a1 - 180 + a2 - 90) / 2  # helix 1 at 180 degrees, helix 2 at 90 degrees
+        exp_h0_roll = (-ave_h0) % 360
+
+        ave_h1 = a1 + 150  # helix 0 at 0 degrees relative to helix 1
+        exp_h1_roll = (-ave_h1) % 360
+
+        ave_h2 = a2 + 150 - (-90)  # helix 0 at -90 degrees relative to helix 2
+        exp_h2_roll = (-ave_h2) % 360
+
+        design3h.relax_helix_rolls()
+
+        self.assertAlmostEqual(exp_h0_roll, design3h.helices[0].roll)
+        self.assertAlmostEqual(exp_h1_roll, design3h.helices[1].roll)
+        self.assertAlmostEqual(exp_h2_roll, design3h.helices[2].roll)
+
+    def test_3_helix_6_crossover(self) -> None:
+        '''
+          0         1         2         3         4         5         6
+          012345678901234567890123456789012345678901234567890123456789
+        0 [---+[--------+[----------+[------+[--------+[--------+
+              |         |           |       |         |         |
+        1 [---+<--------+<----------+       |         |         |
+                                            |         |         |
+        2                            <------+<--------+<--------+
+
+        angle (fraction of 360)
+             4/10.5
+                     (15-10.5)/10.5 = 4.5/10.5
+                               (27-21)/10.5 = 6/10.5
+        '''
+        helices = [sc.Helix(max_offset=60) for _ in range(3)]
+        helices[2].grid_position = (1, 0)
+        design3h = sc.Design(helices=helices, grid=sc.square)
+        design3h.draw_strand(0, 0).move(5).cross(1).move(-5)
+        design3h.draw_strand(0, 5).move(10).cross(1).move(-10)
+        design3h.draw_strand(0, 15).move(12).cross(1).move(-12)
+        design3h.draw_strand(0, 27).move(7).cross(2).move(-7)
+        design3h.draw_strand(0, 34).move(10).cross(2).move(-10)
+        design3h.draw_strand(0, 44).move(10).cross(2).move(-10)
+
+        f1 = 4 / 10.5
+        f2 = 14 / 10.5
+        f3 = 26 / 10.5
+        f4 = 33 / 10.5
+        f5 = 43 / 10.5
+        f6 = 53 / 10.5
+        a1 = f1 * 360 % 360
+        a2 = f2 * 360 % 360
+        a3 = f3 * 360 % 360
+        a4 = f4 * 360 % 360
+        a5 = f5 * 360 % 360
+        a6 = f6 * 360 % 360
+
+        # rules for angles:
+        # - add 150 if on reverse strand to account of minor groove
+        # - subtract angle of helix crossover is connecting to
+
+        ave_h0 = (a1 - 180 + a2 - 180 + a3 - 180 + a4 - 90 + a5 - 90 + a6 - 90) / 6
+        exp_h0_roll = (-ave_h0) % 360
+
+        ave_h1 = (a1 + 150 + a2 + 150 + a3 + 150) / 3
+        exp_h1_roll = (-ave_h1) % 360
+
+        ave_h2 = (a4 + 150 - (- 90) + a5 + 150 - (- 90) + a6 + 150 - (- 90)) / 3
+        exp_h2_roll = (-ave_h2) % 360
+
+        design3h.relax_helix_rolls()
+
+        self.assertAlmostEqual(exp_h0_roll, design3h.helices[0].roll)
+        self.assertAlmostEqual(exp_h1_roll, design3h.helices[1].roll)
+        self.assertAlmostEqual(exp_h2_roll, design3h.helices[2].roll)
+
+    def test_2_helix_3_crossover(self) -> None:
+        f1 = 4 / 10.5
+        f2 = 14 / 10.5
+        f3 = 26 / 10.5
+        a1 = f1 * 360 % 360
+        a2 = f2 * 360 % 360
+        a3 = f3 * 360 % 360
+
+        ave = (a1 + a2 + a3) / 3
+        diff_from_optimal = 180 - ave
+
+        self.design2h.relax_helix_rolls()
+        actual_h0_roll = self.design2h.helices[0].roll % 360
+        actual_h1_roll = self.design2h.helices[1].roll % 360
+        exp_h0_roll = diff_from_optimal % 360
+        # add 180 since optimal roll of bottom helix is opposite that of top
+        # subtract minor_groove_angle since it's the reverse strand on the bottom helix
+        exp_h1_roll = (diff_from_optimal + 180 - self.design2h.geometry.minor_groove_angle) % 360
+        self.assertAlmostEqual(exp_h0_roll, actual_h0_roll)
+        self.assertAlmostEqual(exp_h1_roll, actual_h1_roll)
+
+    def test_helix_crossovers(self) -> None:
+        ############################################
+        # 3-helix design with 3 strands
+        xs0 = self.design3helix3strand.helices[0].crossovers()
+        self.assertEqual(len(xs0), 3)
+        o0, h0, f0 = xs0[0]
+        o1, h1, f1 = xs0[1]
+        o2, h2, f2 = xs0[2]
+        self.assertEqual(o0, 4)
+        self.assertEqual(o1, 14)
+        self.assertEqual(o2, 26)
+        self.assertEqual(h0, 1)
+        self.assertEqual(h1, 2)
+        self.assertEqual(h2, 1)
+        self.assertEqual(f0, True)
+        self.assertEqual(f1, True)
+        self.assertEqual(f2, True)
+
+        xs1 = self.design3helix3strand.helices[1].crossovers()
+        self.assertEqual(len(xs1), 2)
+        o0, h0, f0 = xs1[0]
+        o1, h1, f1 = xs1[1]
+        self.assertEqual(o0, 4)
+        self.assertEqual(o1, 26)
+        self.assertEqual(h0, 0)
+        self.assertEqual(h1, 0)
+        self.assertEqual(f0, False)
+        self.assertEqual(f1, False)
+
+        xs2 = self.design3helix3strand.helices[2].crossovers()
+        self.assertEqual(len(xs2), 1)
+        o0, h0, f0 = xs2[0]
+        self.assertEqual(o0, 14)
+        self.assertEqual(h0, 0)
+        self.assertEqual(h0, False)
+
+        ############################################
+        # 2-helix design
+        xs0 = self.design2h.helices[0].crossovers()
+        self.assertEqual(len(xs0), 3)
+        o0, h0, f0 = xs0[0]
+        o1, h1, f1 = xs0[1]
+        o2, h2, f2 = xs0[2]
+        self.assertEqual(o0, 4)
+        self.assertEqual(o1, 14)
+        self.assertEqual(o2, 26)
+        self.assertEqual(h0, 1)
+        self.assertEqual(h1, 1)
+        self.assertEqual(h2, 1)
+        self.assertEqual(h0, True)
+        self.assertEqual(h1, True)
+        self.assertEqual(h2, True)
+
+        xs1 = self.design2h.helices[1].crossovers()
+        self.assertEqual(len(xs1), 3)
+        o0, h0, f0 = xs1[0]
+        o1, h1, f1 = xs1[1]
+        o2, h2, f2 = xs1[2]
+        self.assertEqual(o0, 4)
+        self.assertEqual(o1, 14)
+        self.assertEqual(o2, 26)
+        self.assertEqual(h0, 0)
+        self.assertEqual(h1, 0)
+        self.assertEqual(h2, 0)
+        self.assertEqual(f0, False)
+        self.assertEqual(f1, False)
+        self.assertEqual(f2, False)
+
+    def test_minimum_strain_angle_0_10_20_relative_to_0(self) -> None:
+        relative_angles = [
+            (0, 0),
+            (10, 0),
+            (20, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 350.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_0_10_50_relative_to_0(self) -> None:
+        relative_angles = [
+            (0, 0),
+            (10, 0),
+            (50, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 340.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_0_10_80_relative_to_0(self) -> None:
+        relative_angles = [
+            (0, 0),
+            (10, 0),
+            (80, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 330.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_350_0_10_relative_to_0(self) -> None:
+        relative_angles = [
+            (350, 0),
+            (0, 0),
+            (10, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 0.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_350_0_40_relative_to_0(self) -> None:
+        relative_angles = [
+            (350, 0),
+            (0, 0),
+            (40, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 350.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_350_10_60_relative_to_0(self) -> None:
+        relative_angles = [
+            (350, 0),
+            (10, 0),
+            (60, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 340.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_350_10_60_relative_to_0_and_20_0_310_relative_to_10(self) -> None:
+        relative_angles = [
+            (350, 0),  # -10
+            (10, 0),  # 10
+            (60, 0),  # 60
+            ############ ave to 20
+            (20, 10),  # 10
+            (0, 10),  # -10
+            (340, 10),  # -30
+            ############ ave to -10
+            ############ total average is (20-10)/2 = 5, so 355 (-5) to correct it
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 355.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_179_181_relative_to_0(self) -> None:
+        relative_angles = [
+            (179, 0),
+            (181, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 180.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_181_183_relative_to_0(self) -> None:
+        relative_angles = [
+            (181, 0),
+            (183, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 178.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_minimum_strain_angle_174_179_184_relative_to_0(self) -> None:
+        relative_angles = [
+            (174, 0),
+            (179, 0),
+            (184, 0),
+        ]
+        act_min_strain_angle = sc.minimum_strain_angle(relative_angles)
+        exp_min_strain_angle = 181.0
+        self.assertAlmostEqual(exp_min_strain_angle, act_min_strain_angle)
+
+    def test_average_angle_1_359(self) -> None:
+        angles = [1, 359]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 0.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_10_350(self) -> None:
+        angles = [10, 350]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 0.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_30_350(self) -> None:
+        angles = [30, 350]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 10.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_0_10_20(self) -> None:
+        angles = [0, 10, 20]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 10.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_0_0_90(self) -> None:
+        angles = [0, 0, 90]
+        act_ave_angle = sc.average_angle(angles)
+        # exp_ave_angle_radians = math.atan2(1, 2)
+        # exp_ave_angle = math.degrees(exp_ave_angle_radians)
+        exp_ave_angle = 30.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_0_45_90(self) -> None:
+        angles = [0, 45, 90]
+        act_ave_angle = sc.average_angle(angles)
+        # exp_ave_angle_radians = math.atan2(1, 2)
+        # exp_ave_angle = math.degrees(exp_ave_angle_radians)
+        exp_ave_angle = 45.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_0_10_50(self) -> None:
+        angles = [0, 10, 50]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 20.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_0_10_80(self) -> None:
+        angles = [0, 10, 80]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 30.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_350_0_40(self) -> None:
+        angles = [350, 0, 40]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 10.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_330_40_50(self) -> None:
+        angles = [330, 40, 50]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 20.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
+
+    def test_average_angle_330_40_80(self) -> None:
+        angles = [330, 40, 80]
+        act_ave_angle = sc.average_angle(angles)
+        exp_ave_angle = 30.0
+        self.assertAlmostEqual(exp_ave_angle, act_ave_angle)
diff --git a/tests/test_excel_export_96.xls b/tests/test_excel_export_96.xls
new file mode 100644
index 00000000..bbdb3dd2
Binary files /dev/null and b/tests/test_excel_export_96.xls differ