1 Changelog

  • 20230508: Trying this out with a larger dataset, explicitly set wanted_z and wanted_channel for it.
  • 20230328: Reimplemented steps as functions, connected them in one set of calls.
  • 20230317: Initial cellpose implementation.
  • 20230315: Separation of input image into timepoints.
  • 20230310: Used geopandas to trace cells over time by position.
  • 20230307: Setting up my environment to handle ipynb and python markdown.

2 Introduction

Jacques is seeking to segment and follow cells over time.

Steps performed so far:

  1. Python/venv installation of fiji
  2. Figured out some easy interactions between python and actual image data.
  3. Implemented a simple function to find minimum distances between putative cells using the extant methods.

3 Next steps

  1. Note that the czi images are immediately openable via fiji’s bioformat interface.
  2. Load dataset via fiji
  3. Invoke cellpose via the python interface (same as pyimagej)
  4. Save ROIs produced by cellpose, save them to zip output file
  1. The roi interface in fiji can address these
  1. Currently a macro is invoked which performs a set of measurements on every ROI and saves them to a csv. This creates the primary data structure used for all following processes.
  2. Need to create a datastructure which identifies each individual cell over time given these ROIs which x/y/time(frame) along with the measurements of interest (area/mean/stdev/intensities by color).
    1. Small postprocessing details: the intensity values produced must be normalized by cell area.

4 Demonstrate the first couple of steps using an actual dataset

Jacques sent me an image acquired from the microscope and I saved it as ‘test_data/raw.tif’, he also sent me a cellpose model which I saved to the ‘models/’ directory.

Given these as a starting point, let us try to open the image with a fiji instance and split it into a series of smaller files by timepoint.

5 Implementation notes

I have been primarily using this as a way to refresh my brain on python and get current on best practices. Thus, there are decisions I made in this workbook which do not make sense in any other context: e.g. why would anyone have the primary data structure be a dictionary keyed by filename, that is dumb? I chose to do that to refresh myself on playing with dictionaries. By the same token, why would anyone make a dictionary of dataframes only to turn around and concatenate them for usage in geopandas, that is crazy? I did this to get more comfortable with pandas and get out some of my Rish muscle memory.

With that in mind, if we choose to make this a package, the first thing that will need to happen is to rework the base datastructure. I just want anyone who actually reads this code to know that yes, I am a nutter, but a nutter for a reason.

5.1 Load necessary python modules

from cellpose import models, io
from cellpose.io import *
from collections import defaultdict
import geopandas
import glob
import imagej
from jpype import JArray, JInt
import matplotlib.pyplot as plt
import multiprocessing as mp
import numpy as np
import os
import pandas
from pandas import DataFrame
from pathlib import Path
import scyjava
import seaborn
import shutil

5.2 Set up some initial variables

base_dir = Path('/lab/scratch/atb/imaging/mtb_2023').as_posix()
os.chdir(base_dir)
input_file = Path(f"{base_dir}/test_data/Experiment-1568.czi").as_posix()
pandas.set_option('display.max_columns', None)
verbose = True

5.3 Start imagej/fiji

Note that I am using fiji/imagej from within a virtual environment which I symbolically linked to the local directory ‘venv/’.

As a result, when I initialize fiji, I will call the base directory of the downloaded fiji tree within the virtual environment, which I somewhat erroneously put in bin/.

scyjava.config.add_option('-Xmx128g')
start_dir = os.getcwd()
ij = imagej.init(Path('venv/bin/Fiji.app'), mode = 'interactive')
ij.getApp().getInfo(True)
## 'ImageJ2 2.9.0/1.53t; Java 1.8.0_322 [amd64]; 122MB of 116508MB'
ij.ui().showUI()
## Something about this init() function changes the current working directory.
os.chdir(start_dir)
ij.getVersion()
## '2.9.0/1.53t'
showPolygonRoi = scyjava.jimport('ij.gui.PolygonRoi')
Overlay = scyjava.jimport('ij.gui.Overlay')
Regions = scyjava.jimport('net.imglib2.roi.Regions')
LabelRegions = scyjava.jimport('net.imglib2.roi.labeling.LabelRegions')
ZProjector = scyjava.jimport('ij.plugin.ZProjector')()
ov = Overlay()

5.4 Open the input file and split it by time

Open the file, figure out its dimensions, and write portions of it to an output directory.

I wrote this thinking I could parallelize the output writing to 8 cpus. But I think I do not yet understand how python scopes variables in this context and so it did not quite work. I turned that off for the moment and ran it and it finished in about a minute.

The following function may require a test to see if the output directory already exists because scijava will freak out.

def separate_slices(input_file, wanted_x = True, wanted_y = True,
                    wanted_z = 1, wanted_channel = 2, cpus = 8,
                    overwrite = False):
    """ Slice an image in preparation for cellpose.

    Eventually this should be smart enough to handle arbitrary
    x,y,z,channels,times as well as able to use multiple cpus for
    saving the data.  In its current implementation, it only saves 1
    z, 1 channel for every frame of an image into a series of files in
    its output directory.
    """

    input_base = os.path.basename(input_file)
    input_dir = os.path.dirname(input_file)
    input_name = os.path.splitext(input_base)[0]
    output_directory = Path(f"{input_dir}/outputs/{input_name}_z{wanted_z}").as_posix()
    os.makedirs(output_directory, exist_ok = True)
    if verbose:
        print("Starting to open the input file, this takes a moment.")
    raw_dataset = ij.io().open(input_file)
    if verbose:
        print(f"Opened input file, writing images to {output_directory}")

    data_info = {}
    for element in range(len(raw_dataset.dims)):
        name = raw_dataset.dims[element]
        data_info[name] = raw_dataset.shape[element]
    if verbose:
        print(f"This dataset has dimensions: X:{data_info['X']}",
              f"Y:{data_info['Y']} Z:{data_info['Z']} Time:{data_info['Time']}")

    slices = []
    for timepoint in range(data_info['Time']):
        wanted_slice = raw_dataset[:, :, wanted_channel, wanted_z, timepoint]
        slice_data = ij.py.to_dataset(wanted_slice)
        output_filename = Path(f"{output_directory}/frame_{timepoint}.tif").as_posix()
        if (os.path.exists(output_filename)):
            if overwrite:
                print(f"Rewriting {output_filename}")
                os.remove(output_filename)
                saved = ij.io().save(slice_data, output_filename)
            else:
                if verbose:
                    print(f"Skipping {output_filename}, it already exists.")
        else:
            saved = ij.io().save(slice_data, output_filename)
            if verbose:
                print(f"Saving image {input_name}_{timepoint}.")
        slices.append(wanted_slice)

    return raw_dataset, slices, output_directory

5.5 Cellpose

At this point we should have a directory containing files of individual timepoints. Jacques sent me an initial implementation of the usage of cellpose to call individual cells. Let us include that now. I think the previous function should probably also return the directory of the separated input files.

## Relevant options:
## batch_size(increase for more parallelization), channels(two element list of two element
## channels to segment; the first is the segment, second is optional nucleus;
## internal elements are color channels to query, so [[0,0],[2,3]] means do main cells in
## grayscale and a second with cells in blue, nuclei in green.
## channel_axis, z_axis ? invert (T/F flip pixels from b/w I assume),
## normalize(T/F percentile normalize the data), diameter, do_3d,
## anisotropy (rescaling factor for 3d segmentation), net_avg (average models),
## augment ?, tile ?, resample, interp, flow_threshold, cellprob_threshold (interesting),
## min_size (turned off with -1), stitch_threshold ?, rescale ?.
def invoke_cellpose(input_directory, model_file, channels = [[0, 0]], diameter = 160,
                    threshold = 0.4, do_3D = False, batch_size = 64, verbose = True):
    """ Invoke cellpose using individual slices.

    This takes the series of slices from separate_slices() and sends
    them to cellpose with a specific model.  The dictionary it returns
    is the primary datastructure for the various functions which follow.
    """

    ## Relevant options:
    ## model_type(cyto, nuclei, cyto2), net_avg(T/F if load built in networks and average them)
    model = models.CellposeModel(pretrained_model = model_file)
    files = get_image_files(input_directory, '_masks', look_one_level_down = False)
    imgs = []
    output_masks = []
    output_txts = []
    output_files = defaultdict(dict)
    existing_files = 0
    count = 0
    for one_file in files:
        print(f"Reading {one_file}")
        cp_output_directory = Path(f"{input_directory}/cellpose").as_posix()
        os.makedirs(cp_output_directory, exist_ok = True)
        f_name = os.path.basename(one_file)
        f_name = os.path.splitext(f_name)[0]
        start_mask = Path(f"{input_directory}/{f_name}_cp_masks.png").as_posix()
        output_mask = Path(f"{cp_output_directory}/{f_name}_cp_masks.png").as_posix()
        start_txt =  Path(f"{input_directory}/{f_name}_cp_outlines.txt").as_posix()
        output_txt = Path(f"{cp_output_directory}/{f_name}_cp_outlines.txt").as_posix()
        print(f"Adding new txt file: {output_txt}")
        output_files[f_name]['input_file'] = one_file
        output_files[f_name]['start_mask'] = start_mask
        output_files[f_name]['output_mask'] = output_mask
        output_files[f_name]['start_txt'] = start_txt
        output_files[f_name]['output_txt'] = output_txt
        output_files[f_name]['exists'] = False
        if (os.path.exists(output_txt)):
            existing_files = existing_files + 1
            output_files[f_name]['exists'] = True
        else:
            img = imread(one_file)
            imgs.append(img)
        count = count + 1
    nimg = len(imgs)
    if verbose and nimg > 0:
        print(f"Read {nimg} images, starting cellpose.")
        masks, flows, styles = model.eval(
            imgs, diameter = diameter, channels = channels, flow_threshold = threshold,
            do_3D = do_3D, batch_size = batch_size)
        io.save_to_png(imgs, masks, flows, files)
        for f_name in output_files:
            shutil.move(output_files[f_name][start_mask], output_files[f_name][output_mask])
            shutil.move(output_files[f_name][start_txt], output_files[f_name][output_txt])
    else:
        print("Returning the output files.")
    return output_files

5.6 Collapse Z

One possible change is to perform measurements on the sum of Z-stacks instead of a single slice. Thus we would sum the cells, create the ROIs using the single slice grayscale image, then measure the set of all combined.

def collapse_z(raw_dataset, cellpose_result, method = 'sum'):
    """ Stack multiple z slices for each timepoint.

    If I understand Jacques' explanation of the quantification methods
    correctly, they sometimes (often?) perform better on the
    z-integration of pixels at each timepoint.  This function performs
    that and sends the stacked slices to the output directory and adds
    the filenames to the cellpose_result dictionary.
    """
    cellpose_slices = list(cellpose_result.keys())
    slice_number = 0
    collapsed_slices = []
    for slice_name in cellpose_slices:
        output_directory = os.path.dirname(cellpose_result[slice_name]['output_txt'])
        collapsed_directory = os.path.dirname(output_directory)
        collapsed_directory = f"{collapsed_directory}/collapsed"
        os.makedirs(collapsed_directory, exist_ok = True)
        output_filename = Path(f"{collapsed_directory}/frame{slice_number}.tif").as_posix()
        cellpose_result[slice_name]['collapsed_file'] = output_filename
        if (os.path.exists(output_filename)):
            if verbose:
                print(f"Skipping {output_filename}, it already exists.")
        else:
            larger_slice = raw_dataset[:, :, :, :, slice_number]
            imp = ij.py.to_imageplus(larger_slice)
            z_projector_result = ZProjector.run(imp, method)
            ## z_projector_mask = ij.IJ.run(z_projector_result, "Convert to Mask", "method=Otsu background=Light")
            z_collapsed_image = ij.py.from_java(z_projector_result)
            z_collapsed_dataset = ij.py.to_dataset(z_collapsed_image)
            saved = ij.io().save(z_collapsed_dataset, output_filename)
            if verbose:
                print(f"Saving image {output_filename}.")
        slice_number = slice_number + 1
    return cellpose_result

6 Create Regions of interest from cellpose outputs

In Jacques notebook, it looks like he only extracts ROIs from one of the cellpose slices. I am assuming the goal is to extend this across all images?

There is an important caveat that I missed: imagej comes with a python2-based scripting language from which it appears some of his code is coming. As a result I should look carefully before using it, and pay close attention to the examples provided here for the most appropriate ways of interacting with the ROI manager etc:

https://github.com/imagej/pyimagej/blob/main/doc/examples/blob_detection_interactive.py

## The following is from a mix of a couple of implementations I found:
## https://pyimagej.readthedocs.io/en/latest/Classic-Segmentation.html
## an alternative method may be taken from:
## https://pyimagej.readthedocs.io/en/latest/Classic-Segmentation.html#segmentation-workflow-with-imagej2
## My goal is to pass the ROI regions to this function and create a similar df.
def slices_to_roi_measurements(cellpose_result, collapsed = False):
    """ Read the text cellpose output files, generate ROIs, and measure.

    I think there are better ways of accomplishing this task than
    using ij.IJ.run(); but this seems to work...  Upon completion,
    this function should add a series of dataframes to the
    cellpose_result dictionary which comprise the various metrics from
    ImageJ's measurement function of the ROIs detected by cellpose.
    """
    output_dict = cellpose_result
    cellpose_slices = list(cellpose_result.keys())
    slice_number = 0
    for slice_name in cellpose_slices:
        output_dict[slice_name]['slice_number'] = slice_number
        input_tif = ''
        if collapsed:
            input_tif = cellpose_result[slice_name]['collapsed_file']
        else:
            input_tif = cellpose_result[slice_name]['input_file']
        slice_dataset = ij.io().open(input_tif)
        slice_data = ij.py.to_imageplus(slice_dataset)
        input_txt = cellpose_result[slice_name]['output_txt']
        input_mask = cellpose_result[slice_name]['output_mask']
        if verbose:
            print(f"Processing cellpose outline: {input_txt}")
            print(f"Measuring: {input_tif}")
        # convert Dataset to ImagePlus
        imp = ij.py.to_imageplus(slice_data)
        rm = ij.RoiManager.getRoiManager()
        rm.runCommand("Associated", "true")
        rm.runCommand("show All with labels")
        ## The logic for this was taken from:
        ## https://stackoverflow.com/questions/73849418/is-there-any-way-to-switch-imagej-macro-code-to-python3-code
        txt_fh = open(input_txt, 'r')
        set_string = f'Set Measurements...'
        measure_string = f'area mean min centroid median skewness kurtosis integrated stack redirect=None decimal=3'
        ij.IJ.run(set_string, measure_string)
        roi_stats = defaultdict(list)
        for line in txt_fh:
            xy = line.rstrip().split(",")
            xy_coords = [int(element) for element in xy if element not in '']
            x_coords = [int(element) for element in xy[::2] if element not in '']
            y_coords = [int(element) for element in xy[1::2] if element not in '']
            xcoords_jint = JArray(JInt)(x_coords)
            ycoords_jint = JArray(JInt)(y_coords)
            polygon_roi_instance = scyjava.jimport('ij.gui.PolygonRoi')
            roi_instance = scyjava.jimport('ij.gui.Roi')
            imported_polygon = polygon_roi_instance(xcoords_jint, ycoords_jint,
                                                    len(x_coords), int(roi_instance.POLYGON))
            imp.setRoi(imported_polygon)
            rm.addRoi(imported_polygon)
            ij.IJ.run(imp, 'Measure', '')
        slice_result = ij.ResultsTable.getResultsTable()
        slice_table = ij.convert().convert(slice_result,
                                           scyjava.jimport('org.scijava.table.Table'))
        slice_measurements = ij.py.from_java(slice_table)
        output_dict[slice_name]['measurements'] = slice_measurements
        ij.IJ.run('Clear Results')
        txt_fh.close()
        imp.setOverlay(ov)
        imp.getProcessor().resetMinAndMax()
        slice_number = slice_number + 1
    return output_dict

