1 Description

This notebook will trim and merge R1 and R2 reads. The max length of 31bp is based on the fastp insert peak size from previous trimming tests based on the the adapter and polyG trimming results, and previous evaluation of mean read lengths via FastQC and MultiQC.

1.1 Inputs:

  • sRNAseq paired-end FastQs (e.g. *.fastq.gz)

1.2 Outputs:

  • *.fastqc.html: FastQC results, in HTML format.

  • *fastp-adapters-polyG-31bp-merged.fq.gz: Trimmed and merged reads with final length of 31bp.

  • multiqc_report.html: A summary report of the alignment results generated by MultiQC, in HTML format.

Libraries were prepared and sequenced by Azenta:

Due to large file sizes of FastQs, they cannot be added to GitHub. Full output from this notebook are available here:

2 Create a Bash variables file

This allows usage of Bash variables across R Markdown chunks.

{
echo "#### Assign Variables ####"
echo ""

echo "# Data directories"
echo 'export repo_dir=/home/shared/8TB_HDD_01/sam/gitrepos/RobertsLab/project-clam-oa'
echo 'export output_dir_top=${repo_dir}/output/01.00-trimming-fastp-fastqc'
echo 'export raw_reads_dir="${repo_dir}/output/00.00-fastqc-concatenation-raw_reads"'
echo 'export trimmed_fastqs_dir="${output_dir_top}"'
echo ""

echo "# Paths to programs"
echo 'export programs_dir="/home/shared"'
echo 'export fastp="${programs_dir}/fastp-v0.24.0/fastp"'
echo 'export fastqc="${programs_dir}/FastQC-0.12.1/fastqc"'
echo 'export multiqc="/home/sam/programs/mambaforge/bin/multiqc"'
echo ""


echo "# Set FastQ filename patterns"
echo "export fastq_pattern='*.fastq.gz'"
echo "export R1_fastq_pattern='*_R1_*.fastq.gz'"
echo "export R2_fastq_pattern='*_R2_*.fastq.gz'"
echo "export trimmed_fastq_pattern='*fastp-trim*.fq.gz'"
echo ""

echo "# Input/output files"
echo 'export fastq_checksums=input_fastq_checksums.md5'
echo 'export NEB_adapters_fasta=NEB-adapters.fasta'
echo ""

echo "## NEB nebnext-small-rna-library-prep-set-for-illumina adapters"
echo 'export first_adapter="AGATCGGAAGAGCACACGTCTGAACTCCAGTCAC"'
echo 'export second_adapter="GATCGTCGGACTGTAGAACTCTGAACGTGTAGATCTCGGTGGTCGCCGTATCATT"'
echo ""

echo "# Set maximum read length for fastp merging"
echo 'export max_read_length="31"'
echo ""

echo "# Set number of CPUs to use"
echo 'export threads=40'
echo ""


echo "## Inititalize arrays"
echo 'export fastq_array_R1=()'
echo 'export fastq_array_R2=()'
echo 'export trimmed_fastqs_array=()'
echo 'export R1_names_array=()'
echo 'export R2_names_array=()'
echo ""

echo "# Print formatting"
echo 'export line="--------------------------------------------------------"'
echo ""
} > .bashvars

cat .bashvars
#### Assign Variables ####

# Data directories
export repo_dir=/home/shared/8TB_HDD_01/sam/gitrepos/RobertsLab/project-clam-oa
export output_dir_top=${repo_dir}/output/01.00-trimming-fastp-fastqc
export raw_reads_dir="${repo_dir}/output/00.00-fastqc-concatenation-raw_reads"
export trimmed_fastqs_dir="${output_dir_top}"

# Paths to programs
export programs_dir="/home/shared"
export fastp="${programs_dir}/fastp-v0.24.0/fastp"
export fastqc="${programs_dir}/FastQC-0.12.1/fastqc"
export multiqc="/home/sam/programs/mambaforge/bin/multiqc"

# Set FastQ filename patterns
export fastq_pattern='*.fastq.gz'
export R1_fastq_pattern='*_R1_*.fastq.gz'
export R2_fastq_pattern='*_R2_*.fastq.gz'
export trimmed_fastq_pattern='*fastp-trim*.fq.gz'

# Input/output files
export fastq_checksums=input_fastq_checksums.md5
export NEB_adapters_fasta=NEB-adapters.fasta

## NEB nebnext-small-rna-library-prep-set-for-illumina adapters
export first_adapter="AGATCGGAAGAGCACACGTCTGAACTCCAGTCAC"
export second_adapter="GATCGTCGGACTGTAGAACTCTGAACGTGTAGATCTCGGTGGTCGCCGTATCATT"

# Set maximum read length for fastp merging
export max_read_length="31"

# Set number of CPUs to use
export threads=40

## Inititalize arrays
export fastq_array_R1=()
export fastq_array_R2=()
export trimmed_fastqs_array=()
export R1_names_array=()
export R2_names_array=()

# Print formatting
export line="--------------------------------------------------------"

3 Create adapters FastA for use with fastp trimming

# Load bash variables into memory
source .bashvars

# Create output directory, if it doesn't exist
mkdir --parents "${output_dir_top}"

echo "Creating adapters FastA."
echo ""
adapter_count=0

# Check for adapters file first
# Then create adapters file if doesn't exist
if [ -f "${output_dir_top}/${NEB_adapters_fasta}" ]; then
  echo "${output_dir_top}/${NEB_adapters_fasta} already exists. Nothing to do."