7 Convert the slice measurements to pandas df

slices_to_roi_measurements() returns a dictionary with keys which are the filenames of each raw tif file. Each element of that dictionary is in turn a dictionary containing some information about the files along with a df of the measurements provided by imagej.

My little geopandas function assumes a single long df with some columns which tell it which timepoint. So lets make a quick function to give that here. OTOH it may be wiser/better to make some changes to slices_to_roi_measurements() so that it returns that format df; but since I am using this as a learning experience to get more comfortable with python data structures, I will not do it that way.

def convert_slices_to_pandas(slices):
    """ Dump the cellpose_result slice data to a single df.

    There is no good reason for me to store the data as a series of
    dataframes within a dictionary except I want to get more
    comfortable with python datastructures.  Thus, this function
    should be extraneous, but serves as a way to go from my hash to a
    single df.
    """
    concatenated = pandas.DataFrame()
    slice_keys = list(slices.keys())
    slice_counter = 0
    for k in slice_keys:
        slice_counter = slice_counter + 1
        current_slice = slices[k]
        if verbose:
            print(f"The slice is {k}")
        slice_number = current_slice['slice_number']
        slice_data = current_slice['measurements']
        slice_data['Frame'] = slice_number
        if (slice_counter == 1):
            concatenated = slice_data
        else:
            concatenated = pandas.concat([concatenated, slice_data])
    ## This is a little silly, but I couldn't remember that the index attribute
    ## is the numeric rowname for a moment
    ## The reset_index() does what it says on the tine, and changes the 1:19, 1:20, etc
    ## of each individual time Frame to a single range of 1:2000
    concatenated.index = concatenated.reset_index().index
    return concatenated

8 Create cell groups

def nearest_cells_over_time(df, max_dist = 10.0, max_prop = 0.7,
                            x_column = 'X', y_column = 'Y', verbose = True):
    """Trace cells over time

    If I understand Jacques' goals correctly, the tracing of cells
    over time should be a reasonably tractable problem for the various
    geo-statistics tools to handle; their whole purpose is to
    calculate n-dimensional distances.  So, let us pass my df to one
    of them and see what happens!

    Upon completion, we should get an array(dictionary? I forget) of
    arrays where each primary key is the top-level cell ID.  Each
    internal array is the set of IDs from the geopandas dataframe,
    which contains all of the measurements.  Thus, we can easily
    extract the data for individual cells and play with it.
    """
    gdf = geopandas.GeoDataFrame(
        df,
        geometry = geopandas.points_from_xy(df[x_column], df[y_column]))

    final_time = gdf.Frame.max()
    pairwise_distances = []
    for start_time in range(1, final_time):
        i = start_time
        j = i + 1
        ti_idx = gdf.Frame == i
        tj_idx = gdf.Frame == j
        if verbose:
            print(f"Getting distances of dfs {i} and {j}.")
        ti = gdf[ti_idx]
        tj = gdf[tj_idx]
        ti_rows = ti.shape[0]
        tj_rows = tj.shape[0]
        titj = geopandas.sjoin_nearest(ti, tj, distance_col = "pairwise_dist")
        pairwise_distances.append(titj)

    id_counter = 0
    ## Cell IDs pointing to a list of cells
    traced = {}
    ## Endpoints pointing to the cell IDs
    ends = {}
    for i in range(0, final_time - 1):
        query = pairwise_distances[i]
        passed_idx = query.pairwise_dist <= max_dist
        failed_idx = query.pairwise_dist > max_dist
        if (failed_idx.sum() > 0):
            if verbose:
                print(f"Skipped {failed_idx.sum()} elements in segment {i}.")
        query = query[passed_idx]

        prop_change = query.Area_left / query.Area_right
        increased_idx = prop_change > 1.0
        prop_change[increased_idx] = 1.0 / prop_change[increased_idx]
        failed_idx = prop_change < max_prop
        passed_idx = prop_change >= max_prop
        if (failed_idx.sum() > 0):
            if verbose:
                skip_string = (f"Skipped {failed_idx.sum()} elements in segment {i} ",
                               f"because the size changed too much.")
                print(skip_string)
            query = query[passed_idx]

        for row in query.itertuples():
            start_cell = row.Index
            end_cell = row.index_right
            if start_cell in ends.keys():
                cell_id = ends[start_cell]
                current_value = traced[cell_id]
                current_value.append(end_cell)
                traced[cell_id] = current_value
                ends[end_cell] = cell_id
            else:
                id_counter = id_counter + 1
                traced[id_counter] = [start_cell, end_cell]
                ends[end_cell] = id_counter
    return traced

9 Run the functions and plot the results

9.1 Separate slices

Note to self, Jacques’ new dataset uses wanted_z == 2, wanted_channel == 3.

raw_dataset, saved_slices, slice_directory = separate_slices(input_file, wanted_z = 2,
                                                             wanted_channel = 3)
## Starting to open the input file, this takes a moment.
## Opened input file, writing images to /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2
## This dataset has dimensions: X:2048 Y:2048 Z:11 Time:121
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_0.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_1.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_2.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_3.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_4.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_5.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_6.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_7.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_8.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_9.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_10.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_11.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_12.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_13.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_14.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_15.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_16.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_17.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_18.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_19.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_20.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_21.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_22.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_23.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_24.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_25.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_26.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_27.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_28.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_29.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_30.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_31.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_32.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_33.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_34.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_35.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_36.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_37.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_38.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_39.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_40.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_41.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_42.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_43.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_44.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_45.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_46.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_47.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_48.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_49.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_50.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_51.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_52.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_53.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_54.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_55.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_56.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_57.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_58.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_59.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_60.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_61.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_62.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_63.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_64.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_65.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_66.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_67.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_68.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_69.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_70.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_71.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_72.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_73.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_74.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_75.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_76.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_77.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_78.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_79.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_80.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_81.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_82.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_83.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_84.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_85.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_86.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_87.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_88.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_89.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_90.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_91.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_92.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_93.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_94.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_95.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_96.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_97.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_98.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_99.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_100.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_101.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_102.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_103.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_104.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_105.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_106.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_107.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_108.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_109.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_110.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_111.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_112.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_113.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_114.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_115.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_116.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_117.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_118.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_119.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_120.tif, it already exists.
## 
## [java.lang.Enum.toString] ZeissCZIReader initializing /lab/scratch/atb/imaging/mtb_2023/test_data/Experiment-1568.czi
## [java.lang.Enum.toString] [WARN] Unknown DetectorType value 'GaAsP-PMT' will be stored as "Other"
## [java.lang.Enum.toString] [WARN] Unknown DetectorType value 'GaAsP-PMT' will be stored as "Other"
## [java.lang.Enum.toString] [WARN] Unknown DetectorType value 'GaAsP-PMT' will be stored as "Other"
## [java.lang.Enum.toString] [WARN] Unknown DetectorType value 'Multialkali-PMT' will be stored as "Other"

9.2 Invoke cellpose

cellpose_result = invoke_cellpose(slice_directory, 'models/CP_20220523_104016')
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_0.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_0_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_1.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_1_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_2.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_2_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_3.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_3_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_4.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_4_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_5.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_5_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_6.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_6_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_7.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_7_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_8.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_8_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_9.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_9_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_10.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_10_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_11.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_11_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_12.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_12_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_13.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_13_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_14.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_14_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_15.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_15_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_16.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_16_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_17.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_17_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_18.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_18_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_19.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_19_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_20.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_20_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_21.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_21_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_22.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_22_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_23.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_23_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_24.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_24_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_25.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_25_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_26.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_26_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_27.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_27_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_28.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_28_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_29.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_29_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_30.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_30_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_31.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_31_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_32.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_32_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_33.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_33_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_34.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_34_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_35.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_35_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_36.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_36_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_37.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_37_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_38.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_38_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_39.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_39_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_40.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_40_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_41.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_41_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_42.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_42_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_43.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_43_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_44.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_44_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_45.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_45_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_46.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_46_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_47.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_47_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_48.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_48_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_49.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_49_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_50.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_50_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_51.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_51_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_52.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_52_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_53.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_53_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_54.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_54_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_55.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_55_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_56.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_56_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_57.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_57_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_58.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_58_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_59.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_59_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_60.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_60_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_61.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_61_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_62.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_62_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_63.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_63_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_64.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_64_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_65.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_65_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_66.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_66_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_67.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_67_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_68.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_68_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_69.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_69_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_70.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_70_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_71.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_71_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_72.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_72_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_73.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_73_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_74.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_74_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_75.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_75_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_76.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_76_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_77.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_77_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_78.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_78_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_79.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_79_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_80.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_80_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_81.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_81_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_82.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_82_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_83.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_83_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_84.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_84_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_85.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_85_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_86.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_86_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_87.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_87_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_88.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_88_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_89.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_89_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_90.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_90_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_91.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_91_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_92.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_92_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_93.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_93_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_94.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_94_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_95.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_95_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_96.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_96_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_97.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_97_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_98.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_98_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_99.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_99_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_100.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_100_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_101.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_101_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_102.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_102_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_103.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_103_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_104.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_104_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_105.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_105_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_106.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_106_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_107.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_107_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_108.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_108_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_109.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_109_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_110.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_110_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_111.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_111_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_112.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_112_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_113.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_113_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_114.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_114_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_115.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_115_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_116.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_116_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_117.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_117_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_118.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_118_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_119.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_119_cp_outlines.txt
## Reading /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/frame_120.tif
## Adding new txt file: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_120_cp_outlines.txt
## Returning the output files.

9.3 collapse Z

cellpose_result = collapse_z(raw_dataset, cellpose_result)
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame0.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame1.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame2.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame3.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame4.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame5.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame6.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame7.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame8.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame9.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame10.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame11.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame12.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame13.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame14.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame15.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame16.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame17.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame18.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame19.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame20.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame21.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame22.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame23.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame24.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame25.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame26.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame27.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame28.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame29.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame30.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame31.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame32.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame33.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame34.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame35.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame36.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame37.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame38.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame39.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame40.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame41.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame42.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame43.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame44.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame45.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame46.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame47.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame48.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame49.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame50.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame51.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame52.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame53.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame54.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame55.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame56.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame57.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame58.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame59.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame60.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame61.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame62.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame63.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame64.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame65.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame66.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame67.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame68.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame69.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame70.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame71.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame72.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame73.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame74.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame75.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame76.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame77.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame78.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame79.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame80.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame81.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame82.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame83.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame84.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame85.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame86.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame87.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame88.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame89.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame90.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame91.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame92.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame93.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame94.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame95.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame96.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame97.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame98.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame99.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame100.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame101.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame102.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame103.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame104.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame105.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame106.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame107.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame108.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame109.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame110.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame111.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame112.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame113.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame114.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame115.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame116.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame117.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame118.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame119.tif, it already exists.
## Skipping /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame120.tif, it already exists.

9.4 Measure ROIs

slice_measurements = slices_to_roi_measurements(cellpose_result, collapsed = True)
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_0_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame0.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_1_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame1.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_2_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame2.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_3_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame3.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_4_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame4.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_5_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame5.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_6_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame6.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_7_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame7.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_8_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame8.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_9_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame9.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_10_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame10.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_11_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame11.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_12_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame12.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_13_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame13.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_14_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame14.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_15_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame15.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_16_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame16.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_17_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame17.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_18_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame18.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_19_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame19.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_20_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame20.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_21_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame21.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_22_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame22.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_23_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame23.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_24_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame24.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_25_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame25.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_26_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame26.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_27_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame27.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_28_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame28.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_29_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame29.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_30_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame30.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_31_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame31.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_32_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame32.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_33_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame33.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_34_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame34.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_35_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame35.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_36_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame36.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_37_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame37.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_38_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame38.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_39_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame39.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_40_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame40.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_41_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame41.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_42_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame42.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_43_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame43.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_44_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame44.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_45_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame45.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_46_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame46.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_47_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame47.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_48_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame48.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_49_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame49.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_50_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame50.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_51_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame51.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_52_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame52.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_53_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame53.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_54_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame54.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_55_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame55.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_56_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame56.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_57_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame57.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_58_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame58.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_59_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame59.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_60_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame60.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_61_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame61.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_62_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame62.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_63_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame63.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_64_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame64.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_65_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame65.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_66_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame66.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_67_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame67.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_68_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame68.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_69_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame69.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_70_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame70.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_71_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame71.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_72_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame72.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_73_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame73.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_74_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame74.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_75_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame75.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_76_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame76.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_77_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame77.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_78_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame78.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_79_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame79.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_80_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame80.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_81_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame81.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_82_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame82.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_83_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame83.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_84_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame84.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_85_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame85.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_86_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame86.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_87_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame87.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_88_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame88.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_89_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame89.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_90_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame90.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_91_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame91.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_92_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame92.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_93_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame93.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_94_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame94.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_95_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame95.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_96_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame96.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_97_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame97.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_98_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame98.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_99_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame99.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_100_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame100.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_101_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame101.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_102_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame102.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_103_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame103.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_104_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame104.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_105_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame105.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_106_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame106.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_107_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame107.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_108_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame108.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_109_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame109.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_110_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame110.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_111_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame111.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_112_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame112.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_113_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame113.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_114_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame114.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_115_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame115.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_116_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame116.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_117_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame117.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_118_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame118.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_119_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame119.tif
## Processing cellpose outline: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/cellpose/frame_120_cp_outlines.txt
## Measuring: /lab/scratch/atb/imaging/mtb_2023/test_data/outputs/Experiment-1568_z2/collapsed/frame120.tif

9.5 Convert to pandas

concatenated = convert_slices_to_pandas(slice_measurements)
## The slice is frame_0
## The slice is frame_1
## The slice is frame_2
## The slice is frame_3
## The slice is frame_4
## The slice is frame_5
## The slice is frame_6
## The slice is frame_7
## The slice is frame_8
## The slice is frame_9
## The slice is frame_10
## The slice is frame_11
## The slice is frame_12
## The slice is frame_13
## The slice is frame_14
## The slice is frame_15
## The slice is frame_16
## The slice is frame_17
## The slice is frame_18
## The slice is frame_19
## The slice is frame_20
## The slice is frame_21
## The slice is frame_22
## The slice is frame_23
## The slice is frame_24
## The slice is frame_25
## The slice is frame_26
## The slice is frame_27
## The slice is frame_28
## The slice is frame_29
## The slice is frame_30
## The slice is frame_31
## The slice is frame_32
## The slice is frame_33
## The slice is frame_34
## The slice is frame_35
## The slice is frame_36
## The slice is frame_37
## The slice is frame_38
## The slice is frame_39
## The slice is frame_40
## The slice is frame_41
## The slice is frame_42
## The slice is frame_43
## The slice is frame_44
## The slice is frame_45
## The slice is frame_46
## The slice is frame_47
## The slice is frame_48
## The slice is frame_49
## The slice is frame_50
## The slice is frame_51
## The slice is frame_52
## The slice is frame_53
## The slice is frame_54
## The slice is frame_55
## The slice is frame_56
## The slice is frame_57
## The slice is frame_58
## The slice is frame_59
## The slice is frame_60
## The slice is frame_61
## The slice is frame_62
## The slice is frame_63
## The slice is frame_64
## The slice is frame_65
## The slice is frame_66
## The slice is frame_67
## The slice is frame_68
## The slice is frame_69
## The slice is frame_70
## The slice is frame_71
## The slice is frame_72
## The slice is frame_73
## The slice is frame_74
## The slice is frame_75
## The slice is frame_76
## The slice is frame_77
## The slice is frame_78
## The slice is frame_79
## The slice is frame_80
## The slice is frame_81
## The slice is frame_82
## The slice is frame_83
## The slice is frame_84
## The slice is frame_85
## The slice is frame_86
## The slice is frame_87
## The slice is frame_88
## The slice is frame_89
## The slice is frame_90
## The slice is frame_91
## The slice is frame_92
## The slice is frame_93
## The slice is frame_94
## The slice is frame_95
## The slice is frame_96
## The slice is frame_97
## The slice is frame_98
## The slice is frame_99
## The slice is frame_100
## The slice is frame_101
## The slice is frame_102
## The slice is frame_103
## The slice is frame_104
## The slice is frame_105
## The slice is frame_106
## The slice is frame_107
## The slice is frame_108
## The slice is frame_109
## The slice is frame_110
## The slice is frame_111
## The slice is frame_112
## The slice is frame_113
## The slice is frame_114
## The slice is frame_115
## The slice is frame_116
## The slice is frame_117
## The slice is frame_118
## The slice is frame_119
## The slice is frame_120

9.6 Find nearest

nearest = nearest_cells_over_time(concatenated, max_dist = 10.0,
                                  x_column = 'X', y_column = 'Y')
## Getting distances of dfs 1 and 2.
## Getting distances of dfs 2 and 3.
## Getting distances of dfs 3 and 4.
## Getting distances of dfs 4 and 5.
## Getting distances of dfs 5 and 6.
## Getting distances of dfs 6 and 7.
## Getting distances of dfs 7 and 8.
## Getting distances of dfs 8 and 9.
## Getting distances of dfs 9 and 10.
## Getting distances of dfs 10 and 11.
## Getting distances of dfs 11 and 12.
## Getting distances of dfs 12 and 13.
## Getting distances of dfs 13 and 14.
## Getting distances of dfs 14 and 15.
## Getting distances of dfs 15 and 16.
## Getting distances of dfs 16 and 17.
## Getting distances of dfs 17 and 18.
## Getting distances of dfs 18 and 19.
## Getting distances of dfs 19 and 20.
## Getting distances of dfs 20 and 21.
## Getting distances of dfs 21 and 22.
## Getting distances of dfs 22 and 23.
## Getting distances of dfs 23 and 24.
## Getting distances of dfs 24 and 25.
## Getting distances of dfs 25 and 26.
## Getting distances of dfs 26 and 27.
## Getting distances of dfs 27 and 28.
## Getting distances of dfs 28 and 29.
## Getting distances of dfs 29 and 30.
## Getting distances of dfs 30 and 31.
## Getting distances of dfs 31 and 32.
## Getting distances of dfs 32 and 33.
## Getting distances of dfs 33 and 34.
## Getting distances of dfs 34 and 35.
## Getting distances of dfs 35 and 36.
## Getting distances of dfs 36 and 37.
## Getting distances of dfs 37 and 38.
## Getting distances of dfs 38 and 39.
## Getting distances of dfs 39 and 40.
## Getting distances of dfs 40 and 41.
## Getting distances of dfs 41 and 42.
## Getting distances of dfs 42 and 43.
## Getting distances of dfs 43 and 44.
## Getting distances of dfs 44 and 45.
## Getting distances of dfs 45 and 46.
## Getting distances of dfs 46 and 47.
## Getting distances of dfs 47 and 48.
## Getting distances of dfs 48 and 49.
## Getting distances of dfs 49 and 50.
## Getting distances of dfs 50 and 51.
## Getting distances of dfs 51 and 52.
## Getting distances of dfs 52 and 53.
## Getting distances of dfs 53 and 54.
## Getting distances of dfs 54 and 55.
## Getting distances of dfs 55 and 56.
## Getting distances of dfs 56 and 57.
## Getting distances of dfs 57 and 58.
## Getting distances of dfs 58 and 59.
## Getting distances of dfs 59 and 60.
## Getting distances of dfs 60 and 61.
## Getting distances of dfs 61 and 62.
## Getting distances of dfs 62 and 63.
## Getting distances of dfs 63 and 64.
## Getting distances of dfs 64 and 65.
## Getting distances of dfs 65 and 66.
## Getting distances of dfs 66 and 67.
## Getting distances of dfs 67 and 68.
## Getting distances of dfs 68 and 69.
## Getting distances of dfs 69 and 70.
## Getting distances of dfs 70 and 71.
## Getting distances of dfs 71 and 72.
## Getting distances of dfs 72 and 73.
## Getting distances of dfs 73 and 74.
## Getting distances of dfs 74 and 75.
## Getting distances of dfs 75 and 76.
## Getting distances of dfs 76 and 77.
## Getting distances of dfs 77 and 78.
## Getting distances of dfs 78 and 79.
## Getting distances of dfs 79 and 80.
## Getting distances of dfs 80 and 81.
## Getting distances of dfs 81 and 82.
## Getting distances of dfs 82 and 83.
## Getting distances of dfs 83 and 84.
## Getting distances of dfs 84 and 85.
## Getting distances of dfs 85 and 86.
## Getting distances of dfs 86 and 87.
## Getting distances of dfs 87 and 88.
## Getting distances of dfs 88 and 89.
## Getting distances of dfs 89 and 90.
## Getting distances of dfs 90 and 91.
## Getting distances of dfs 91 and 92.
## Getting distances of dfs 92 and 93.
## Getting distances of dfs 93 and 94.
## Getting distances of dfs 94 and 95.
## Getting distances of dfs 95 and 96.
## Getting distances of dfs 96 and 97.
## Getting distances of dfs 97 and 98.
## Getting distances of dfs 98 and 99.
## Getting distances of dfs 99 and 100.
## Getting distances of dfs 100 and 101.
## Getting distances of dfs 101 and 102.
## Getting distances of dfs 102 and 103.
## Getting distances of dfs 103 and 104.
## Getting distances of dfs 104 and 105.
## Getting distances of dfs 105 and 106.
## Getting distances of dfs 106 and 107.
## Getting distances of dfs 107 and 108.
## Getting distances of dfs 108 and 109.
## Getting distances of dfs 109 and 110.
## Getting distances of dfs 110 and 111.
## Getting distances of dfs 111 and 112.
## Getting distances of dfs 112 and 113.
## Getting distances of dfs 113 and 114.
## Getting distances of dfs 114 and 115.
## Getting distances of dfs 115 and 116.
## Getting distances of dfs 116 and 117.
## Getting distances of dfs 117 and 118.
## Getting distances of dfs 118 and 119.
## Getting distances of dfs 119 and 120.
## Skipped 33 elements in segment 0.
## Skipped 31 elements in segment 1.
## ('Skipped 1 elements in segment 1 ', 'because the size changed too much.')
## Skipped 27 elements in segment 2.
## Skipped 24 elements in segment 3.
## Skipped 25 elements in segment 4.
## Skipped 18 elements in segment 5.
## Skipped 24 elements in segment 6.
## Skipped 25 elements in segment 7.
## Skipped 26 elements in segment 8.
## ('Skipped 1 elements in segment 8 ', 'because the size changed too much.')
## Skipped 21 elements in segment 9.
## Skipped 23 elements in segment 10.
## Skipped 16 elements in segment 11.
## Skipped 20 elements in segment 12.
## Skipped 20 elements in segment 13.
## ('Skipped 1 elements in segment 13 ', 'because the size changed too much.')
## Skipped 20 elements in segment 14.
## ('Skipped 1 elements in segment 14 ', 'because the size changed too much.')
## Skipped 18 elements in segment 15.
## Skipped 18 elements in segment 16.
## Skipped 22 elements in segment 17.
## Skipped 14 elements in segment 18.
## Skipped 22 elements in segment 19.
## Skipped 20 elements in segment 20.
## Skipped 27 elements in segment 21.
## Skipped 20 elements in segment 22.
## Skipped 17 elements in segment 23.
## ('Skipped 1 elements in segment 23 ', 'because the size changed too much.')
## Skipped 17 elements in segment 24.
## Skipped 14 elements in segment 25.
## Skipped 16 elements in segment 26.
## Skipped 14 elements in segment 27.
## Skipped 16 elements in segment 28.
## ('Skipped 1 elements in segment 28 ', 'because the size changed too much.')
## Skipped 15 elements in segment 29.
## Skipped 23 elements in segment 30.
## Skipped 17 elements in segment 31.
## Skipped 19 elements in segment 32.
## Skipped 16 elements in segment 33.
## Skipped 15 elements in segment 34.
## Skipped 12 elements in segment 35.
## Skipped 19 elements in segment 36.
## Skipped 14 elements in segment 37.
## ('Skipped 1 elements in segment 37 ', 'because the size changed too much.')
## Skipped 16 elements in segment 38.
## ('Skipped 1 elements in segment 38 ', 'because the size changed too much.')
## Skipped 17 elements in segment 39.
## Skipped 16 elements in segment 40.
## Skipped 15 elements in segment 41.
## ('Skipped 2 elements in segment 41 ', 'because the size changed too much.')
## Skipped 10 elements in segment 42.
## Skipped 15 elements in segment 43.
## Skipped 11 elements in segment 44.
## Skipped 13 elements in segment 45.
## Skipped 8 elements in segment 46.
## Skipped 13 elements in segment 47.
## Skipped 12 elements in segment 48.
## Skipped 16 elements in segment 49.
## Skipped 13 elements in segment 50.
## Skipped 14 elements in segment 51.
## Skipped 15 elements in segment 52.
## Skipped 13 elements in segment 53.
## Skipped 13 elements in segment 54.
## Skipped 15 elements in segment 55.
## Skipped 18 elements in segment 56.
## Skipped 15 elements in segment 57.
## Skipped 10 elements in segment 58.
## ('Skipped 1 elements in segment 58 ', 'because the size changed too much.')
## Skipped 13 elements in segment 59.
## Skipped 11 elements in segment 60.
## Skipped 11 elements in segment 61.
## ('Skipped 1 elements in segment 61 ', 'because the size changed too much.')
## Skipped 11 elements in segment 62.
## ('Skipped 2 elements in segment 62 ', 'because the size changed too much.')
## Skipped 10 elements in segment 63.
## Skipped 11 elements in segment 64.
## Skipped 14 elements in segment 65.
## Skipped 17 elements in segment 66.
## Skipped 15 elements in segment 67.
## Skipped 17 elements in segment 68.
## Skipped 19 elements in segment 69.
## Skipped 14 elements in segment 70.
## Skipped 15 elements in segment 71.
## ('Skipped 1 elements in segment 71 ', 'because the size changed too much.')
## Skipped 13 elements in segment 72.
## Skipped 10 elements in segment 73.
## Skipped 13 elements in segment 74.
## Skipped 13 elements in segment 75.
## Skipped 16 elements in segment 76.
## ('Skipped 1 elements in segment 76 ', 'because the size changed too much.')
## Skipped 13 elements in segment 77.
## Skipped 15 elements in segment 78.
## Skipped 12 elements in segment 79.
## Skipped 11 elements in segment 80.
## Skipped 11 elements in segment 81.
## Skipped 13 elements in segment 82.
## Skipped 11 elements in segment 83.
## ('Skipped 1 elements in segment 83 ', 'because the size changed too much.')
## Skipped 12 elements in segment 84.
## Skipped 13 elements in segment 85.
## Skipped 13 elements in segment 86.
## ('Skipped 1 elements in segment 86 ', 'because the size changed too much.')
## Skipped 10 elements in segment 87.
## Skipped 11 elements in segment 88.
## Skipped 15 elements in segment 89.
## Skipped 13 elements in segment 90.
## Skipped 11 elements in segment 91.
## Skipped 10 elements in segment 92.
## ('Skipped 1 elements in segment 92 ', 'because the size changed too much.')
## Skipped 15 elements in segment 93.
## Skipped 10 elements in segment 94.
## Skipped 12 elements in segment 95.
## Skipped 9 elements in segment 96.
## Skipped 14 elements in segment 97.
## Skipped 11 elements in segment 98.
## ('Skipped 1 elements in segment 98 ', 'because the size changed too much.')
## Skipped 13 elements in segment 99.
## Skipped 14 elements in segment 100.
## Skipped 14 elements in segment 101.
## Skipped 12 elements in segment 102.
## ('Skipped 1 elements in segment 102 ', 'because the size changed too much.')
## Skipped 8 elements in segment 103.
## ('Skipped 1 elements in segment 103 ', 'because the size changed too much.')
## Skipped 11 elements in segment 104.
## Skipped 11 elements in segment 105.
## Skipped 8 elements in segment 106.
## Skipped 11 elements in segment 107.
## Skipped 9 elements in segment 108.
## ('Skipped 1 elements in segment 108 ', 'because the size changed too much.')
## Skipped 8 elements in segment 109.
## ('Skipped 1 elements in segment 109 ', 'because the size changed too much.')
## Skipped 11 elements in segment 110.
## Skipped 8 elements in segment 111.
## Skipped 10 elements in segment 112.
## Skipped 11 elements in segment 113.
## Skipped 11 elements in segment 114.
## Skipped 9 elements in segment 115.
## ('Skipped 1 elements in segment 115 ', 'because the size changed too much.')
## Skipped 14 elements in segment 116.
## Skipped 10 elements in segment 117.
## Skipped 11 elements in segment 118.

9.7 Get information from a group of cells

As a final step, we should be able to extract and play with the information from one or more groups of cells.

cell_id = 129
cell_idx = nearest[cell_id]
cell_data = concatenated.loc[cell_idx]
len(cell_data)
## 2
cell_data = cell_data.reset_index()

scatter = plt.scatter(cell_data['X'], cell_data['Y'])
final_row = cell_data.index.max()
for start_time in range(0, final_row - 1):
    ti_idx = cell_data.index == start_time
    tj_idx = cell_data.index == start_time + 1
    p1x = cell_data[ti_idx].X
    p2x = cell_data[tj_idx].X
    p1y = cell_data[ti_idx].Y
    p2y = cell_data[tj_idx].Y
    x_points = [p1x, p2x]
    y_points = [p1y, p2y]
    plt.plot(x_points, y_points)
finalm1_idx = cell_data.index == final_row - 1
final_idx = cell_data.index == final_row
finalm1_x = cell_data[finalm1_idx].X
final_x = cell_data[final_idx].X
finalm1_y = cell_data[finalm1_idx].Y
final_y = cell_data[final_idx].Y
x_points = [finalm1_x, final_x]
y_points = [finalm1_y, final_y]
plt.plot(x_points, y_points)
plt.show()

seaborn.violinplot(data = cell_data.Area)
plt.show()

pander::pander(sessionInfo())

R version 4.2.0 (2022-04-22)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=en_US.UTF-8, LC_ADDRESS=en_US.UTF-8, LC_TELEPHONE=en_US.UTF-8, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=en_US.UTF-8

attached base packages: stats4, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: reticulate(v.1.28), spatstat.geom(v.3.1-0), spatstat.data(v.3.0-1), hpgltools(v.1.0), testthat(v.3.1.7), SummarizedExperiment(v.1.28.0), GenomicRanges(v.1.50.2), GenomeInfoDb(v.1.34.9), IRanges(v.2.32.0), S4Vectors(v.0.36.2), MatrixGenerics(v.1.10.0), matrixStats(v.0.63.0), Biobase(v.2.58.0) and BiocGenerics(v.0.44.0)