else
  for adapter in "${first_adapter}" "${second_adapter}"
  do
    adapter_count=$((adapter_count + 1))
    printf ">%s\n%s\n" "adapter_${adapter_count}" "${adapter}"
  done >> "${output_dir_top}/${NEB_adapters_fasta}"
fi

echo ""
echo "Adapters FastA:"
echo ""
cat "${output_dir_top}/${NEB_adapters_fasta}"
echo ""
Creating adapters FastA.


Adapters FastA:

>adapter_1
AGATCGGAAGAGCACACGTCTGAACTCCAGTCAC
>adapter_2
GATCGTCGGACTGTAGAACTCTGAACGTGTAGATCTCGGTGGTCGCCGTATCATT

4 Trimming and merging with fastp

# Load bash variables into memory
source .bashvars

# Create output directory, if it doesn't exist.
mkdir --parents "${trimmed_fastqs_dir}"

# Change to directory with raw reads
cd "${raw_reads_dir}"

# Create arrays of FastQ R1 files and sample names
# Do NOT quote R1_fastq_pattern variable
for fastq in ${R1_fastq_pattern}
do
  fastq_array_R1+=("${fastq}")

  # Use parameter substitution to remove all text up to and including last "." from
  # right side of string.
  R1_names_array+=("${fastq%%.*}")
done

# Create array of FastQ R2 files
# Do NOT quote R2_fastq_pattern variable
for fastq in ${R2_fastq_pattern}
do
  fastq_array_R2+=("${fastq}")

  # Use parameter substitution to remove all text up to and including last "." from
  # right side of string.
  R2_names_array+=("${fastq%%.*}")
done

############ RUN FASTP ############
# Uses parameter substitution (e.g. ${R1_sample_name%%_*})to rm the _R[12]
# Uses NEB adapter file


# Run fastp on files
echo "Beginning fastp trimming."
echo ""

time \
for index in "${!fastq_array_R1[@]}"
do
  # Get sample name
  R1_sample_name="${R1_names_array[index]%%_*}"
  R2_sample_name="${R2_names_array[index]%%_*}"

  # Save merged sample name
  merged_sample_name="${R1_sample_name}-fastp-adapters-polyG-${max_read_length}bp-merged"
  
  # Begin fastp trimming
  ${fastp} \
  --in1 ${fastq_array_R1[index]} \
  --in2 ${fastq_array_R2[index]} \
  --adapter_fasta ${output_dir_top}/${NEB_adapters_fasta} \
  --trim_poly_g \
  --overlap_len_require 17 \
  --length_limit ${max_read_length} \
  --merge \
  --merged_out ${trimmed_fastqs_dir}/${merged_sample_name}.fq.gz \
  --thread ${threads} \
  --html "${trimmed_fastqs_dir}/${merged_sample_name}.html" \
  --json "${trimmed_fastqs_dir}/${merged_sample_name}.json" \
  --report_title "${trimmed_fastqs_dir}/${merged_sample_name}" \
  2> ${trimmed_fastqs_dir}/${merged_sample_name}.stderr
    
  # Move to trimmed directory
  # This is done so checksums file doesn't include excess path
  cd ${trimmed_fastqs_dir}

  # Generate md5 checksums for newly trimmed files
  md5sum "${merged_sample_name}.fq.gz" | tee --append "${merged_sample_name}.fq.gz.md5"
    
  # Change back to to raw reads directory
  cd "${raw_reads_dir}"

done

echo ""
echo "fastp trimming complete."
echo ""

############ END fastp ############
Beginning fastp trimming.

51f055f1810a19deb2ca09ea5bb9df0b  196-fastp-adapters-polyG-31bp-merged.fq.gz
a0673f4ad1fda1fe3f375aa2c76d5fa3  199-fastp-adapters-polyG-31bp-merged.fq.gz
b989841536ec95b3aeb10ef20f848ea7  211-fastp-adapters-polyG-31bp-merged.fq.gz
c33d44ac03a2095e55c3167b35fde0da  24-fastp-adapters-polyG-31bp-merged.fq.gz
02ddae1e57b7b9e7e63d74b4e1f725b8  260-fastp-adapters-polyG-31bp-merged.fq.gz
7c54b3c782c4ed0f15625243dfacc10a  26-fastp-adapters-polyG-31bp-merged.fq.gz
ca7286f6967abf299a9557f204eee659  30-fastp-adapters-polyG-31bp-merged.fq.gz
96c1e31ce89b5caa8a59b54c2745ae1e  310-fastp-adapters-polyG-31bp-merged.fq.gz
6d5a35136a20d9da975cf8740493a711  33-fastp-adapters-polyG-31bp-merged.fq.gz
b9c94cba5c2d2df557a833ab3a868763  341-fastp-adapters-polyG-31bp-merged.fq.gz
7530a8c684b78aa86dee725a71601f8e  34-fastp-adapters-polyG-31bp-merged.fq.gz
7c898a66f9119084ca290f0d85a34f12  35-fastp-adapters-polyG-31bp-merged.fq.gz
d80f6b589e5228731de750dd6ec5dac9  363-fastp-adapters-polyG-31bp-merged.fq.gz
f77f9aa54e2c6662abe24c3a063b6006  367-fastp-adapters-polyG-31bp-merged.fq.gz
a2281f8237ae8cb385a2c22bd185fe57  376-fastp-adapters-polyG-31bp-merged.fq.gz
03b221d3f58f3efb6a6c9a7dcfd37233  460-fastp-adapters-polyG-31bp-merged.fq.gz
c266d11555b76213d739626d40715dde  485-fastp-adapters-polyG-31bp-merged.fq.gz
3fdd30605d7a94c36b9191b34e06fbd3  501-fastp-adapters-polyG-31bp-merged.fq.gz
6929563775fded5a7a9023e3b87d76cd  71-fastp-adapters-polyG-31bp-merged.fq.gz
048d7334f58f5ce149aeadc5745fc28a  88-fastp-adapters-polyG-31bp-merged.fq.gz

real    11m52.885s
user    140m6.333s
sys 3m22.653s

fastp trimming complete.

5 FastQC/MultiQC on trimmed reads

# Load bash variables into memory
source .bashvars

# Create output directory, if it doesn't exist.
mkdir --parents "${trimmed_fastqs_dir}"

############ RUN FASTQC ############

### NOTE: Do NOT quote raw_fastqc_list
# Create array of trimmed FastQs
trimmed_fastqs_array=(${trimmed_fastqs_dir}/*merged.fq.gz)

# Pass array contents to new variable as space-delimited list
trimmed_fastqc_list=$(echo "${trimmed_fastqs_array[*]}")

echo "Beginning FastQC on raw reads..."
echo ""

# Run FastQC
${fastqc} \
--threads ${threads} \
--outdir ${trimmed_fastqs_dir} \
--quiet \
${trimmed_fastqc_list}

echo "FastQC on trimmed reads complete!"
echo ""

############ END FASTQC ############

############ RUN MULTIQC ############
echo "Beginning MultiQC on raw FastQC..."
echo ""

${multiqc} ${trimmed_fastqs_dir} -o ${trimmed_fastqs_dir}

echo ""
echo "MultiQC on trimmed FastQs complete."
echo ""

############ END MULTIQC ############

echo "Removing FastQC zip files."
echo ""
rm ${trimmed_fastqs_dir}/*.zip
echo "FastQC zip files removed."
echo ""
Beginning FastQC on raw reads...

application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
application/gzip
FastQC on trimmed reads complete!

Beginning MultiQC on raw FastQC...


  /// MultiQC 🔍 | v1.14

|           multiqc | MultiQC Version v1.25.2 now available!
|           multiqc | Search path : /home/shared/8TB_HDD_01/sam/gitrepos/RobertsLab/project-clam-oa/output/01.00-trimming-fastp-fastqc
|         searching | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 141/141  
|            fastqc | Found 20 reports
|           multiqc | Compressing plot data
|           multiqc | Report      : ../output/01.00-trimming-fastp-fastqc/multiqc_report.html
|           multiqc | Data        : ../output/01.00-trimming-fastp-fastqc/multiqc_data
|           multiqc | MultiQC complete

MultiQC on trimmed FastQs complete.

Removing FastQC zip files.

FastQC zip files removed.

6 List output files

# Load bash variables into memory
source .bashvars

# View directory contents
ls -lh ${trimmed_fastqs_dir}
total 6.8G
-rw-r--r-- 1 sam sam 564K Dec  5 19:06 196-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 336M Dec  5 18:54 196-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 18:54 196-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:54 196-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:54 196-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 18:54 196-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 569K Dec  5 19:06 199-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 283M Dec  5 18:54 199-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 18:54 199-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:54 199-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:54 199-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 18:54 199-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 567K Dec  5 19:06 211-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 298M Dec  5 18:55 211-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 18:55 211-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 349K Dec  5 18:55 211-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  91K Dec  5 18:55 211-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 18:55 211-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 566K Dec  5 19:06 24-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 320M Dec  5 18:56 24-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 18:56 24-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:56 24-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:56 24-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 18:56 24-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 569K Dec  5 19:06 260-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 327M Dec  5 18:56 260-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 18:56 260-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:56 260-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:56 260-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 18:56 260-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 568K Dec  5 19:06 26-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 306M Dec  5 18:57 26-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 18:57 26-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 349K Dec  5 18:57 26-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  91K Dec  5 18:57 26-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 18:57 26-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 570K Dec  5 19:06 30-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 331M Dec  5 18:57 30-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 18:57 30-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:57 30-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:57 30-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 18:57 30-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 571K Dec  5 19:06 310-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 326M Dec  5 18:58 310-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 18:58 310-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:58 310-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:58 310-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 18:58 310-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 566K Dec  5 19:06 33-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 341M Dec  5 18:58 33-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 18:58 33-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 351K Dec  5 18:58 33-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:58 33-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 18:58 33-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 564K Dec  5 19:06 341-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 325M Dec  5 18:59 341-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 18:59 341-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:59 341-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:59 341-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 18:59 341-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 564K Dec  5 19:06 34-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 394M Dec  5 18:59 34-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 18:59 34-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 18:59 34-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 18:59 34-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 18:59 34-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 570K Dec  5 19:06 35-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 298M Dec  5 19:00 35-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 19:00 35-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 349K Dec  5 19:00 35-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  91K Dec  5 19:00 35-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 19:00 35-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 572K Dec  5 19:06 363-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 354M Dec  5 19:01 363-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 19:01 363-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 19:01 363-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 19:01 363-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 19:01 363-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 564K Dec  5 19:06 367-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 323M Dec  5 19:01 367-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 19:01 367-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 349K Dec  5 19:01 367-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  91K Dec  5 19:01 367-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 19:01 367-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 566K Dec  5 19:07 376-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 603M Dec  5 19:02 376-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 19:02 376-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 351K Dec  5 19:02 376-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  93K Dec  5 19:02 376-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 19:02 376-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 565K Dec  5 19:06 460-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 305M Dec  5 19:03 460-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 19:03 460-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 19:03 460-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 19:03 460-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 19:03 460-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 566K Dec  5 19:06 485-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 320M Dec  5 19:03 485-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 19:03 485-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 19:03 485-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 19:03 485-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 19:03 485-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 563K Dec  5 19:06 501-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 353M Dec  5 19:04 501-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   77 Dec  5 19:04 501-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 19:04 501-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 19:04 501-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.3K Dec  5 19:04 501-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 568K Dec  5 19:06 71-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 380M Dec  5 19:05 71-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 19:05 71-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 19:05 71-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 19:05 71-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 19:05 71-fastp-adapters-polyG-31bp-merged.stderr
-rw-r--r-- 1 sam sam 563K Dec  5 19:06 88-fastp-adapters-polyG-31bp-merged_fastqc.html
-rw-r--r-- 1 sam sam 374M Dec  5 19:05 88-fastp-adapters-polyG-31bp-merged.fq.gz
-rw-r--r-- 1 sam sam   76 Dec  5 19:05 88-fastp-adapters-polyG-31bp-merged.fq.gz.md5
-rw-r--r-- 1 sam sam 350K Dec  5 19:05 88-fastp-adapters-polyG-31bp-merged.html
-rw-r--r-- 1 sam sam  92K Dec  5 19:05 88-fastp-adapters-polyG-31bp-merged.json
-rw-r--r-- 1 sam sam 2.2K Dec  5 19:05 88-fastp-adapters-polyG-31bp-merged.stderr
drwxr-xr-x 2 sam sam 4.0K Dec  5 19:07 multiqc_data
-rw-r--r-- 1 sam sam 1.3M Dec  5 19:07 multiqc_report.html
-rw-r--r-- 1 sam sam  113 Dec  5 18:53 NEB-adapters.fasta
LS0tCnRpdGxlOiAiMDEuMDAtdHJpbW1pbmctZmFzdHAtZmFzdHFjIgphdXRob3I6ICJTYW0gV2hpdGUiCmRhdGU6ICIyMDI0LTEyLTA3IgpvdXRwdXQ6IAogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgZ2l0aHViX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYgotLS0KCiMgRGVzY3JpcHRpb24KClRoaXMgbm90ZWJvb2sgd2lsbCB0cmltIGFuZCBtZXJnZSBSMSBhbmQgUjIgcmVhZHMuIFRoZSBtYXggbGVuZ3RoIG9mIDMxYnAgaXMgYmFzZWQgb24gdGhlIGBmYXN0cGAgaW5zZXJ0IHBlYWsgc2l6ZSBmcm9tIHByZXZpb3VzIHRyaW1taW5nIHRlc3RzIGJhc2VkIG9uIHRoZSB0aGUgYWRhcHRlciBhbmQgcG9seUcgdHJpbW1pbmcgcmVzdWx0cywgYW5kIHByZXZpb3VzIGV2YWx1YXRpb24gb2YgbWVhbiByZWFkIGxlbmd0aHMgdmlhIFtgRmFzdFFDYF0oaHR0cHM6Ly93d3cuYmlvaW5mb3JtYXRpY3MuYmFicmFoYW0uYWMudWsvcHJvamVjdHMvZmFzdHFjLykgYW5kIFtgTXVsdGlRQ2BdKGh0dHBzOi8vbXVsdGlxYy5pbmZvLykuCgojIyBJbnB1dHM6CgotICAgc1JOQXNlcSBwYWlyZWQtZW5kIEZhc3RRcyAoZS5nLiBgKi5mYXN0cS5nemApCgojIyBPdXRwdXRzOgoKLSBgKi5mYXN0cWMuaHRtbGA6IEZhc3RRQyByZXN1bHRzLCBpbiBIVE1MIGZvcm1hdC4KCi0gYCpmYXN0cC1hZGFwdGVycy1wb2x5Ry0zMWJwLW1lcmdlZC5mcS5nemA6IFRyaW1tZWQgYW5kIG1lcmdlZCByZWFkcyB3aXRoIGZpbmFsIGxlbmd0aCBvZiAzMWJwLgoKLSBgbXVsdGlxY19yZXBvcnQuaHRtbGA6IEEgc3VtbWFyeSByZXBvcnQgb2YgdGhlIGFsaWdubWVudCByZXN1bHRzCiAgICBnZW5lcmF0ZWQgYnkgW011bHRpUUNdKGh0dHBzOi8vZ2l0aHViLmNvbS9NdWx0aVFDL011bHRpUUMpLCBpbiBIVE1MCiAgICBmb3JtYXQuCgoKCkxpYnJhcmllcyB3ZXJlIHByZXBhcmVkIGFuZCBzZXF1ZW5jZWQgYnkgQXplbnRhOgoKLSAgIExpYnJhcnkgcHJlcDogW05FQiBuZWJuZXh0LXNtYWxsLXJuYS1saWJyYXJ5LXByZXAtc2V0LWZvci1pbGx1bWluYSBraXRdKGh0dHBzOi8vd3d3Lm5lYi5jb20vZW4tdXMvLS9tZWRpYS9uZWJ1cy9maWxlcy9tYW51YWxzL21hbnVhbGU3MzAwX2U3MzMwX2U3NTYwX2U3NTgwLnBkZj9yZXY9ZDA5NjRhMmU2Mzc4NDNiMWFmY2I5ZjdkNjY2ZDA3YjImaGFzaD03QUMwQjBFQjAxMjcwOEVGQUIwRTREQkVFQUYxNDQ2QSkgKFBERikKCi0gICBTZXF1ZW5jaW5nOiBJbGx1bWluYSBIaVNlcSA0MDAwLCAxNTBicCBQRQoKCkR1ZSB0byBsYXJnZSBmaWxlIHNpemVzIG9mIEZhc3RRcywgdGhleSBjYW5ub3QgYmUgYWRkZWQgdG8gR2l0SHViLiBGdWxsIG91dHB1dCBmcm9tIHRoaXMgbm90ZWJvb2sgYXJlIGF2YWlsYWJsZSBoZXJlOgoKLSBbaHR0cHM6Ly9nYW5uZXQuZmlzaC53YXNoaW5ndG9uLmVkdS9naXRyZXBvcy9wcm9qZWN0LWNsYW0tb2Evb3V0cHV0LzAxLjAwLXRyaW1taW5nLWZhc3RwLWZhc3RxY10oaHR0cHM6Ly9nYW5uZXQuZmlzaC53YXNoaW5ndG9uLmVkdS9naXRyZXBvcy9wcm9qZWN0LWNsYW0tb2Evb3V0cHV0LzAxLjAwLXRyaW1taW5nLWZhc3RwLWZhc3RxYykKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsICAgICAgICAgIyBEaXNwbGF5IGNvZGUgY2h1bmtzCiAgZXZhbCA9IEZBTFNFLCAgICAgICAgIyBFdmFsdWF0ZSBjb2RlIGNodW5rcwogIHdhcm5pbmcgPSBGQUxTRSwgICAgICMgSGlkZSB3YXJuaW5ncwogIG1lc3NhZ2UgPSBGQUxTRSwgICAgICMgSGlkZSBtZXNzYWdlcwogIGNvbW1lbnQgPSAiIiAgICAgICAgICMgUHJldmVudHMgYXBwZW5kaW5nICcjIycgdG8gYmVnaW5uaW5nIG9mIGxpbmVzIGluIGNvZGUgb3V0cHV0CikKYGBgCgojIENyZWF0ZSBhIEJhc2ggdmFyaWFibGVzIGZpbGUKClRoaXMgYWxsb3dzIHVzYWdlIG9mIEJhc2ggdmFyaWFibGVzIGFjcm9zcyBSIE1hcmtkb3duIGNodW5rcy4KCmBgYHtyIHNhdmUtYmFzaC12YXJpYWJsZXMtdG8tcnZhcnMtZmlsZSwgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQp7CmVjaG8gIiMjIyMgQXNzaWduIFZhcmlhYmxlcyAjIyMjIgplY2hvICIiCgplY2hvICIjIERhdGEgZGlyZWN0b3JpZXMiCmVjaG8gJ2V4cG9ydCByZXBvX2Rpcj0vaG9tZS9zaGFyZWQvOFRCX0hERF8wMS9zYW0vZ2l0cmVwb3MvUm9iZXJ0c0xhYi9wcm9qZWN0LWNsYW0tb2EnCmVjaG8gJ2V4cG9ydCBvdXRwdXRfZGlyX3RvcD0ke3JlcG9fZGlyfS9vdXRwdXQvMDEuMDAtdHJpbW1pbmctZmFzdHAtZmFzdHFjJwplY2hvICdleHBvcnQgcmF3X3JlYWRzX2Rpcj0iJHtyZXBvX2Rpcn0vb3V0cHV0LzAwLjAwLWZhc3RxYy1jb25jYXRlbmF0aW9uLXJhd19yZWFkcyInCmVjaG8gJ2V4cG9ydCB0cmltbWVkX2Zhc3Rxc19kaXI9IiR7b3V0cHV0X2Rpcl90b3B9IicKZWNobyAiIgoKZWNobyAiIyBQYXRocyB0byBwcm9ncmFtcyIKZWNobyAnZXhwb3J0IHByb2dyYW1zX2Rpcj0iL2hvbWUvc2hhcmVkIicKZWNobyAnZXhwb3J0IGZhc3RwPSIke3Byb2dyYW1zX2Rpcn0vZmFzdHAtdjAuMjQuMC9mYXN0cCInCmVjaG8gJ2V4cG9ydCBmYXN0cWM9IiR7cHJvZ3JhbXNfZGlyfS9GYXN0UUMtMC4xMi4xL2Zhc3RxYyInCmVjaG8gJ2V4cG9ydCBtdWx0aXFjPSIvaG9tZS9zYW0vcHJvZ3JhbXMvbWFtYmFmb3JnZS9iaW4vbXVsdGlxYyInCmVjaG8gIiIKCgplY2hvICIjIFNldCBGYXN0USBmaWxlbmFtZSBwYXR0ZXJucyIKZWNobyAiZXhwb3J0IGZhc3RxX3BhdHRlcm49JyouZmFzdHEuZ3onIgplY2hvICJleHBvcnQgUjFfZmFzdHFfcGF0dGVybj0nKl9SMV8qLmZhc3RxLmd6JyIKZWNobyAiZXhwb3J0IFIyX2Zhc3RxX3BhdHRlcm49JypfUjJfKi5mYXN0cS5neiciCmVjaG8gImV4cG9ydCB0cmltbWVkX2Zhc3RxX3BhdHRlcm49JypmYXN0cC10cmltKi5mcS5neiciCmVjaG8gIiIKCmVjaG8gIiMgSW5wdXQvb3V0cHV0IGZpbGVzIgplY2hvICdleHBvcnQgZmFzdHFfY2hlY2tzdW1zPWlucHV0X2Zhc3RxX2NoZWNrc3Vtcy5tZDUnCmVjaG8gJ2V4cG9ydCBORUJfYWRhcHRlcnNfZmFzdGE9TkVCLWFkYXB0ZXJzLmZhc3RhJwplY2hvICIiCgplY2hvICIjIyBORUIgbmVibmV4dC1zbWFsbC1ybmEtbGlicmFyeS1wcmVwLXNldC1mb3ItaWxsdW1pbmEgYWRhcHRlcnMiCmVjaG8gJ2V4cG9ydCBmaXJzdF9hZGFwdGVyPSJBR0FUQ0dHQUFHQUdDQUNBQ0dUQ1RHQUFDVENDQUdUQ0FDIicKZWNobyAnZXhwb3J0IHNlY29uZF9hZGFwdGVyPSJHQVRDR1RDR0dBQ1RHVEFHQUFDVENUR0FBQ0dUR1RBR0FUQ1RDR0dUR0dUQ0dDQ0dUQVRDQVRUIicKZWNobyAiIgoKZWNobyAiIyBTZXQgbWF4aW11bSByZWFkIGxlbmd0aCBmb3IgZmFzdHAgbWVyZ2luZyIKZWNobyAnZXhwb3J0IG1heF9yZWFkX2xlbmd0aD0iMzEiJwplY2hvICIiCgplY2hvICIjIFNldCBudW1iZXIgb2YgQ1BVcyB0byB1c2UiCmVjaG8gJ2V4cG9ydCB0aHJlYWRzPTQwJwplY2hvICIiCgoKZWNobyAiIyMgSW5pdGl0YWxpemUgYXJyYXlzIgplY2hvICdleHBvcnQgZmFzdHFfYXJyYXlfUjE9KCknCmVjaG8gJ2V4cG9ydCBmYXN0cV9hcnJheV9SMj0oKScKZWNobyAnZXhwb3J0IHRyaW1tZWRfZmFzdHFzX2FycmF5PSgpJwplY2hvICdleHBvcnQgUjFfbmFtZXNfYXJyYXk9KCknCmVjaG8gJ2V4cG9ydCBSMl9uYW1lc19hcnJheT0oKScKZWNobyAiIgoKZWNobyAiIyBQcmludCBmb3JtYXR0aW5nIgplY2hvICdleHBvcnQgbGluZT0iLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iJwplY2hvICIiCn0gPiAuYmFzaHZhcnMKCmNhdCAuYmFzaHZhcnMKYGBgCgojIENyZWF0ZSBhZGFwdGVycyBGYXN0QSBmb3IgdXNlIHdpdGggW2BmYXN0cGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuR2VuZS9mYXN0cCkgdHJpbW1pbmcKCmBgYHtiYXNoIGNyZWF0ZS1GYXN0QS1vZi1hZGFwdGVycywgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSwgaWYgaXQgZG9lc24ndCBleGlzdApta2RpciAtLXBhcmVudHMgIiR7b3V0cHV0X2Rpcl90b3B9IgoKZWNobyAiQ3JlYXRpbmcgYWRhcHRlcnMgRmFzdEEuIgplY2hvICIiCmFkYXB0ZXJfY291bnQ9MAoKIyBDaGVjayBmb3IgYWRhcHRlcnMgZmlsZSBmaXJzdAojIFRoZW4gY3JlYXRlIGFkYXB0ZXJzIGZpbGUgaWYgZG9lc24ndCBleGlzdAppZiBbIC1mICIke291dHB1dF9kaXJfdG9wfS8ke05FQl9hZGFwdGVyc19mYXN0YX0iIF07IHRoZW4KICBlY2hvICIke291dHB1dF9kaXJfdG9wfS8ke05FQl9hZGFwdGVyc19mYXN0YX0gYWxyZWFkeSBleGlzdHMuIE5vdGhpbmcgdG8gZG8uIgplbHNlCiAgZm9yIGFkYXB0ZXIgaW4gIiR7Zmlyc3RfYWRhcHRlcn0iICIke3NlY29uZF9hZGFwdGVyfSIKICBkbwogICAgYWRhcHRlcl9jb3VudD0kKChhZGFwdGVyX2NvdW50ICsgMSkpCiAgICBwcmludGYgIj4lc1xuJXNcbiIgImFkYXB0ZXJfJHthZGFwdGVyX2NvdW50fSIgIiR7YWRhcHRlcn0iCiAgZG9uZSA+PiAiJHtvdXRwdXRfZGlyX3RvcH0vJHtORUJfYWRhcHRlcnNfZmFzdGF9IgpmaQoKZWNobyAiIgplY2hvICJBZGFwdGVycyBGYXN0QToiCmVjaG8gIiIKY2F0ICIke291dHB1dF9kaXJfdG9wfS8ke05FQl9hZGFwdGVyc19mYXN0YX0iCmVjaG8gIiIKYGBgCgojIFRyaW1taW5nIGFuZCBtZXJnaW5nIHdpdGggZmFzdHAKCmBgYHtiYXNoIGZhc3RwLWFuZC1tZXJnaW5nLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgojIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5LCBpZiBpdCBkb2Vzbid0IGV4aXN0Lgpta2RpciAtLXBhcmVudHMgIiR7dHJpbW1lZF9mYXN0cXNfZGlyfSIKCiMgQ2hhbmdlIHRvIGRpcmVjdG9yeSB3aXRoIHJhdyByZWFkcwpjZCAiJHtyYXdfcmVhZHNfZGlyfSIKCiMgQ3JlYXRlIGFycmF5cyBvZiBGYXN0USBSMSBmaWxlcyBhbmQgc2FtcGxlIG5hbWVzCiMgRG8gTk9UIHF1b3RlIFIxX2Zhc3RxX3BhdHRlcm4gdmFyaWFibGUKZm9yIGZhc3RxIGluICR7UjFfZmFzdHFfcGF0dGVybn0KZG8KICBmYXN0cV9hcnJheV9SMSs9KCIke2Zhc3RxfSIpCgogICMgVXNlIHBhcmFtZXRlciBzdWJzdGl0dXRpb24gdG8gcmVtb3ZlIGFsbCB0ZXh0IHVwIHRvIGFuZCBpbmNsdWRpbmcgbGFzdCAiLiIgZnJvbQogICMgcmlnaHQgc2lkZSBvZiBzdHJpbmcuCiAgUjFfbmFtZXNfYXJyYXkrPSgiJHtmYXN0cSUlLip9IikKZG9uZQoKIyBDcmVhdGUgYXJyYXkgb2YgRmFzdFEgUjIgZmlsZXMKIyBEbyBOT1QgcXVvdGUgUjJfZmFzdHFfcGF0dGVybiB2YXJpYWJsZQpmb3IgZmFzdHEgaW4gJHtSMl9mYXN0cV9wYXR0ZXJufQpkbwogIGZhc3RxX2FycmF5X1IyKz0oIiR7ZmFzdHF9IikKCiAgIyBVc2UgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbiB0byByZW1vdmUgYWxsIHRleHQgdXAgdG8gYW5kIGluY2x1ZGluZyBsYXN0ICIuIiBmcm9tCiAgIyByaWdodCBzaWRlIG9mIHN0cmluZy4KICBSMl9uYW1lc19hcnJheSs9KCIke2Zhc3RxJSUuKn0iKQpkb25lCgojIyMjIyMjIyMjIyMgUlVOIEZBU1RQICMjIyMjIyMjIyMjIwojIFVzZXMgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbiAoZS5nLiAke1IxX3NhbXBsZV9uYW1lJSVfKn0pdG8gcm0gdGhlIF9SWzEyXQojIFVzZXMgTkVCIGFkYXB0ZXIgZmlsZQoKCiMgUnVuIGZhc3RwIG9uIGZpbGVzCmVjaG8gIkJlZ2lubmluZyBmYXN0cCB0cmltbWluZy4iCmVjaG8gIiIKCnRpbWUgXApmb3IgaW5kZXggaW4gIiR7IWZhc3RxX2FycmF5X1IxW0BdfSIKZG8KICAjIEdldCBzYW1wbGUgbmFtZQogIFIxX3NhbXBsZV9uYW1lPSIke1IxX25hbWVzX2FycmF5W2luZGV4XSUlXyp9IgogIFIyX3NhbXBsZV9uYW1lPSIke1IyX25hbWVzX2FycmF5W2luZGV4XSUlXyp9IgoKICAjIFNhdmUgbWVyZ2VkIHNhbXBsZSBuYW1lCiAgbWVyZ2VkX3NhbXBsZV9uYW1lPSIke1IxX3NhbXBsZV9uYW1lfS1mYXN0cC1hZGFwdGVycy1wb2x5Ry0ke21heF9yZWFkX2xlbmd0aH1icC1tZXJnZWQiCiAgCiAgIyBCZWdpbiBmYXN0cCB0cmltbWluZwogICR7ZmFzdHB9IFwKICAtLWluMSAke2Zhc3RxX2FycmF5X1IxW2luZGV4XX0gXAogIC0taW4yICR7ZmFzdHFfYXJyYXlfUjJbaW5kZXhdfSBcCiAgLS1hZGFwdGVyX2Zhc3RhICR7b3V0cHV0X2Rpcl90b3B9LyR7TkVCX2FkYXB0ZXJzX2Zhc3RhfSBcCiAgLS10cmltX3BvbHlfZyBcCiAgLS1vdmVybGFwX2xlbl9yZXF1aXJlIDE3IFwKICAtLWxlbmd0aF9saW1pdCAke21heF9yZWFkX2xlbmd0aH0gXAogIC0tbWVyZ2UgXAogIC0tbWVyZ2VkX291dCAke3RyaW1tZWRfZmFzdHFzX2Rpcn0vJHttZXJnZWRfc2FtcGxlX25hbWV9LmZxLmd6IFwKICAtLXRocmVhZCAke3RocmVhZHN9IFwKICAtLWh0bWwgIiR7dHJpbW1lZF9mYXN0cXNfZGlyfS8ke21lcmdlZF9zYW1wbGVfbmFtZX0uaHRtbCIgXAogIC0tanNvbiAiJHt0cmltbWVkX2Zhc3Rxc19kaXJ9LyR7bWVyZ2VkX3NhbXBsZV9uYW1lfS5qc29uIiBcCiAgLS1yZXBvcnRfdGl0bGUgIiR7dHJpbW1lZF9mYXN0cXNfZGlyfS8ke21lcmdlZF9zYW1wbGVfbmFtZX0iIFwKICAyPiAke3RyaW1tZWRfZmFzdHFzX2Rpcn0vJHttZXJnZWRfc2FtcGxlX25hbWV9LnN0ZGVycgogICAgCiAgIyBNb3ZlIHRvIHRyaW1tZWQgZGlyZWN0b3J5CiAgIyBUaGlzIGlzIGRvbmUgc28gY2hlY2tzdW1zIGZpbGUgZG9lc24ndCBpbmNsdWRlIGV4Y2VzcyBwYXRoCiAgY2QgJHt0cmltbWVkX2Zhc3Rxc19kaXJ9CgogICMgR2VuZXJhdGUgbWQ1IGNoZWNrc3VtcyBmb3IgbmV3bHkgdHJpbW1lZCBmaWxlcwogIG1kNXN1bSAiJHttZXJnZWRfc2FtcGxlX25hbWV9LmZxLmd6IiB8IHRlZSAtLWFwcGVuZCAiJHttZXJnZWRfc2FtcGxlX25hbWV9LmZxLmd6Lm1kNSIKICAgIAogICMgQ2hhbmdlIGJhY2sgdG8gdG8gcmF3IHJlYWRzIGRpcmVjdG9yeQogIGNkICIke3Jhd19yZWFkc19kaXJ9IgoKZG9uZQoKZWNobyAiIgplY2hvICJmYXN0cCB0cmltbWluZyBjb21wbGV0ZS4iCmVjaG8gIiIKCiMjIyMjIyMjIyMjIyBFTkQgZmFzdHAgIyMjIyMjIyMjIyMjCgpgYGAKCiMgRmFzdFFDL011bHRpUUMgb24gdHJpbW1lZCByZWFkcwoKYGBge2Jhc2ggRmFzdFFDLU11bHRpUUMtdHJpbW1lZC1yZWFkcywgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSwgaWYgaXQgZG9lc24ndCBleGlzdC4KbWtkaXIgLS1wYXJlbnRzICIke3RyaW1tZWRfZmFzdHFzX2Rpcn0iCgojIyMjIyMjIyMjIyMgUlVOIEZBU1RRQyAjIyMjIyMjIyMjIyMKCiMjIyBOT1RFOiBEbyBOT1QgcXVvdGUgcmF3X2Zhc3RxY19saXN0CiMgQ3JlYXRlIGFycmF5IG9mIHRyaW1tZWQgRmFzdFFzCnRyaW1tZWRfZmFzdHFzX2FycmF5PSgke3RyaW1tZWRfZmFzdHFzX2Rpcn0vKm1lcmdlZC5mcS5neikKCiMgUGFzcyBhcnJheSBjb250ZW50cyB0byBuZXcgdmFyaWFibGUgYXMgc3BhY2UtZGVsaW1pdGVkIGxpc3QKdHJpbW1lZF9mYXN0cWNfbGlzdD0kKGVjaG8gIiR7dHJpbW1lZF9mYXN0cXNfYXJyYXlbKl19IikKCmVjaG8gIkJlZ2lubmluZyBGYXN0UUMgb24gcmF3IHJlYWRzLi4uIgplY2hvICIiCgojIFJ1biBGYXN0UUMKJHtmYXN0cWN9IFwKLS10aHJlYWRzICR7dGhyZWFkc30gXAotLW91dGRpciAke3RyaW1tZWRfZmFzdHFzX2Rpcn0gXAotLXF1aWV0IFwKJHt0cmltbWVkX2Zhc3RxY19saXN0fQoKZWNobyAiRmFzdFFDIG9uIHRyaW1tZWQgcmVhZHMgY29tcGxldGUhIgplY2hvICIiCgojIyMjIyMjIyMjIyMgRU5EIEZBU1RRQyAjIyMjIyMjIyMjIyMKCiMjIyMjIyMjIyMjIyBSVU4gTVVMVElRQyAjIyMjIyMjIyMjIyMKZWNobyAiQmVnaW5uaW5nIE11bHRpUUMgb24gcmF3IEZhc3RRQy4uLiIKZWNobyAiIgoKJHttdWx0aXFjfSAke3RyaW1tZWRfZmFzdHFzX2Rpcn0gLW8gJHt0cmltbWVkX2Zhc3Rxc19kaXJ9CgplY2hvICIiCmVjaG8gIk11bHRpUUMgb24gdHJpbW1lZCBGYXN0UXMgY29tcGxldGUuIgplY2hvICIiCgojIyMjIyMjIyMjIyMgRU5EIE1VTFRJUUMgIyMjIyMjIyMjIyMjCgplY2hvICJSZW1vdmluZyBGYXN0UUMgemlwIGZpbGVzLiIKZWNobyAiIgpybSAke3RyaW1tZWRfZmFzdHFzX2Rpcn0vKi56aXAKZWNobyAiRmFzdFFDIHppcCBmaWxlcyByZW1vdmVkLiIKZWNobyAiIgpgYGAKCiMgTGlzdCBvdXRwdXQgZmlsZXMKYGBge2Jhc2ggbGlzdC1vdXRwdXQtZmlsZXMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgVmlldyBkaXJlY3RvcnkgY29udGVudHMKbHMgLWxoICR7dHJpbW1lZF9mYXN0cXNfZGlyfQpgYGA=