loaded via a namespace (and not attached): rappdirs(v.0.3.3), rtracklayer(v.1.58.0), tidyr(v.1.3.0), ggplot2(v.3.4.2), clusterGeneration(v.1.3.7), bit64(v.4.0.5), knitr(v.1.42), DelayedArray(v.0.24.0), data.table(v.1.14.8), KEGGREST(v.1.38.0), RCurl(v.1.98-1.12), doParallel(v.1.0.17), generics(v.0.1.3), GenomicFeatures(v.1.50.4), callr(v.3.7.3), RhpcBLASctl(v.0.23-42), cowplot(v.1.1.1), usethis(v.2.1.6), RSQLite(v.2.3.1), shadowtext(v.0.1.2), bit(v.4.0.5), enrichplot(v.1.18.3), xml2(v.1.3.3), httpuv(v.1.6.9), viridis(v.0.6.2), xfun(v.0.38), hms(v.1.1.3), jquerylib(v.0.1.4), evaluate(v.0.20), promises(v.1.2.0.1), fansi(v.1.0.4), restfulr(v.0.0.15), progress(v.1.2.2), caTools(v.1.18.2), dbplyr(v.2.3.2), igraph(v.1.4.1), DBI(v.1.1.3), htmlwidgets(v.1.6.2), purrr(v.1.0.1), ellipsis(v.0.3.2), dplyr(v.1.1.1), backports(v.1.4.1), annotate(v.1.76.0), aod(v.1.3.2), biomaRt(v.2.54.1), deldir(v.1.0-6), vctrs(v.0.6.1), remotes(v.2.4.2), here(v.1.0.1), cachem(v.1.0.7), withr(v.2.5.0), ggforce(v.0.4.1), HDO.db(v.0.99.1), GenomicAlignments(v.1.34.1), treeio(v.1.22.0), prettyunits(v.1.1.1), DOSE(v.3.24.2), ape(v.5.7-1), lazyeval(v.0.2.2), crayon(v.1.5.2), genefilter(v.1.80.3), edgeR(v.3.40.2), pkgconfig(v.2.0.3), tweenr(v.2.0.2), nlme(v.3.1-162), pkgload(v.1.3.2), devtools(v.2.4.5), rlang(v.1.1.0), lifecycle(v.1.0.3), miniUI(v.0.1.1.1), downloader(v.0.4), filelock(v.1.0.2), BiocFileCache(v.2.6.1), rprojroot(v.2.0.3), polyclip(v.1.10-4), graph(v.1.76.0), Matrix(v.1.5-4), aplot(v.0.1.10), boot(v.1.3-28.1), processx(v.3.8.0), png(v.0.1-8), viridisLite(v.0.4.1), rjson(v.0.2.21), bitops(v.1.0-7), gson(v.0.1.0), KernSmooth(v.2.23-20), pander(v.0.6.5), Biostrings(v.2.66.0), blob(v.1.2.4), stringr(v.1.5.0), qvalue(v.2.30.0), remaCor(v.0.0.11), gridGraphics(v.0.5-1), scales(v.1.2.1), memoise(v.2.0.1), GSEABase(v.1.60.0), magrittr(v.2.0.3), plyr(v.1.8.8), gplots(v.3.1.3), zlibbioc(v.1.44.0), compiler(v.4.2.0), scatterpie(v.0.1.8), BiocIO(v.1.8.0), RColorBrewer(v.1.1-3), lme4(v.1.1-32), Rsamtools(v.2.14.0), cli(v.3.6.1), XVector(v.0.38.0), urlchecker(v.1.0.1), patchwork(v.1.1.2), ps(v.1.7.4), MASS(v.7.3-58.3), mgcv(v.1.8-41), tidyselect(v.1.2.0), stringi(v.1.7.12), highr(v.0.10), yaml(v.2.3.7), GOSemSim(v.2.24.0), locfit(v.1.5-9.7), ggrepel(v.0.9.3), grid(v.4.2.0), sass(v.0.4.5), fastmatch(v.1.1-3), tools(v.4.2.0), parallel(v.4.2.0), rstudioapi(v.0.14), foreach(v.1.5.2), gridExtra(v.2.3), farver(v.2.1.1), ggraph(v.2.1.0), digest(v.0.6.31), shiny(v.1.7.4), Rcpp(v.1.0.10), broom(v.1.0.4), later(v.1.3.0), httr(v.1.4.5), AnnotationDbi(v.1.60.2), Rdpack(v.2.4), colorspace(v.2.1-0), brio(v.1.1.3), XML(v.3.99-0.14), fs(v.1.6.1), splines(v.4.2.0), yulab.utils(v.0.0.6), PROPER(v.1.30.0), tidytree(v.0.4.2), spatstat.utils(v.3.0-2), graphlayouts(v.0.8.4), ggplotify(v.0.1.0), plotly(v.4.10.1), sessioninfo(v.1.2.2), xtable(v.1.8-4), jsonlite(v.1.8.4), nloptr(v.2.0.3), ggtree(v.3.6.2), tidygraph(v.1.2.3), ggfun(v.0.0.9), R6(v.2.5.1), RUnit(v.0.4.32), profvis(v.0.3.7), pillar(v.1.9.0), htmltools(v.0.5.5), mime(v.0.12), glue(v.1.6.2), fastmap(v.1.1.1), minqa(v.1.2.5), clusterProfiler(v.4.6.2), BiocParallel(v.1.32.6), codetools(v.0.2-19), fgsea(v.1.24.0), pkgbuild(v.1.4.0), mvtnorm(v.1.1-3), utf8(v.1.2.3), lattice(v.0.20-45), bslib(v.0.4.2), tibble(v.3.2.1), sva(v.3.46.0), pbkrtest(v.0.5.2), curl(v.5.0.0), gtools(v.3.9.4), GO.db(v.3.16.0), survival(v.3.5-5), limma(v.3.54.2), rmarkdown(v.2.21), desc(v.1.4.2), munsell(v.0.5.0), GenomeInfoDbData(v.1.2.9), iterators(v.1.0.14), variancePartition(v.1.28.9), reshape2(v.1.4.4), gtable(v.0.3.3) and rbibutils(v.2.2.13)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset bbc75e24b763faa635cb62c86fc51c0efb3424a1
## This is hpgltools commit: Fri Apr 21 14:33:16 2023 -0400: bbc75e24b763faa635cb62c86fc51c0efb3424a1
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
## Saving to index_functions_big-v20230509.rda.xz
tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiTm90ZXMgZm9yIEphY3F1ZXMgaW1hZ2VzLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KAogIHdpZHRoID0gMTIwLCBwcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCBlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yID0gVFJVRSwgZHBpID0gOTYpCmx1YV9maWx0ZXJzIDwtIHJtYXJrZG93bjo6cGFuZG9jX2x1YV9maWx0ZXJfYXJncygicGFuZG9jLXpvdHh0Lmx1YSIpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoCiAgZGlnaXRzID0gNCwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplID0gMTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQgPSAiJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiIgp2ZXIgPC0gZm9ybWF0KFN5cy5EYXRlKCksICIlWSVtJWQiKQoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCnJtZF9maWxlIDwtICJpbmRleF9mdW5jdGlvbnNfYmlnLlJtZCIKbGlicmFyeShzcGF0c3RhdC5nZW9tKQpsaWJyYXJ5KHJldGljdWxhdGUpCmBgYAoKIyBDaGFuZ2Vsb2cKCiogMjAyMzA1MDg6IFRyeWluZyB0aGlzIG91dCB3aXRoIGEgbGFyZ2VyIGRhdGFzZXQsIGV4cGxpY2l0bHkgc2V0IHdhbnRlZF96IGFuZCB3YW50ZWRfY2hhbm5lbCBmb3IgaXQuCiogMjAyMzAzMjg6IFJlaW1wbGVtZW50ZWQgc3RlcHMgYXMgZnVuY3Rpb25zLCBjb25uZWN0ZWQgdGhlbSBpbiBvbmUgc2V0IG9mIGNhbGxzLgoqIDIwMjMwMzE3OiBJbml0aWFsIGNlbGxwb3NlIGltcGxlbWVudGF0aW9uLgoqIDIwMjMwMzE1OiBTZXBhcmF0aW9uIG9mIGlucHV0IGltYWdlIGludG8gdGltZXBvaW50cy4KKiAyMDIzMDMxMDogVXNlZCBnZW9wYW5kYXMgdG8gdHJhY2UgY2VsbHMgb3ZlciB0aW1lIGJ5IHBvc2l0aW9uLgoqIDIwMjMwMzA3OiBTZXR0aW5nIHVwIG15IGVudmlyb25tZW50IHRvIGhhbmRsZSBpcHluYiBhbmQgcHl0aG9uIG1hcmtkb3duLgoKIyBJbnRyb2R1Y3Rpb24KCkphY3F1ZXMgaXMgc2Vla2luZyB0byBzZWdtZW50IGFuZCBmb2xsb3cgY2VsbHMgb3ZlciB0aW1lLgoKU3RlcHMgcGVyZm9ybWVkIHNvIGZhcjoKCjEuICBQeXRob24vdmVudiBpbnN0YWxsYXRpb24gb2YgZmlqaQoyLiAgRmlndXJlZCBvdXQgc29tZSBlYXN5IGludGVyYWN0aW9ucyBiZXR3ZWVuIHB5dGhvbiBhbmQgYWN0dWFsIGltYWdlIGRhdGEuCjMuICBJbXBsZW1lbnRlZCBhIHNpbXBsZSBmdW5jdGlvbiB0byBmaW5kIG1pbmltdW0gZGlzdGFuY2VzIGJldHdlZW4KICAgIHB1dGF0aXZlIGNlbGxzIHVzaW5nIHRoZSBleHRhbnQgbWV0aG9kcy4KCiMgTmV4dCBzdGVwcwoKMS4gIE5vdGUgdGhhdCB0aGUgY3ppIGltYWdlcyBhcmUgaW1tZWRpYXRlbHkgb3BlbmFibGUgdmlhIGZpamkncyBiaW9mb3JtYXQgaW50ZXJmYWNlLgoyLiAgTG9hZCBkYXRhc2V0IHZpYSBmaWppCjMuICBJbnZva2UgY2VsbHBvc2UgdmlhIHRoZSBweXRob24gaW50ZXJmYWNlIChzYW1lIGFzIHB5aW1hZ2VqKQo0LiAgU2F2ZSBST0lzIHByb2R1Y2VkIGJ5IGNlbGxwb3NlLCBzYXZlIHRoZW0gdG8gemlwIG91dHB1dCBmaWxlCiAgYS4gIFRoZSByb2kgaW50ZXJmYWNlIGluIGZpamkgY2FuIGFkZHJlc3MgdGhlc2UKNS4gIEN1cnJlbnRseSBhIG1hY3JvIGlzIGludm9rZWQgd2hpY2ggcGVyZm9ybXMgYSBzZXQgb2YgbWVhc3VyZW1lbnRzCiAgICBvbiBldmVyeSBST0kgYW5kIHNhdmVzIHRoZW0gdG8gYSBjc3YuICBUaGlzIGNyZWF0ZXMgdGhlIHByaW1hcnkKICAgIGRhdGEgc3RydWN0dXJlIHVzZWQgZm9yIGFsbCBmb2xsb3dpbmcgcHJvY2Vzc2VzLgo2LiAgTmVlZCB0byBjcmVhdGUgYSBkYXRhc3RydWN0dXJlIHdoaWNoIGlkZW50aWZpZXMgZWFjaCBpbmRpdmlkdWFsCiAgICBjZWxsIG92ZXIgdGltZSBnaXZlbiB0aGVzZSBST0lzIHdoaWNoIHgveS90aW1lKGZyYW1lKSBhbG9uZyB3aXRoCiAgICB0aGUgbWVhc3VyZW1lbnRzIG9mIGludGVyZXN0IChhcmVhL21lYW4vc3RkZXYvaW50ZW5zaXRpZXMgYnkKICAgIGNvbG9yKS4KICAgIGEuICBTbWFsbCBwb3N0cHJvY2Vzc2luZyBkZXRhaWxzOiB0aGUgaW50ZW5zaXR5IHZhbHVlcyBwcm9kdWNlZAogICAgbXVzdCBiZSBub3JtYWxpemVkIGJ5IGNlbGwgYXJlYS4KCiMgRGVtb25zdHJhdGUgdGhlIGZpcnN0IGNvdXBsZSBvZiBzdGVwcyB1c2luZyBhbiBhY3R1YWwgZGF0YXNldAoKSmFjcXVlcyBzZW50IG1lIGFuIGltYWdlIGFjcXVpcmVkIGZyb20gdGhlIG1pY3Jvc2NvcGUgYW5kIEkgc2F2ZWQgaXQKYXMgJ3Rlc3RfZGF0YS9yYXcudGlmJywgaGUgYWxzbyBzZW50IG1lIGEgY2VsbHBvc2UgbW9kZWwgd2hpY2ggSSBzYXZlZAp0byB0aGUgJ21vZGVscy8nIGRpcmVjdG9yeS4KCkdpdmVuIHRoZXNlIGFzIGEgc3RhcnRpbmcgcG9pbnQsIGxldCB1cyB0cnkgdG8gb3BlbiB0aGUgaW1hZ2Ugd2l0aCBhCmZpamkgaW5zdGFuY2UgYW5kIHNwbGl0IGl0IGludG8gYSBzZXJpZXMgb2Ygc21hbGxlciBmaWxlcyBieQp0aW1lcG9pbnQuCgojIEltcGxlbWVudGF0aW9uIG5vdGVzCgpJIGhhdmUgYmVlbiBwcmltYXJpbHkgdXNpbmcgdGhpcyBhcyBhIHdheSB0byByZWZyZXNoIG15IGJyYWluIG9uCnB5dGhvbiBhbmQgZ2V0IGN1cnJlbnQgb24gYmVzdCBwcmFjdGljZXMuICBUaHVzLCB0aGVyZSBhcmUgZGVjaXNpb25zIEkKbWFkZSBpbiB0aGlzIHdvcmtib29rIHdoaWNoIGRvIG5vdCBtYWtlIHNlbnNlIGluIGFueSBvdGhlciBjb250ZXh0OgplLmcuIHdoeSB3b3VsZCBhbnlvbmUgaGF2ZSB0aGUgcHJpbWFyeSBkYXRhIHN0cnVjdHVyZSBiZSBhIGRpY3Rpb25hcnkKa2V5ZWQgYnkgZmlsZW5hbWUsIHRoYXQgaXMgZHVtYj8gIEkgY2hvc2UgdG8gZG8gdGhhdCB0byByZWZyZXNoIG15c2VsZgpvbiBwbGF5aW5nIHdpdGggZGljdGlvbmFyaWVzLiAgQnkgdGhlIHNhbWUgdG9rZW4sIHdoeSB3b3VsZCBhbnlvbmUKbWFrZSBhIGRpY3Rpb25hcnkgb2YgZGF0YWZyYW1lcyBvbmx5IHRvIHR1cm4gYXJvdW5kIGFuZCBjb25jYXRlbmF0ZQp0aGVtIGZvciB1c2FnZSBpbiBnZW9wYW5kYXMsIHRoYXQgaXMgY3Jhenk/ICBJIGRpZCB0aGlzIHRvIGdldCBtb3JlCmNvbWZvcnRhYmxlIHdpdGggcGFuZGFzIGFuZCBnZXQgb3V0IHNvbWUgb2YgbXkgUmlzaCBtdXNjbGUgbWVtb3J5LgoKV2l0aCB0aGF0IGluIG1pbmQsIGlmIHdlIGNob29zZSB0byBtYWtlIHRoaXMgYSBwYWNrYWdlLCB0aGUgZmlyc3QKdGhpbmcgdGhhdCB3aWxsIG5lZWQgdG8gaGFwcGVuIGlzIHRvIHJld29yayB0aGUgYmFzZSBkYXRhc3RydWN0dXJlLiAgSQpqdXN0IHdhbnQgYW55b25lIHdobyBhY3R1YWxseSByZWFkcyB0aGlzIGNvZGUgdG8ga25vdyB0aGF0IHllcywgSSBhbSBhCm51dHRlciwgYnV0IGEgbnV0dGVyIGZvciBhIHJlYXNvbi4KCiMjIExvYWQgbmVjZXNzYXJ5IHB5dGhvbiBtb2R1bGVzCgpgYGB7cHl0aG9uIGxvYWR9CmZyb20gY2VsbHBvc2UgaW1wb3J0IG1vZGVscywgaW8KZnJvbSBjZWxscG9zZS5pbyBpbXBvcnQgKgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAppbXBvcnQgZ2VvcGFuZGFzCmltcG9ydCBnbG9iCmltcG9ydCBpbWFnZWoKZnJvbSBqcHlwZSBpbXBvcnQgSkFycmF5LCBKSW50CmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKaW1wb3J0IG11bHRpcHJvY2Vzc2luZyBhcyBtcAppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IG9zCmltcG9ydCBwYW5kYXMKZnJvbSBwYW5kYXMgaW1wb3J0IERhdGFGcmFtZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKaW1wb3J0IHNjeWphdmEKaW1wb3J0IHNlYWJvcm4KaW1wb3J0IHNodXRpbApgYGAKCiMjIFNldCB1cCBzb21lIGluaXRpYWwgdmFyaWFibGVzCgpgYGB7cHl0aG9uIHBhcmFtZXRlcnN9CmJhc2VfZGlyID0gUGF0aCgnL2xhYi9zY3JhdGNoL2F0Yi9pbWFnaW5nL210Yl8yMDIzJykuYXNfcG9zaXgoKQpvcy5jaGRpcihiYXNlX2RpcikKaW5wdXRfZmlsZSA9IFBhdGgoZiJ7YmFzZV9kaXJ9L3Rlc3RfZGF0YS9FeHBlcmltZW50LTE1NjguY3ppIikuYXNfcG9zaXgoKQpwYW5kYXMuc2V0X29wdGlvbignZGlzcGxheS5tYXhfY29sdW1ucycsIE5vbmUpCnZlcmJvc2UgPSBUcnVlCmBgYAoKIyMgU3RhcnQgaW1hZ2VqL2ZpamkKCk5vdGUgdGhhdCBJIGFtIHVzaW5nIGZpamkvaW1hZ2VqIGZyb20gd2l0aGluIGEgdmlydHVhbCBlbnZpcm9ubWVudAp3aGljaCBJIHN5bWJvbGljYWxseSBsaW5rZWQgdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSAndmVudi8nLgoKQXMgYSByZXN1bHQsIHdoZW4gSSBpbml0aWFsaXplIGZpamksIEkgd2lsbCBjYWxsIHRoZSBiYXNlIGRpcmVjdG9yeSBvZgp0aGUgZG93bmxvYWRlZCBmaWppIHRyZWUgd2l0aGluIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LCB3aGljaCBJCnNvbWV3aGF0IGVycm9uZW91c2x5IHB1dCBpbiBiaW4vLgoKYGBge3B5dGhvbiBzdGFydF9maWppfQpzY3lqYXZhLmNvbmZpZy5hZGRfb3B0aW9uKCctWG14MTI4ZycpCnN0YXJ0X2RpciA9IG9zLmdldGN3ZCgpCmlqID0gaW1hZ2VqLmluaXQoUGF0aCgndmVudi9iaW4vRmlqaS5hcHAnKSwgbW9kZSA9ICdpbnRlcmFjdGl2ZScpCmlqLmdldEFwcCgpLmdldEluZm8oVHJ1ZSkKaWoudWkoKS5zaG93VUkoKQojIyBTb21ldGhpbmcgYWJvdXQgdGhpcyBpbml0KCkgZnVuY3Rpb24gY2hhbmdlcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4Kb3MuY2hkaXIoc3RhcnRfZGlyKQppai5nZXRWZXJzaW9uKCkKCnNob3dQb2x5Z29uUm9pID0gc2N5amF2YS5qaW1wb3J0KCdpai5ndWkuUG9seWdvblJvaScpCk92ZXJsYXkgPSBzY3lqYXZhLmppbXBvcnQoJ2lqLmd1aS5PdmVybGF5JykKUmVnaW9ucyA9IHNjeWphdmEuamltcG9ydCgnbmV0LmltZ2xpYjIucm9pLlJlZ2lvbnMnKQpMYWJlbFJlZ2lvbnMgPSBzY3lqYXZhLmppbXBvcnQoJ25ldC5pbWdsaWIyLnJvaS5sYWJlbGluZy5MYWJlbFJlZ2lvbnMnKQpaUHJvamVjdG9yID0gc2N5amF2YS5qaW1wb3J0KCdpai5wbHVnaW4uWlByb2plY3RvcicpKCkKb3YgPSBPdmVybGF5KCkKYGBgCgojIyBPcGVuIHRoZSBpbnB1dCBmaWxlIGFuZCBzcGxpdCBpdCBieSB0aW1lCgpPcGVuIHRoZSBmaWxlLCBmaWd1cmUgb3V0IGl0cyBkaW1lbnNpb25zLCBhbmQgd3JpdGUgcG9ydGlvbnMgb2YgaXQgdG8KYW4gb3V0cHV0IGRpcmVjdG9yeS4KCkkgd3JvdGUgdGhpcyB0aGlua2luZyBJIGNvdWxkIHBhcmFsbGVsaXplIHRoZSBvdXRwdXQgd3JpdGluZyB0byA4CmNwdXMuICBCdXQgSSB0aGluayBJIGRvIG5vdCB5ZXQgdW5kZXJzdGFuZCBob3cgcHl0aG9uIHNjb3BlcyB2YXJpYWJsZXMKaW4gdGhpcyBjb250ZXh0IGFuZCBzbyBpdCBkaWQgbm90IHF1aXRlIHdvcmsuICBJIHR1cm5lZCB0aGF0IG9mZiBmb3IKdGhlIG1vbWVudCBhbmQgcmFuIGl0IGFuZCBpdCBmaW5pc2hlZCBpbiBhYm91dCBhIG1pbnV0ZS4KClRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gbWF5IHJlcXVpcmUgYSB0ZXN0IHRvIHNlZSBpZiB0aGUgb3V0cHV0CmRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBiZWNhdXNlIHNjaWphdmEgd2lsbCBmcmVhayBvdXQuCgpgYGB7cHl0aG9uIHNwbGl0X2ltYWdlX2Z1bmN0aW9ufQpkZWYgc2VwYXJhdGVfc2xpY2VzKGlucHV0X2ZpbGUsIHdhbnRlZF94ID0gVHJ1ZSwgd2FudGVkX3kgPSBUcnVlLAogICAgICAgICAgICAgICAgICAgIHdhbnRlZF96ID0gMSwgd2FudGVkX2NoYW5uZWwgPSAyLCBjcHVzID0gOCwKICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGUgPSBGYWxzZSk6CiAgICAiIiIgU2xpY2UgYW4gaW1hZ2UgaW4gcHJlcGFyYXRpb24gZm9yIGNlbGxwb3NlLgoKICAgIEV2ZW50dWFsbHkgdGhpcyBzaG91bGQgYmUgc21hcnQgZW5vdWdoIHRvIGhhbmRsZSBhcmJpdHJhcnkKICAgIHgseSx6LGNoYW5uZWxzLHRpbWVzIGFzIHdlbGwgYXMgYWJsZSB0byB1c2UgbXVsdGlwbGUgY3B1cyBmb3IKICAgIHNhdmluZyB0aGUgZGF0YS4gIEluIGl0cyBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBpdCBvbmx5IHNhdmVzIDEKICAgIHosIDEgY2hhbm5lbCBmb3IgZXZlcnkgZnJhbWUgb2YgYW4gaW1hZ2UgaW50byBhIHNlcmllcyBvZiBmaWxlcyBpbgogICAgaXRzIG91dHB1dCBkaXJlY3RvcnkuCiAgICAiIiIKCiAgICBpbnB1dF9iYXNlID0gb3MucGF0aC5iYXNlbmFtZShpbnB1dF9maWxlKQogICAgaW5wdXRfZGlyID0gb3MucGF0aC5kaXJuYW1lKGlucHV0X2ZpbGUpCiAgICBpbnB1dF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChpbnB1dF9iYXNlKVswXQogICAgb3V0cHV0X2RpcmVjdG9yeSA9IFBhdGgoZiJ7aW5wdXRfZGlyfS9vdXRwdXRzL3tpbnB1dF9uYW1lfV96e3dhbnRlZF96fSIpLmFzX3Bvc2l4KCkKICAgIG9zLm1ha2VkaXJzKG91dHB1dF9kaXJlY3RvcnksIGV4aXN0X29rID0gVHJ1ZSkKICAgIGlmIHZlcmJvc2U6CiAgICAgICAgcHJpbnQoIlN0YXJ0aW5nIHRvIG9wZW4gdGhlIGlucHV0IGZpbGUsIHRoaXMgdGFrZXMgYSBtb21lbnQuIikKICAgIHJhd19kYXRhc2V0ID0gaWouaW8oKS5vcGVuKGlucHV0X2ZpbGUpCiAgICBpZiB2ZXJib3NlOgogICAgICAgIHByaW50KGYiT3BlbmVkIGlucHV0IGZpbGUsIHdyaXRpbmcgaW1hZ2VzIHRvIHtvdXRwdXRfZGlyZWN0b3J5fSIpCgogICAgZGF0YV9pbmZvID0ge30KICAgIGZvciBlbGVtZW50IGluIHJhbmdlKGxlbihyYXdfZGF0YXNldC5kaW1zKSk6CiAgICAgICAgbmFtZSA9IHJhd19kYXRhc2V0LmRpbXNbZWxlbWVudF0KICAgICAgICBkYXRhX2luZm9bbmFtZV0gPSByYXdfZGF0YXNldC5zaGFwZVtlbGVtZW50XQogICAgaWYgdmVyYm9zZToKICAgICAgICBwcmludChmIlRoaXMgZGF0YXNldCBoYXMgZGltZW5zaW9uczogWDp7ZGF0YV9pbmZvWydYJ119IiwKICAgICAgICAgICAgICBmIlk6e2RhdGFfaW5mb1snWSddfSBaOntkYXRhX2luZm9bJ1onXX0gVGltZTp7ZGF0YV9pbmZvWydUaW1lJ119IikKCiAgICBzbGljZXMgPSBbXQogICAgZm9yIHRpbWVwb2ludCBpbiByYW5nZShkYXRhX2luZm9bJ1RpbWUnXSk6CiAgICAgICAgd2FudGVkX3NsaWNlID0gcmF3X2RhdGFzZXRbOiwgOiwgd2FudGVkX2NoYW5uZWwsIHdhbnRlZF96LCB0aW1lcG9pbnRdCiAgICAgICAgc2xpY2VfZGF0YSA9IGlqLnB5LnRvX2RhdGFzZXQod2FudGVkX3NsaWNlKQogICAgICAgIG91dHB1dF9maWxlbmFtZSA9IFBhdGgoZiJ7b3V0cHV0X2RpcmVjdG9yeX0vZnJhbWVfe3RpbWVwb2ludH0udGlmIikuYXNfcG9zaXgoKQogICAgICAgIGlmIChvcy5wYXRoLmV4aXN0cyhvdXRwdXRfZmlsZW5hbWUpKToKICAgICAgICAgICAgaWYgb3ZlcndyaXRlOgogICAgICAgICAgICAgICAgcHJpbnQoZiJSZXdyaXRpbmcge291dHB1dF9maWxlbmFtZX0iKQogICAgICAgICAgICAgICAgb3MucmVtb3ZlKG91dHB1dF9maWxlbmFtZSkKICAgICAgICAgICAgICAgIHNhdmVkID0gaWouaW8oKS5zYXZlKHNsaWNlX2RhdGEsIG91dHB1dF9maWxlbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJTa2lwcGluZyB7b3V0cHV0X2ZpbGVuYW1lfSwgaXQgYWxyZWFkeSBleGlzdHMuIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzYXZlZCA9IGlqLmlvKCkuc2F2ZShzbGljZV9kYXRhLCBvdXRwdXRfZmlsZW5hbWUpCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBwcmludChmIlNhdmluZyBpbWFnZSB7aW5wdXRfbmFtZX1fe3RpbWVwb2ludH0uIikKICAgICAgICBzbGljZXMuYXBwZW5kKHdhbnRlZF9zbGljZSkKCiAgICByZXR1cm4gcmF3X2RhdGFzZXQsIHNsaWNlcywgb3V0cHV0X2RpcmVjdG9yeQpgYGAKCiMjIENlbGxwb3NlCgpBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBoYXZlIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZmlsZXMgb2YKaW5kaXZpZHVhbCB0aW1lcG9pbnRzLiAgSmFjcXVlcyBzZW50IG1lIGFuIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YKdGhlIHVzYWdlIG9mIGNlbGxwb3NlIHRvIGNhbGwgaW5kaXZpZHVhbCBjZWxscy4gIExldCB1cyBpbmNsdWRlIHRoYXQKbm93LiAgSSB0aGluayB0aGUgcHJldmlvdXMgZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5IGFsc28gcmV0dXJuIHRoZQpkaXJlY3Rvcnkgb2YgdGhlIHNlcGFyYXRlZCBpbnB1dCBmaWxlcy4KCmBgYHtweXRob24gY2VsbHBvc2V9CiMjIFJlbGV2YW50IG9wdGlvbnM6CiMjIGJhdGNoX3NpemUoaW5jcmVhc2UgZm9yIG1vcmUgcGFyYWxsZWxpemF0aW9uKSwgY2hhbm5lbHModHdvIGVsZW1lbnQgbGlzdCBvZiB0d28gZWxlbWVudAojIyBjaGFubmVscyB0byBzZWdtZW50OyB0aGUgZmlyc3QgaXMgdGhlIHNlZ21lbnQsIHNlY29uZCBpcyBvcHRpb25hbCBudWNsZXVzOwojIyBpbnRlcm5hbCBlbGVtZW50cyBhcmUgY29sb3IgY2hhbm5lbHMgdG8gcXVlcnksIHNvIFtbMCwwXSxbMiwzXV0gbWVhbnMgZG8gbWFpbiBjZWxscyBpbgojIyBncmF5c2NhbGUgYW5kIGEgc2Vjb25kIHdpdGggY2VsbHMgaW4gYmx1ZSwgbnVjbGVpIGluIGdyZWVuLgojIyBjaGFubmVsX2F4aXMsIHpfYXhpcyA/IGludmVydCAoVC9GIGZsaXAgcGl4ZWxzIGZyb20gYi93IEkgYXNzdW1lKSwKIyMgbm9ybWFsaXplKFQvRiBwZXJjZW50aWxlIG5vcm1hbGl6ZSB0aGUgZGF0YSksIGRpYW1ldGVyLCBkb18zZCwKIyMgYW5pc290cm9weSAocmVzY2FsaW5nIGZhY3RvciBmb3IgM2Qgc2VnbWVudGF0aW9uKSwgbmV0X2F2ZyAoYXZlcmFnZSBtb2RlbHMpLAojIyBhdWdtZW50ID8sIHRpbGUgPywgcmVzYW1wbGUsIGludGVycCwgZmxvd190aHJlc2hvbGQsIGNlbGxwcm9iX3RocmVzaG9sZCAoaW50ZXJlc3RpbmcpLAojIyBtaW5fc2l6ZSAodHVybmVkIG9mZiB3aXRoIC0xKSwgc3RpdGNoX3RocmVzaG9sZCA/LCByZXNjYWxlID8uCmRlZiBpbnZva2VfY2VsbHBvc2UoaW5wdXRfZGlyZWN0b3J5LCBtb2RlbF9maWxlLCBjaGFubmVscyA9IFtbMCwgMF1dLCBkaWFtZXRlciA9IDE2MCwKICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSAwLjQsIGRvXzNEID0gRmFsc2UsIGJhdGNoX3NpemUgPSA2NCwgdmVyYm9zZSA9IFRydWUpOgogICAgIiIiIEludm9rZSBjZWxscG9zZSB1c2luZyBpbmRpdmlkdWFsIHNsaWNlcy4KCiAgICBUaGlzIHRha2VzIHRoZSBzZXJpZXMgb2Ygc2xpY2VzIGZyb20gc2VwYXJhdGVfc2xpY2VzKCkgYW5kIHNlbmRzCiAgICB0aGVtIHRvIGNlbGxwb3NlIHdpdGggYSBzcGVjaWZpYyBtb2RlbC4gIFRoZSBkaWN0aW9uYXJ5IGl0IHJldHVybnMKICAgIGlzIHRoZSBwcmltYXJ5IGRhdGFzdHJ1Y3R1cmUgZm9yIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyB3aGljaCBmb2xsb3cuCiAgICAiIiIKCiAgICAjIyBSZWxldmFudCBvcHRpb25zOgogICAgIyMgbW9kZWxfdHlwZShjeXRvLCBudWNsZWksIGN5dG8yKSwgbmV0X2F2ZyhUL0YgaWYgbG9hZCBidWlsdCBpbiBuZXR3b3JrcyBhbmQgYXZlcmFnZSB0aGVtKQogICAgbW9kZWwgPSBtb2RlbHMuQ2VsbHBvc2VNb2RlbChwcmV0cmFpbmVkX21vZGVsID0gbW9kZWxfZmlsZSkKICAgIGZpbGVzID0gZ2V0X2ltYWdlX2ZpbGVzKGlucHV0X2RpcmVjdG9yeSwgJ19tYXNrcycsIGxvb2tfb25lX2xldmVsX2Rvd24gPSBGYWxzZSkKICAgIGltZ3MgPSBbXQogICAgb3V0cHV0X21hc2tzID0gW10KICAgIG91dHB1dF90eHRzID0gW10KICAgIG91dHB1dF9maWxlcyA9IGRlZmF1bHRkaWN0KGRpY3QpCiAgICBleGlzdGluZ19maWxlcyA9IDAKICAgIGNvdW50ID0gMAogICAgZm9yIG9uZV9maWxlIGluIGZpbGVzOgogICAgICAgIHByaW50KGYiUmVhZGluZyB7b25lX2ZpbGV9IikKICAgICAgICBjcF9vdXRwdXRfZGlyZWN0b3J5ID0gUGF0aChmIntpbnB1dF9kaXJlY3Rvcnl9L2NlbGxwb3NlIikuYXNfcG9zaXgoKQogICAgICAgIG9zLm1ha2VkaXJzKGNwX291dHB1dF9kaXJlY3RvcnksIGV4aXN0X29rID0gVHJ1ZSkKICAgICAgICBmX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKG9uZV9maWxlKQogICAgICAgIGZfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZl9uYW1lKVswXQogICAgICAgIHN0YXJ0X21hc2sgPSBQYXRoKGYie2lucHV0X2RpcmVjdG9yeX0ve2ZfbmFtZX1fY3BfbWFza3MucG5nIikuYXNfcG9zaXgoKQogICAgICAgIG91dHB1dF9tYXNrID0gUGF0aChmIntjcF9vdXRwdXRfZGlyZWN0b3J5fS97Zl9uYW1lfV9jcF9tYXNrcy5wbmciKS5hc19wb3NpeCgpCiAgICAgICAgc3RhcnRfdHh0ID0gIFBhdGgoZiJ7aW5wdXRfZGlyZWN0b3J5fS97Zl9uYW1lfV9jcF9vdXRsaW5lcy50eHQiKS5hc19wb3NpeCgpCiAgICAgICAgb3V0cHV0X3R4dCA9IFBhdGgoZiJ7Y3Bfb3V0cHV0X2RpcmVjdG9yeX0ve2ZfbmFtZX1fY3Bfb3V0bGluZXMudHh0IikuYXNfcG9zaXgoKQogICAgICAgIHByaW50KGYiQWRkaW5nIG5ldyB0eHQgZmlsZToge291dHB1dF90eHR9IikKICAgICAgICBvdXRwdXRfZmlsZXNbZl9uYW1lXVsnaW5wdXRfZmlsZSddID0gb25lX2ZpbGUKICAgICAgICBvdXRwdXRfZmlsZXNbZl9uYW1lXVsnc3RhcnRfbWFzayddID0gc3RhcnRfbWFzawogICAgICAgIG91dHB1dF9maWxlc1tmX25hbWVdWydvdXRwdXRfbWFzayddID0gb3V0cHV0X21hc2sKICAgICAgICBvdXRwdXRfZmlsZXNbZl9uYW1lXVsnc3RhcnRfdHh0J10gPSBzdGFydF90eHQKICAgICAgICBvdXRwdXRfZmlsZXNbZl9uYW1lXVsnb3V0cHV0X3R4dCddID0gb3V0cHV0X3R4dAogICAgICAgIG91dHB1dF9maWxlc1tmX25hbWVdWydleGlzdHMnXSA9IEZhbHNlCiAgICAgICAgaWYgKG9zLnBhdGguZXhpc3RzKG91dHB1dF90eHQpKToKICAgICAgICAgICAgZXhpc3RpbmdfZmlsZXMgPSBleGlzdGluZ19maWxlcyArIDEKICAgICAgICAgICAgb3V0cHV0X2ZpbGVzW2ZfbmFtZV1bJ2V4aXN0cyddID0gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGltZyA9IGltcmVhZChvbmVfZmlsZSkKICAgICAgICAgICAgaW1ncy5hcHBlbmQoaW1nKQogICAgICAgIGNvdW50ID0gY291bnQgKyAxCiAgICBuaW1nID0gbGVuKGltZ3MpCiAgICBpZiB2ZXJib3NlIGFuZCBuaW1nID4gMDoKICAgICAgICBwcmludChmIlJlYWQge25pbWd9IGltYWdlcywgc3RhcnRpbmcgY2VsbHBvc2UuIikKICAgICAgICBtYXNrcywgZmxvd3MsIHN0eWxlcyA9IG1vZGVsLmV2YWwoCiAgICAgICAgICAgIGltZ3MsIGRpYW1ldGVyID0gZGlhbWV0ZXIsIGNoYW5uZWxzID0gY2hhbm5lbHMsIGZsb3dfdGhyZXNob2xkID0gdGhyZXNob2xkLAogICAgICAgICAgICBkb18zRCA9IGRvXzNELCBiYXRjaF9zaXplID0gYmF0Y2hfc2l6ZSkKICAgICAgICBpby5zYXZlX3RvX3BuZyhpbWdzLCBtYXNrcywgZmxvd3MsIGZpbGVzKQogICAgICAgIGZvciBmX25hbWUgaW4gb3V0cHV0X2ZpbGVzOgogICAgICAgICAgICBzaHV0aWwubW92ZShvdXRwdXRfZmlsZXNbZl9uYW1lXVtzdGFydF9tYXNrXSwgb3V0cHV0X2ZpbGVzW2ZfbmFtZV1bb3V0cHV0X21hc2tdKQogICAgICAgICAgICBzaHV0aWwubW92ZShvdXRwdXRfZmlsZXNbZl9uYW1lXVtzdGFydF90eHRdLCBvdXRwdXRfZmlsZXNbZl9uYW1lXVtvdXRwdXRfdHh0XSkKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoIlJldHVybmluZyB0aGUgb3V0cHV0IGZpbGVzLiIpCiAgICByZXR1cm4gb3V0cHV0X2ZpbGVzCmBgYAoKIyMgQ29sbGFwc2UgWgoKT25lIHBvc3NpYmxlIGNoYW5nZSBpcyB0byBwZXJmb3JtIG1lYXN1cmVtZW50cyBvbiB0aGUgc3VtIG9mIFotc3RhY2tzCmluc3RlYWQgb2YgYSBzaW5nbGUgc2xpY2UuICBUaHVzIHdlIHdvdWxkIHN1bSB0aGUgY2VsbHMsIGNyZWF0ZSB0aGUKUk9JcyB1c2luZyB0aGUgc2luZ2xlIHNsaWNlIGdyYXlzY2FsZSBpbWFnZSwgdGhlbiBtZWFzdXJlIHRoZSBzZXQgb2YKYWxsIGNvbWJpbmVkLgoKYGBge3B5dGhvbiBjb2xsYXBzZV96fQpkZWYgY29sbGFwc2VfeihyYXdfZGF0YXNldCwgY2VsbHBvc2VfcmVzdWx0LCBtZXRob2QgPSAnc3VtJyk6CiAgICAiIiIgU3RhY2sgbXVsdGlwbGUgeiBzbGljZXMgZm9yIGVhY2ggdGltZXBvaW50LgoKICAgIElmIEkgdW5kZXJzdGFuZCBKYWNxdWVzJyBleHBsYW5hdGlvbiBvZiB0aGUgcXVhbnRpZmljYXRpb24gbWV0aG9kcwogICAgY29ycmVjdGx5LCB0aGV5IHNvbWV0aW1lcyAob2Z0ZW4/KSBwZXJmb3JtIGJldHRlciBvbiB0aGUKICAgIHotaW50ZWdyYXRpb24gb2YgcGl4ZWxzIGF0IGVhY2ggdGltZXBvaW50LiAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcwogICAgdGhhdCBhbmQgc2VuZHMgdGhlIHN0YWNrZWQgc2xpY2VzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGFuZCBhZGRzCiAgICB0aGUgZmlsZW5hbWVzIHRvIHRoZSBjZWxscG9zZV9yZXN1bHQgZGljdGlvbmFyeS4KICAgICIiIgogICAgY2VsbHBvc2Vfc2xpY2VzID0gbGlzdChjZWxscG9zZV9yZXN1bHQua2V5cygpKQogICAgc2xpY2VfbnVtYmVyID0gMAogICAgY29sbGFwc2VkX3NsaWNlcyA9IFtdCiAgICBmb3Igc2xpY2VfbmFtZSBpbiBjZWxscG9zZV9zbGljZXM6CiAgICAgICAgb3V0cHV0X2RpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZShjZWxscG9zZV9yZXN1bHRbc2xpY2VfbmFtZV1bJ291dHB1dF90eHQnXSkKICAgICAgICBjb2xsYXBzZWRfZGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKG91dHB1dF9kaXJlY3RvcnkpCiAgICAgICAgY29sbGFwc2VkX2RpcmVjdG9yeSA9IGYie2NvbGxhcHNlZF9kaXJlY3Rvcnl9L2NvbGxhcHNlZCIKICAgICAgICBvcy5tYWtlZGlycyhjb2xsYXBzZWRfZGlyZWN0b3J5LCBleGlzdF9vayA9IFRydWUpCiAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gUGF0aChmIntjb2xsYXBzZWRfZGlyZWN0b3J5fS9mcmFtZXtzbGljZV9udW1iZXJ9LnRpZiIpLmFzX3Bvc2l4KCkKICAgICAgICBjZWxscG9zZV9yZXN1bHRbc2xpY2VfbmFtZV1bJ2NvbGxhcHNlZF9maWxlJ10gPSBvdXRwdXRfZmlsZW5hbWUKICAgICAgICBpZiAob3MucGF0aC5leGlzdHMob3V0cHV0X2ZpbGVuYW1lKSk6CiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBwcmludChmIlNraXBwaW5nIHtvdXRwdXRfZmlsZW5hbWV9LCBpdCBhbHJlYWR5IGV4aXN0cy4iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhcmdlcl9zbGljZSA9IHJhd19kYXRhc2V0WzosIDosIDosIDosIHNsaWNlX251bWJlcl0KICAgICAgICAgICAgaW1wID0gaWoucHkudG9faW1hZ2VwbHVzKGxhcmdlcl9zbGljZSkKICAgICAgICAgICAgel9wcm9qZWN0b3JfcmVzdWx0ID0gWlByb2plY3Rvci5ydW4oaW1wLCBtZXRob2QpCiAgICAgICAgICAgICMjIHpfcHJvamVjdG9yX21hc2sgPSBpai5JSi5ydW4oel9wcm9qZWN0b3JfcmVzdWx0LCAiQ29udmVydCB0byBNYXNrIiwgIm1ldGhvZD1PdHN1IGJhY2tncm91bmQ9TGlnaHQiKQogICAgICAgICAgICB6X2NvbGxhcHNlZF9pbWFnZSA9IGlqLnB5LmZyb21famF2YSh6X3Byb2plY3Rvcl9yZXN1bHQpCiAgICAgICAgICAgIHpfY29sbGFwc2VkX2RhdGFzZXQgPSBpai5weS50b19kYXRhc2V0KHpfY29sbGFwc2VkX2ltYWdlKQogICAgICAgICAgICBzYXZlZCA9IGlqLmlvKCkuc2F2ZSh6X2NvbGxhcHNlZF9kYXRhc2V0LCBvdXRwdXRfZmlsZW5hbWUpCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBwcmludChmIlNhdmluZyBpbWFnZSB7b3V0cHV0X2ZpbGVuYW1lfS4iKQogICAgICAgIHNsaWNlX251bWJlciA9IHNsaWNlX251bWJlciArIDEKICAgIHJldHVybiBjZWxscG9zZV9yZXN1bHQKYGBgCgojIENyZWF0ZSBSZWdpb25zIG9mIGludGVyZXN0IGZyb20gY2VsbHBvc2Ugb3V0cHV0cwoKSW4gSmFjcXVlcyBub3RlYm9vaywgaXQgbG9va3MgbGlrZSBoZSBvbmx5IGV4dHJhY3RzIFJPSXMgZnJvbSBvbmUgb2YKdGhlIGNlbGxwb3NlIHNsaWNlcy4gIEkgYW0gYXNzdW1pbmcgdGhlIGdvYWwgaXMgdG8gZXh0ZW5kIHRoaXMgYWNyb3NzCmFsbCBpbWFnZXM/CgpUaGVyZSBpcyBhbiBpbXBvcnRhbnQgY2F2ZWF0IHRoYXQgSSBtaXNzZWQ6IGltYWdlaiBjb21lcyB3aXRoIGEKcHl0aG9uMi1iYXNlZCBzY3JpcHRpbmcgbGFuZ3VhZ2UgZnJvbSB3aGljaCBpdCBhcHBlYXJzIHNvbWUgb2YgaGlzCmNvZGUgaXMgY29taW5nLiAgQXMgYSByZXN1bHQgSSBzaG91bGQgbG9vayBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIGl0LAphbmQgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZXhhbXBsZXMgcHJvdmlkZWQgaGVyZSBmb3IgdGhlIG1vc3QKYXBwcm9wcmlhdGUgd2F5cyBvZiBpbnRlcmFjdGluZyB3aXRoIHRoZSBST0kgbWFuYWdlciBldGM6CgpodHRwczovL2dpdGh1Yi5jb20vaW1hZ2VqL3B5aW1hZ2VqL2Jsb2IvbWFpbi9kb2MvZXhhbXBsZXMvYmxvYl9kZXRlY3Rpb25faW50ZXJhY3RpdmUucHkKCmBgYHtweXRob24gY2VsbHBvc2VfdG9fcm9pfQojIyBUaGUgZm9sbG93aW5nIGlzIGZyb20gYSBtaXggb2YgYSBjb3VwbGUgb2YgaW1wbGVtZW50YXRpb25zIEkgZm91bmQ6CiMjIGh0dHBzOi8vcHlpbWFnZWoucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L0NsYXNzaWMtU2VnbWVudGF0aW9uLmh0bWwKIyMgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIG1heSBiZSB0YWtlbiBmcm9tOgojIyBodHRwczovL3B5aW1hZ2VqLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9DbGFzc2ljLVNlZ21lbnRhdGlvbi5odG1sI3NlZ21lbnRhdGlvbi13b3JrZmxvdy13aXRoLWltYWdlajIKIyMgTXkgZ29hbCBpcyB0byBwYXNzIHRoZSBST0kgcmVnaW9ucyB0byB0aGlzIGZ1bmN0aW9uIGFuZCBjcmVhdGUgYSBzaW1pbGFyIGRmLgpkZWYgc2xpY2VzX3RvX3JvaV9tZWFzdXJlbWVudHMoY2VsbHBvc2VfcmVzdWx0LCBjb2xsYXBzZWQgPSBGYWxzZSk6CiAgICAiIiIgUmVhZCB0aGUgdGV4dCBjZWxscG9zZSBvdXRwdXQgZmlsZXMsIGdlbmVyYXRlIFJPSXMsIGFuZCBtZWFzdXJlLgoKICAgIEkgdGhpbmsgdGhlcmUgYXJlIGJldHRlciB3YXlzIG9mIGFjY29tcGxpc2hpbmcgdGhpcyB0YXNrIHRoYW4KICAgIHVzaW5nIGlqLklKLnJ1bigpOyBidXQgdGhpcyBzZWVtcyB0byB3b3JrLi4uICBVcG9uIGNvbXBsZXRpb24sCiAgICB0aGlzIGZ1bmN0aW9uIHNob3VsZCBhZGQgYSBzZXJpZXMgb2YgZGF0YWZyYW1lcyB0byB0aGUKICAgIGNlbGxwb3NlX3Jlc3VsdCBkaWN0aW9uYXJ5IHdoaWNoIGNvbXByaXNlIHRoZSB2YXJpb3VzIG1ldHJpY3MgZnJvbQogICAgSW1hZ2VKJ3MgbWVhc3VyZW1lbnQgZnVuY3Rpb24gb2YgdGhlIFJPSXMgZGV0ZWN0ZWQgYnkgY2VsbHBvc2UuCiAgICAiIiIKICAgIG91dHB1dF9kaWN0ID0gY2VsbHBvc2VfcmVzdWx0CiAgICBjZWxscG9zZV9zbGljZXMgPSBsaXN0KGNlbGxwb3NlX3Jlc3VsdC5rZXlzKCkpCiAgICBzbGljZV9udW1iZXIgPSAwCiAgICBmb3Igc2xpY2VfbmFtZSBpbiBjZWxscG9zZV9zbGljZXM6CiAgICAgICAgb3V0cHV0X2RpY3Rbc2xpY2VfbmFtZV1bJ3NsaWNlX251bWJlciddID0gc2xpY2VfbnVtYmVyCiAgICAgICAgaW5wdXRfdGlmID0gJycKICAgICAgICBpZiBjb2xsYXBzZWQ6CiAgICAgICAgICAgIGlucHV0X3RpZiA9IGNlbGxwb3NlX3Jlc3VsdFtzbGljZV9uYW1lXVsnY29sbGFwc2VkX2ZpbGUnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlucHV0X3RpZiA9IGNlbGxwb3NlX3Jlc3VsdFtzbGljZV9uYW1lXVsnaW5wdXRfZmlsZSddCiAgICAgICAgc2xpY2VfZGF0YXNldCA9IGlqLmlvKCkub3BlbihpbnB1dF90aWYpCiAgICAgICAgc2xpY2VfZGF0YSA9IGlqLnB5LnRvX2ltYWdlcGx1cyhzbGljZV9kYXRhc2V0KQogICAgICAgIGlucHV0X3R4dCA9IGNlbGxwb3NlX3Jlc3VsdFtzbGljZV9uYW1lXVsnb3V0cHV0X3R4dCddCiAgICAgICAgaW5wdXRfbWFzayA9IGNlbGxwb3NlX3Jlc3VsdFtzbGljZV9uYW1lXVsnb3V0cHV0X21hc2snXQogICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgIHByaW50KGYiUHJvY2Vzc2luZyBjZWxscG9zZSBvdXRsaW5lOiB7aW5wdXRfdHh0fSIpCiAgICAgICAgICAgIHByaW50KGYiTWVhc3VyaW5nOiB7aW5wdXRfdGlmfSIpCiAgICAgICAgIyBjb252ZXJ0IERhdGFzZXQgdG8gSW1hZ2VQbHVzCiAgICAgICAgaW1wID0gaWoucHkudG9faW1hZ2VwbHVzKHNsaWNlX2RhdGEpCiAgICAgICAgcm0gPSBpai5Sb2lNYW5hZ2VyLmdldFJvaU1hbmFnZXIoKQogICAgICAgIHJtLnJ1bkNvbW1hbmQoIkFzc29jaWF0ZWQiLCAidHJ1ZSIpCiAgICAgICAgcm0ucnVuQ29tbWFuZCgic2hvdyBBbGwgd2l0aCBsYWJlbHMiKQogICAgICAgICMjIFRoZSBsb2dpYyBmb3IgdGhpcyB3YXMgdGFrZW4gZnJvbToKICAgICAgICAjIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83Mzg0OTQxOC9pcy10aGVyZS1hbnktd2F5LXRvLXN3aXRjaC1pbWFnZWotbWFjcm8tY29kZS10by1weXRob24zLWNvZGUKICAgICAgICB0eHRfZmggPSBvcGVuKGlucHV0X3R4dCwgJ3InKQogICAgICAgIHNldF9zdHJpbmcgPSBmJ1NldCBNZWFzdXJlbWVudHMuLi4nCiAgICAgICAgbWVhc3VyZV9zdHJpbmcgPSBmJ2FyZWEgbWVhbiBtaW4gY2VudHJvaWQgbWVkaWFuIHNrZXduZXNzIGt1cnRvc2lzIGludGVncmF0ZWQgc3RhY2sgcmVkaXJlY3Q9Tm9uZSBkZWNpbWFsPTMnCiAgICAgICAgaWouSUoucnVuKHNldF9zdHJpbmcsIG1lYXN1cmVfc3RyaW5nKQogICAgICAgIHJvaV9zdGF0cyA9IGRlZmF1bHRkaWN0KGxpc3QpCiAgICAgICAgZm9yIGxpbmUgaW4gdHh0X2ZoOgogICAgICAgICAgICB4eSA9IGxpbmUucnN0cmlwKCkuc3BsaXQoIiwiKQogICAgICAgICAgICB4eV9jb29yZHMgPSBbaW50KGVsZW1lbnQpIGZvciBlbGVtZW50IGluIHh5IGlmIGVsZW1lbnQgbm90IGluICcnXQogICAgICAgICAgICB4X2Nvb3JkcyA9IFtpbnQoZWxlbWVudCkgZm9yIGVsZW1lbnQgaW4geHlbOjoyXSBpZiBlbGVtZW50IG5vdCBpbiAnJ10KICAgICAgICAgICAgeV9jb29yZHMgPSBbaW50KGVsZW1lbnQpIGZvciBlbGVtZW50IGluIHh5WzE6OjJdIGlmIGVsZW1lbnQgbm90IGluICcnXQogICAgICAgICAgICB4Y29vcmRzX2ppbnQgPSBKQXJyYXkoSkludCkoeF9jb29yZHMpCiAgICAgICAgICAgIHljb29yZHNfamludCA9IEpBcnJheShKSW50KSh5X2Nvb3JkcykKICAgICAgICAgICAgcG9seWdvbl9yb2lfaW5zdGFuY2UgPSBzY3lqYXZhLmppbXBvcnQoJ2lqLmd1aS5Qb2x5Z29uUm9pJykKICAgICAgICAgICAgcm9pX2luc3RhbmNlID0gc2N5amF2YS5qaW1wb3J0KCdpai5ndWkuUm9pJykKICAgICAgICAgICAgaW1wb3J0ZWRfcG9seWdvbiA9IHBvbHlnb25fcm9pX2luc3RhbmNlKHhjb29yZHNfamludCwgeWNvb3Jkc19qaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHhfY29vcmRzKSwgaW50KHJvaV9pbnN0YW5jZS5QT0xZR09OKSkKICAgICAgICAgICAgaW1wLnNldFJvaShpbXBvcnRlZF9wb2x5Z29uKQogICAgICAgICAgICBybS5hZGRSb2koaW1wb3J0ZWRfcG9seWdvbikKICAgICAgICAgICAgaWouSUoucnVuKGltcCwgJ01lYXN1cmUnLCAnJykKICAgICAgICBzbGljZV9yZXN1bHQgPSBpai5SZXN1bHRzVGFibGUuZ2V0UmVzdWx0c1RhYmxlKCkKICAgICAgICBzbGljZV90YWJsZSA9IGlqLmNvbnZlcnQoKS5jb252ZXJ0KHNsaWNlX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjeWphdmEuamltcG9ydCgnb3JnLnNjaWphdmEudGFibGUuVGFibGUnKSkKICAgICAgICBzbGljZV9tZWFzdXJlbWVudHMgPSBpai5weS5mcm9tX2phdmEoc2xpY2VfdGFibGUpCiAgICAgICAgb3V0cHV0X2RpY3Rbc2xpY2VfbmFtZV1bJ21lYXN1cmVtZW50cyddID0gc2xpY2VfbWVhc3VyZW1lbnRzCiAgICAgICAgaWouSUoucnVuKCdDbGVhciBSZXN1bHRzJykKICAgICAgICB0eHRfZmguY2xvc2UoKQogICAgICAgIGltcC5zZXRPdmVybGF5KG92KQogICAgICAgIGltcC5nZXRQcm9jZXNzb3IoKS5yZXNldE1pbkFuZE1heCgpCiAgICAgICAgc2xpY2VfbnVtYmVyID0gc2xpY2VfbnVtYmVyICsgMQogICAgcmV0dXJuIG91dHB1dF9kaWN0CmBgYAoKIyBDb252ZXJ0IHRoZSBzbGljZSBtZWFzdXJlbWVudHMgdG8gcGFuZGFzIGRmCgpzbGljZXNfdG9fcm9pX21lYXN1cmVtZW50cygpIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGgga2V5cyB3aGljaCBhcmUKdGhlIGZpbGVuYW1lcyBvZiBlYWNoIHJhdyB0aWYgZmlsZS4gIEVhY2ggZWxlbWVudCBvZiB0aGF0IGRpY3Rpb25hcnkKaXMgaW4gdHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlcwphbG9uZyB3aXRoIGEgZGYgb2YgdGhlIG1lYXN1cmVtZW50cyBwcm92aWRlZCBieSBpbWFnZWouCgpNeSBsaXR0bGUgZ2VvcGFuZGFzIGZ1bmN0aW9uIGFzc3VtZXMgYSBzaW5nbGUgbG9uZyBkZiB3aXRoIHNvbWUKY29sdW1ucyB3aGljaCB0ZWxsIGl0IHdoaWNoIHRpbWVwb2ludC4gIFNvIGxldHMgbWFrZSBhIHF1aWNrIGZ1bmN0aW9uCnRvIGdpdmUgdGhhdCBoZXJlLiAgT1RPSCBpdCBtYXkgYmUgd2lzZXIvYmV0dGVyIHRvIG1ha2Ugc29tZSBjaGFuZ2VzCnRvIHNsaWNlc190b19yb2lfbWVhc3VyZW1lbnRzKCkgc28gdGhhdCBpdCByZXR1cm5zIHRoYXQgZm9ybWF0IGRmOyBidXQKc2luY2UgSSBhbSB1c2luZyB0aGlzIGFzIGEgbGVhcm5pbmcgZXhwZXJpZW5jZSB0byBnZXQgbW9yZSBjb21mb3J0YWJsZQp3aXRoIHB5dGhvbiBkYXRhIHN0cnVjdHVyZXMsIEkgd2lsbCBub3QgZG8gaXQgdGhhdCB3YXkuCgpgYGB7cHl0aG9uIGNvbnZlcnRfc2xpY2VzX3RvX3BhbmRhc30KZGVmIGNvbnZlcnRfc2xpY2VzX3RvX3BhbmRhcyhzbGljZXMpOgogICAgIiIiIER1bXAgdGhlIGNlbGxwb3NlX3Jlc3VsdCBzbGljZSBkYXRhIHRvIGEgc2luZ2xlIGRmLgoKICAgIFRoZXJlIGlzIG5vIGdvb2QgcmVhc29uIGZvciBtZSB0byBzdG9yZSB0aGUgZGF0YSBhcyBhIHNlcmllcyBvZgogICAgZGF0YWZyYW1lcyB3aXRoaW4gYSBkaWN0aW9uYXJ5IGV4Y2VwdCBJIHdhbnQgdG8gZ2V0IG1vcmUKICAgIGNvbWZvcnRhYmxlIHdpdGggcHl0aG9uIGRhdGFzdHJ1Y3R1cmVzLiAgVGh1cywgdGhpcyBmdW5jdGlvbgogICAgc2hvdWxkIGJlIGV4dHJhbmVvdXMsIGJ1dCBzZXJ2ZXMgYXMgYSB3YXkgdG8gZ28gZnJvbSBteSBoYXNoIHRvIGEKICAgIHNpbmdsZSBkZi4KICAgICIiIgogICAgY29uY2F0ZW5hdGVkID0gcGFuZGFzLkRhdGFGcmFtZSgpCiAgICBzbGljZV9rZXlzID0gbGlzdChzbGljZXMua2V5cygpKQogICAgc2xpY2VfY291bnRlciA9IDAKICAgIGZvciBrIGluIHNsaWNlX2tleXM6CiAgICAgICAgc2xpY2VfY291bnRlciA9IHNsaWNlX2NvdW50ZXIgKyAxCiAgICAgICAgY3VycmVudF9zbGljZSA9IHNsaWNlc1trXQogICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgIHByaW50KGYiVGhlIHNsaWNlIGlzIHtrfSIpCiAgICAgICAgc2xpY2VfbnVtYmVyID0gY3VycmVudF9zbGljZVsnc2xpY2VfbnVtYmVyJ10KICAgICAgICBzbGljZV9kYXRhID0gY3VycmVudF9zbGljZVsnbWVhc3VyZW1lbnRzJ10KICAgICAgICBzbGljZV9kYXRhWydGcmFtZSddID0gc2xpY2VfbnVtYmVyCiAgICAgICAgaWYgKHNsaWNlX2NvdW50ZXIgPT0gMSk6CiAgICAgICAgICAgIGNvbmNhdGVuYXRlZCA9IHNsaWNlX2RhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25jYXRlbmF0ZWQgPSBwYW5kYXMuY29uY2F0KFtjb25jYXRlbmF0ZWQsIHNsaWNlX2RhdGFdKQogICAgIyMgVGhpcyBpcyBhIGxpdHRsZSBzaWxseSwgYnV0IEkgY291bGRuJ3QgcmVtZW1iZXIgdGhhdCB0aGUgaW5kZXggYXR0cmlidXRlCiAgICAjIyBpcyB0aGUgbnVtZXJpYyByb3duYW1lIGZvciBhIG1vbWVudAogICAgIyMgVGhlIHJlc2V0X2luZGV4KCkgZG9lcyB3aGF0IGl0IHNheXMgb24gdGhlIHRpbmUsIGFuZCBjaGFuZ2VzIHRoZSAxOjE5LCAxOjIwLCBldGMKICAgICMjIG9mIGVhY2ggaW5kaXZpZHVhbCB0aW1lIEZyYW1lIHRvIGEgc2luZ2xlIHJhbmdlIG9mIDE6MjAwMAogICAgY29uY2F0ZW5hdGVkLmluZGV4ID0gY29uY2F0ZW5hdGVkLnJlc2V0X2luZGV4KCkuaW5kZXgKICAgIHJldHVybiBjb25jYXRlbmF0ZWQKYGBgCgojIENyZWF0ZSBjZWxsIGdyb3VwcwoKYGBge3B5dGhvbiBuZWFyZXN0X25laWdoYm9yX2Z1bmN0aW9ufQpkZWYgbmVhcmVzdF9jZWxsc19vdmVyX3RpbWUoZGYsIG1heF9kaXN0ID0gMTAuMCwgbWF4X3Byb3AgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2NvbHVtbiA9ICdYJywgeV9jb2x1bW4gPSAnWScsIHZlcmJvc2UgPSBUcnVlKToKICAgICIiIlRyYWNlIGNlbGxzIG92ZXIgdGltZQoKICAgIElmIEkgdW5kZXJzdGFuZCBKYWNxdWVzJyBnb2FscyBjb3JyZWN0bHksIHRoZSB0cmFjaW5nIG9mIGNlbGxzCiAgICBvdmVyIHRpbWUgc2hvdWxkIGJlIGEgcmVhc29uYWJseSB0cmFjdGFibGUgcHJvYmxlbSBmb3IgdGhlIHZhcmlvdXMKICAgIGdlby1zdGF0aXN0aWNzIHRvb2xzIHRvIGhhbmRsZTsgdGhlaXIgd2hvbGUgcHVycG9zZSBpcyB0bwogICAgY2FsY3VsYXRlIG4tZGltZW5zaW9uYWwgZGlzdGFuY2VzLiAgU28sIGxldCB1cyBwYXNzIG15IGRmIHRvIG9uZQogICAgb2YgdGhlbSBhbmQgc2VlIHdoYXQgaGFwcGVucyEKCiAgICBVcG9uIGNvbXBsZXRpb24sIHdlIHNob3VsZCBnZXQgYW4gYXJyYXkoZGljdGlvbmFyeT8gSSBmb3JnZXQpIG9mCiAgICBhcnJheXMgd2hlcmUgZWFjaCBwcmltYXJ5IGtleSBpcyB0aGUgdG9wLWxldmVsIGNlbGwgSUQuICBFYWNoCiAgICBpbnRlcm5hbCBhcnJheSBpcyB0aGUgc2V0IG9mIElEcyBmcm9tIHRoZSBnZW9wYW5kYXMgZGF0YWZyYW1lLAogICAgd2hpY2ggY29udGFpbnMgYWxsIG9mIHRoZSBtZWFzdXJlbWVudHMuICBUaHVzLCB3ZSBjYW4gZWFzaWx5CiAgICBleHRyYWN0IHRoZSBkYXRhIGZvciBpbmRpdmlkdWFsIGNlbGxzIGFuZCBwbGF5IHdpdGggaXQuCiAgICAiIiIKICAgIGdkZiA9IGdlb3BhbmRhcy5HZW9EYXRhRnJhbWUoCiAgICAgICAgZGYsCiAgICAgICAgZ2VvbWV0cnkgPSBnZW9wYW5kYXMucG9pbnRzX2Zyb21feHkoZGZbeF9jb2x1bW5dLCBkZlt5X2NvbHVtbl0pKQoKICAgIGZpbmFsX3RpbWUgPSBnZGYuRnJhbWUubWF4KCkKICAgIHBhaXJ3aXNlX2Rpc3RhbmNlcyA9IFtdCiAgICBmb3Igc3RhcnRfdGltZSBpbiByYW5nZSgxLCBmaW5hbF90aW1lKToKICAgICAgICBpID0gc3RhcnRfdGltZQogICAgICAgIGogPSBpICsgMQogICAgICAgIHRpX2lkeCA9IGdkZi5GcmFtZSA9PSBpCiAgICAgICAgdGpfaWR4ID0gZ2RmLkZyYW1lID09IGoKICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICBwcmludChmIkdldHRpbmcgZGlzdGFuY2VzIG9mIGRmcyB7aX0gYW5kIHtqfS4iKQogICAgICAgIHRpID0gZ2RmW3RpX2lkeF0KICAgICAgICB0aiA9IGdkZlt0al9pZHhdCiAgICAgICAgdGlfcm93cyA9IHRpLnNoYXBlWzBdCiAgICAgICAgdGpfcm93cyA9IHRqLnNoYXBlWzBdCiAgICAgICAgdGl0aiA9IGdlb3BhbmRhcy5zam9pbl9uZWFyZXN0KHRpLCB0aiwgZGlzdGFuY2VfY29sID0gInBhaXJ3aXNlX2Rpc3QiKQogICAgICAgIHBhaXJ3aXNlX2Rpc3RhbmNlcy5hcHBlbmQodGl0aikKCiAgICBpZF9jb3VudGVyID0gMAogICAgIyMgQ2VsbCBJRHMgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGNlbGxzCiAgICB0cmFjZWQgPSB7fQogICAgIyMgRW5kcG9pbnRzIHBvaW50aW5nIHRvIHRoZSBjZWxsIElEcwogICAgZW5kcyA9IHt9CiAgICBmb3IgaSBpbiByYW5nZSgwLCBmaW5hbF90aW1lIC0gMSk6CiAgICAgICAgcXVlcnkgPSBwYWlyd2lzZV9kaXN0YW5jZXNbaV0KICAgICAgICBwYXNzZWRfaWR4ID0gcXVlcnkucGFpcndpc2VfZGlzdCA8PSBtYXhfZGlzdAogICAgICAgIGZhaWxlZF9pZHggPSBxdWVyeS5wYWlyd2lzZV9kaXN0ID4gbWF4X2Rpc3QKICAgICAgICBpZiAoZmFpbGVkX2lkeC5zdW0oKSA+IDApOgogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgcHJpbnQoZiJTa2lwcGVkIHtmYWlsZWRfaWR4LnN1bSgpfSBlbGVtZW50cyBpbiBzZWdtZW50IHtpfS4iKQogICAgICAgIHF1ZXJ5ID0gcXVlcnlbcGFzc2VkX2lkeF0KCiAgICAgICAgcHJvcF9jaGFuZ2UgPSBxdWVyeS5BcmVhX2xlZnQgLyBxdWVyeS5BcmVhX3JpZ2h0CiAgICAgICAgaW5jcmVhc2VkX2lkeCA9IHByb3BfY2hhbmdlID4gMS4wCiAgICAgICAgcHJvcF9jaGFuZ2VbaW5jcmVhc2VkX2lkeF0gPSAxLjAgLyBwcm9wX2NoYW5nZVtpbmNyZWFzZWRfaWR4XQogICAgICAgIGZhaWxlZF9pZHggPSBwcm9wX2NoYW5nZSA8IG1heF9wcm9wCiAgICAgICAgcGFzc2VkX2lkeCA9IHByb3BfY2hhbmdlID49IG1heF9wcm9wCiAgICAgICAgaWYgKGZhaWxlZF9pZHguc3VtKCkgPiAwKToKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIHNraXBfc3RyaW5nID0gKGYiU2tpcHBlZCB7ZmFpbGVkX2lkeC5zdW0oKX0gZWxlbWVudHMgaW4gc2VnbWVudCB7aX0gIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYiYmVjYXVzZSB0aGUgc2l6ZSBjaGFuZ2VkIHRvbyBtdWNoLiIpCiAgICAgICAgICAgICAgICBwcmludChza2lwX3N0cmluZykKICAgICAgICAgICAgcXVlcnkgPSBxdWVyeVtwYXNzZWRfaWR4XQoKICAgICAgICBmb3Igcm93IGluIHF1ZXJ5Lml0ZXJ0dXBsZXMoKToKICAgICAgICAgICAgc3RhcnRfY2VsbCA9IHJvdy5JbmRleAogICAgICAgICAgICBlbmRfY2VsbCA9IHJvdy5pbmRleF9yaWdodAogICAgICAgICAgICBpZiBzdGFydF9jZWxsIGluIGVuZHMua2V5cygpOgogICAgICAgICAgICAgICAgY2VsbF9pZCA9IGVuZHNbc3RhcnRfY2VsbF0KICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsdWUgPSB0cmFjZWRbY2VsbF9pZF0KICAgICAgICAgICAgICAgIGN1cnJlbnRfdmFsdWUuYXBwZW5kKGVuZF9jZWxsKQogICAgICAgICAgICAgICAgdHJhY2VkW2NlbGxfaWRdID0gY3VycmVudF92YWx1ZQogICAgICAgICAgICAgICAgZW5kc1tlbmRfY2VsbF0gPSBjZWxsX2lkCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZF9jb3VudGVyID0gaWRfY291bnRlciArIDEKICAgICAgICAgICAgICAgIHRyYWNlZFtpZF9jb3VudGVyXSA9IFtzdGFydF9jZWxsLCBlbmRfY2VsbF0KICAgICAgICAgICAgICAgIGVuZHNbZW5kX2NlbGxdID0gaWRfY291bnRlcgogICAgcmV0dXJuIHRyYWNlZApgYGAKCiMgUnVuIHRoZSBmdW5jdGlvbnMgYW5kIHBsb3QgdGhlIHJlc3VsdHMKCiMjIFNlcGFyYXRlIHNsaWNlcwoKTm90ZSB0byBzZWxmLCBKYWNxdWVzJyBuZXcgZGF0YXNldCB1c2VzIHdhbnRlZF96ID09IDIsIHdhbnRlZF9jaGFubmVsID09IDMuCgpgYGB7cHl0aG9uIHJ1bl9zZXBhcmF0ZV9zbGljZXN9CnJhd19kYXRhc2V0LCBzYXZlZF9zbGljZXMsIHNsaWNlX2RpcmVjdG9yeSA9IHNlcGFyYXRlX3NsaWNlcyhpbnB1dF9maWxlLCB3YW50ZWRfeiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50ZWRfY2hhbm5lbCA9IDMpCmBgYAoKIyMgSW52b2tlIGNlbGxwb3NlCgpgYGB7cHl0aG9uIHJ1bl9pbnZva2VfY2VsbHBvc2V9CmNlbGxwb3NlX3Jlc3VsdCA9IGludm9rZV9jZWxscG9zZShzbGljZV9kaXJlY3RvcnksICdtb2RlbHMvQ1BfMjAyMjA1MjNfMTA0MDE2JykKYGBgCgojIyBjb2xsYXBzZSBaCmBgYHtweXRob24gcnVuX2NvbGxhcHNlX3p9CmNlbGxwb3NlX3Jlc3VsdCA9IGNvbGxhcHNlX3oocmF3X2RhdGFzZXQsIGNlbGxwb3NlX3Jlc3VsdCkKYGBgCgojIyBNZWFzdXJlIFJPSXMKCmBgYHtweXRob24gaW52b2tlX3NsaWNlX3RvX3JvaX0Kc2xpY2VfbWVhc3VyZW1lbnRzID0gc2xpY2VzX3RvX3JvaV9tZWFzdXJlbWVudHMoY2VsbHBvc2VfcmVzdWx0LCBjb2xsYXBzZWQgPSBUcnVlKQpgYGAKCiMjIENvbnZlcnQgdG8gcGFuZGFzCgpgYGB7cHl0aG9uIGludm9rZV9jb252ZXJ0X3BhbmRhc30KY29uY2F0ZW5hdGVkID0gY29udmVydF9zbGljZXNfdG9fcGFuZGFzKHNsaWNlX21lYXN1cmVtZW50cykKYGBgCgojIyBGaW5kIG5lYXJlc3QKCmBgYHtweXRob24gaW52b2tlX25lYXJlc3RfY2VsbHN9Cm5lYXJlc3QgPSBuZWFyZXN0X2NlbGxzX292ZXJfdGltZShjb25jYXRlbmF0ZWQsIG1heF9kaXN0ID0gMTAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfY29sdW1uID0gJ1gnLCB5X2NvbHVtbiA9ICdZJykKYGBgCgojIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBhIGdyb3VwIG9mIGNlbGxzCgpBcyBhIGZpbmFsIHN0ZXAsIHdlIHNob3VsZCBiZSBhYmxlIHRvIGV4dHJhY3QgYW5kIHBsYXkgd2l0aCB0aGUKaW5mb3JtYXRpb24gZnJvbSBvbmUgb3IgbW9yZSBncm91cHMgb2YgY2VsbHMuCgpgYGB7cHl0aG9uIGdldF9pbmZvfQpjZWxsX2lkID0gMTI5CmNlbGxfaWR4ID0gbmVhcmVzdFtjZWxsX2lkXQpjZWxsX2RhdGEgPSBjb25jYXRlbmF0ZWQubG9jW2NlbGxfaWR4XQpsZW4oY2VsbF9kYXRhKQpjZWxsX2RhdGEgPSBjZWxsX2RhdGEucmVzZXRfaW5kZXgoKQoKc2NhdHRlciA9IHBsdC5zY2F0dGVyKGNlbGxfZGF0YVsnWCddLCBjZWxsX2RhdGFbJ1knXSkKZmluYWxfcm93ID0gY2VsbF9kYXRhLmluZGV4Lm1heCgpCmZvciBzdGFydF90aW1lIGluIHJhbmdlKDAsIGZpbmFsX3JvdyAtIDEpOgogICAgdGlfaWR4ID0gY2VsbF9kYXRhLmluZGV4ID09IHN0YXJ0X3RpbWUKICAgIHRqX2lkeCA9IGNlbGxfZGF0YS5pbmRleCA9PSBzdGFydF90aW1lICsgMQogICAgcDF4ID0gY2VsbF9kYXRhW3RpX2lkeF0uWAogICAgcDJ4ID0gY2VsbF9kYXRhW3RqX2lkeF0uWAogICAgcDF5ID0gY2VsbF9kYXRhW3RpX2lkeF0uWQogICAgcDJ5ID0gY2VsbF9kYXRhW3RqX2lkeF0uWQogICAgeF9wb2ludHMgPSBbcDF4LCBwMnhdCiAgICB5X3BvaW50cyA9IFtwMXksIHAyeV0KICAgIHBsdC5wbG90KHhfcG9pbnRzLCB5X3BvaW50cykKZmluYWxtMV9pZHggPSBjZWxsX2RhdGEuaW5kZXggPT0gZmluYWxfcm93IC0gMQpmaW5hbF9pZHggPSBjZWxsX2RhdGEuaW5kZXggPT0gZmluYWxfcm93CmZpbmFsbTFfeCA9IGNlbGxfZGF0YVtmaW5hbG0xX2lkeF0uWApmaW5hbF94ID0gY2VsbF9kYXRhW2ZpbmFsX2lkeF0uWApmaW5hbG0xX3kgPSBjZWxsX2RhdGFbZmluYWxtMV9pZHhdLlkKZmluYWxfeSA9IGNlbGxfZGF0YVtmaW5hbF9pZHhdLlkKeF9wb2ludHMgPSBbZmluYWxtMV94LCBmaW5hbF94XQp5X3BvaW50cyA9IFtmaW5hbG0xX3ksIGZpbmFsX3ldCnBsdC5wbG90KHhfcG9pbnRzLCB5X3BvaW50cykKcGx0LnNob3coKQoKc2VhYm9ybi52aW9saW5wbG90KGRhdGEgPSBjZWxsX2RhdGEuQXJlYSkKcGx0LnNob3coKQpgYGAKCgoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAo=