airr/0000755000176200001440000000000013663375352011224 5ustar liggesusersairr/NAMESPACE0000644000176200001440000000123013663242102012421 0ustar liggesusers# Generated by roxygen2: do not edit by hand export(AlignmentSchema) export(RearrangementSchema) export(load_schema) export(read_airr) export(read_alignment) export(read_rearrangement) export(validate_airr) export(write_airr) export(write_alignment) export(write_rearrangement) exportClasses(Schema) exportMethods("$") exportMethods("[") exportMethods(names) import(methods) importFrom(readr,col_character) importFrom(readr,col_double) importFrom(readr,col_integer) importFrom(readr,col_logical) importFrom(readr,cols) importFrom(readr,read_tsv) importFrom(readr,write_tsv) importFrom(stats,setNames) importFrom(stringi,stri_trim) importFrom(yaml,yaml.load_file) airr/README.md0000644000176200001440000000052213402556313012467 0ustar liggesusersAIRR Data Representation Reference Library ------------------------------------------------------------------------------- `airr` is an R package for working with data formatted according to the AIRR Data Representation schemas. It includes the full set of schema definitions along with simple functions for read, write and validation. airr/man/0000755000176200001440000000000013545706037011774 5ustar liggesusersairr/man/ExampleData.Rd0000644000176200001440000000100113662556571014446 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Schema.R \name{ExampleData} \alias{ExampleData} \title{Example AIRR data} \format{ \code{extdata/rearrangement-example.tsv.gz}: Rearrangement TSV file. } \description{ Example data files compliant with the the AIRR Data Representation standards. } \examples{ # Get path to the rearrangement-example file file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") # Load data file df <- read_rearrangement(file) } airr/man/Schema-class.Rd0000644000176200001440000000273613662556571014604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Schema.R \docType{class} \name{Schema-class} \alias{Schema-class} \alias{Schema} \alias{names,Schema-method} \alias{Schema-method} \alias{[,Schema,character-method} \alias{$,Schema-method} \alias{AlignmentSchema} \alias{RearrangementSchema} \title{S4 class defining an AIRR standard schema} \format{ A \code{Schema} object. An object of class \code{Schema} of length 1. An object of class \code{Schema} of length 1. } \usage{ \S4method{names}{Schema}(x) \S4method{[}{Schema,character}(x, i) \S4method{$}{Schema}(x, name) AlignmentSchema RearrangementSchema } \arguments{ \item{x}{\code{Schema} object.} \item{i}{field name.} \item{name}{field name.} } \description{ \code{Schema} defines a common data structure for AIRR Data Representation standards. } \details{ The following predefined Schema objects are defined: \code{AlignmentSchema}: AIRR Alignment \code{Schema}. \code{RearrangementSchema}: AIRR Rearrangement \code{Schema}. } \section{Slots}{ \describe{ \item{\code{required}}{\code{character} vector of required fields.} \item{\code{optional}}{\code{character} vector of non-required fields.} \item{\code{properties}}{\code{list} of field definitions.} \item{\code{info}}{\code{list} schema information.} }} \seealso{ See \link{load_schema} for loading a \code{Schema} from the definition set. See \link{read_airr}, \link{write_airr} and \link{validate_airr} schema operators. } \keyword{datasets} airr/man/read_airr.Rd0000644000176200001440000000301113545706037014206 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Interface.R \name{read_airr} \alias{read_airr} \alias{read_rearrangement} \alias{read_alignment} \title{Read an AIRR TSV} \usage{ read_airr(file, base = c("1", "0"), schema = RearrangementSchema, ...) read_rearrangement(file, base = c("1", "0"), ...) read_alignment(file, base = c("1", "0"), ...) } \arguments{ \item{file}{input file path.} \item{base}{starting index for positional fields in the input file. If \code{"1"}, then these fields will not be modified. If \code{"0"}, then fields ending in \code{"_start"} and \code{"_end"} are 0-based half-open intervals (python style) in the input file and will be converted to 1-based closed-intervals (R style).} \item{schema}{\code{Schema} object defining the output format.} \item{...}{additional arguments to pass to \link[readr]{read_delim}.} } \value{ A data.frame of the TSV file with appropriate type and position conversion for fields defined in the specification. } \description{ \code{read_airr} reads a TSV containing AIRR records. } \details{ \code{read_rearrangement} reads an AIRR TSV containing Rearrangement data. \code{read_alignment} reads an AIRR TSV containing Alignment data. } \examples{ # Get path to the rearrangement-example file file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") # Load data file df <- read_rearrangement(file) } \seealso{ See \link{Schema} for the AIRR schema object definition. See \link{write_airr} for writing AIRR data. } airr/man/validate_airr.Rd0000644000176200001440000000152113545706037015070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Interface.R \name{validate_airr} \alias{validate_airr} \title{Validate AIRR data} \usage{ validate_airr(data, schema = RearrangementSchema) } \arguments{ \item{data}{data.frame to validate.} \item{schema}{\code{Schema} object defining the data standard.} } \value{ Returns \code{TRUE} if the input \code{data} is compliant and \code{FALSE} if not. } \description{ \code{validate_airr} validates compliance of the contents of a data.frame to the AIRR data standards. } \examples{ # Get path to the rearrangement-example file file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") # Load data file df <- read_rearrangement(file) # Validate a data.frame against the Rearrangement schema validate_airr(df, schema=RearrangementSchema) } airr/man/load_schema.Rd0000644000176200001440000000174413545706037014530 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Schema.R \name{load_schema} \alias{load_schema} \title{Load a schema definition} \usage{ load_schema(definition) } \arguments{ \item{definition}{name of the schema definition.} } \value{ A \link{Schema} object for the \code{definition}. } \description{ \code{load_schema} loads an AIRR object definition from the internal definition set. } \details{ Valid definitions include: \itemize{ \item \code{"Rearrangement"} \item \code{"Alignment"} \item \code{"Study"} \item \code{"Subject"} \item \code{"Diagnosis"} \item \code{"Sample"} \item \code{"CellProcessing"} \item \code{"NucleicAcidProcessing"} \item \code{"RawSequenceData"} \item \code{"SoftwareProcessing"} } } \examples{ # Load the Rearrangement definition schema <- load_schema("Rearrangement") # Load the Alignment definition schema <- load_schema("Alignment") } \seealso{ See \link{Schema} for the return object. } airr/man/write_airr.Rd0000644000176200001440000000323013652646601014427 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Interface.R \name{write_airr} \alias{write_airr} \alias{write_rearrangement} \alias{write_alignment} \title{Write an AIRR TSV} \usage{ write_airr(data, file, base = c("1", "0"), schema = RearrangementSchema, ...) write_rearrangement(data, file, base = c("1", "0"), ...) write_alignment(data, file, base = c("1", "0"), ...) } \arguments{ \item{data}{data.frame of Rearrangement data.} \item{file}{output file name.} \item{base}{starting index for positional fields in the output file. Fields in the input \code{data} are assumed to be 1-based closed-intervals (R style). If \code{"1"}, then these fields will not be modified. If \code{"0"}, then fields ending in \code{_start} and \code{_end} will be converted to 0-based half-open intervals (python style) in the output file.} \item{schema}{\code{Schema} object defining the output format.} \item{...}{additional arguments to pass to \link[readr]{write_delim}.} } \description{ \code{write_airr} writes a TSV containing AIRR formatted records. } \details{ \code{write_rearrangement} writes a data.frame containing AIRR Rearrangement data to TSV. \code{write_alignment} writes a data.frame containing AIRR Alignment data to TSV. } \examples{ # Get path to the rearrangement-example file file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") # Load data file df <- read_rearrangement(file) # Write a Rearrangement data file outfile <- file.path(tempdir(), "output.tsv") write_rearrangement(df, outfile) } \seealso{ See \link{Schema} for the AIRR schema object definition. See \link{read_airr} for reading to AIRR files. } airr/DESCRIPTION0000644000176200001440000000253013663375352012732 0ustar liggesusersPackage: airr Type: Package Version: 1.3.0 Date: 2020-05-26 Authors@R: c(person("Jason", "Vander Heiden", role=c("aut", "cre"), email="jason.vanderheiden@gmail.com"), person("Susanna", "Marquez", role=c("aut"), email="susanna.marquez@yale.edu"), person("Scott", "Christley", role=c("aut"), email="Scott.Christley@UTSouthwestern.edu"), person("AIRR Community", role=c("cph"))) Title: AIRR Data Representation Reference Library Description: Schema definitions and read, write and validation tools for data formatted in accordance with the AIRR Data Representation schemas defined by the AIRR Community . License: CC BY 4.0 URL: http://docs.airr-community.org BugReports: https://github.com/airr-community/airr-standards/issues LazyData: true BuildVignettes: true VignetteBuilder: knitr Encoding: UTF-8 Depends: R (>= 3.1.2) Imports: methods, readr, stats, stringi, yaml Suggests: knitr, rmarkdown, testthat RoxygenNote: 7.1.0 NeedsCompilation: no Packaged: 2020-05-26 16:31:05 UTC; vandej27 Author: Jason Vander Heiden [aut, cre], Susanna Marquez [aut], Scott Christley [aut], AIRR Community [cph] Maintainer: Jason Vander Heiden Repository: CRAN Date/Publication: 2020-05-27 05:30:18 UTC airr/build/0000755000176200001440000000000013663242111012305 5ustar liggesusersairr/build/vignette.rds0000644000176200001440000000031313663242111014641 0ustar liggesusersb```b`fcf`b2 1# ' -NLO LK-)I MASVSA@AJ tC zּb4C]R RR@g;<E T [fN*ސ89 d Bw(,/׃ @?{49'ݣ\)%ziE@ w<}dairr/tests/0000755000176200001440000000000013402556313012353 5ustar liggesusersairr/tests/testthat/0000755000176200001440000000000013663375352014226 5ustar liggesusersairr/tests/testthat/test-Interface.R0000644000176200001440000000513713402556313017221 0ustar liggesusers# Toy file pointer rearrangement_file <- file.path("..", "data-tests", "toy_data.tsv") #rearrangement_file <- file.path("tests", "data-tests", "toy_data.tsv") # Toy file pointer bad_rearrangement_file <- file.path("..", "data-tests", "bad_data.tsv") #bad_rearrangement_file <- file.path("tests", "data-tests", "bad_data.tsv") # Expected warnings for bad_rearrangement_file expected_w <- c( "Warning: File is missing AIRR mandatory field(s): sequence", "Warning: sequence_id(s) are not unique: IVKNQEJ01AJ44V, IVKNQEJ01AJ44V", "Warning: sequence_id is empty for row(s): 7", "Warning: rev_comp is not logical for row(s): 4", "Warning: productive is not logical for row(s): 1" ) #### Rearrangement I/O #### context("Rearrangement I/O - good data") test_that("read_airr loads a data.frame", { tbl_1 <- read_airr(rearrangement_file, "1") expect_true(is.data.frame(tbl_1)) }) test_that("read_arirr applies base", { tbl_0 <- read_airr(rearrangement_file, "0") tbl_1 <- read_airr(rearrangement_file, "1") expect_true(is.data.frame(tbl_0)) expect_true(validate_airr(tbl_0)) start_positions <- grep("_start$", names(tbl_0), perl=TRUE) expect_equivalent(tbl_0[, start_positions] - 1, tbl_1[, start_positions]) }) test_that("write_airr writes a file with logicals encoded T/F", { tbl <- read_airr(rearrangement_file) out_file <- file.path(tempdir(), "test_out.tsv") write_airr(tbl, out_file) expect_true(file.exists(out_file)) reload_tbl <- read.delim(out_file, colClasses="character") expect_true(all(reload_tbl[['rev_comp']] == "T")) expect_equal(reload_tbl[['productive']], c("T","T","F","T","T","F","F","F","T")) }) context("Rearrangement I/O - bad data") test_that("read_airr with bad data", { # Expect valid==FALSE bad_data <- suppressWarnings(read_airr(bad_rearrangement_file, "1")) expect_false(suppressWarnings(validate_airr(bad_data))) # Check error messages w <- capture_warnings(validate_airr(bad_data)) expect_equal(w, expected_w) }) test_that("write_airr writes a bad file, with warnings, with logicals T/T", { bad_data <- suppressWarnings(read_airr(bad_rearrangement_file, "1")) out_file <- file.path(tempdir(), "test_out.tsv") expect_warning(write_airr(bad_data, out_file)) expect_true(file.exists(out_file)) reload_tbl <- read.delim(out_file, colClasses="character") expect_equal(reload_tbl[['rev_comp']], c("T","T","T","","T","T","T","T","T","T","T")) expect_equal(reload_tbl[['productive']], c("","T","F","T","T","F","F","F","T","T","T")) }) airr/tests/data-tests/0000755000176200001440000000000013402556313014424 5ustar liggesusersairr/tests/data-tests/toy_data.tsv0000644000176200001440000001345613402556313016777 0ustar liggesusersrearrangement_id rearrangement_set_id sequence_id sequence rev_comp productive sequence_alignment germline_alignment v_call d_call j_call c_call junction junction_length junction_aa v_score d_score j_score c_score v_cigar d_cigar j_cigar c_cigar v_identity v_evalue d_identity d_evalue j_identity j_evalue v_sequence_start v_sequence_end v_germline_start v_germline_end d_sequence_start d_sequence_end d_germline_start d_germline_end j_sequence_start j_sequence_end j_germline_start j_germline_end np1_length np2_length duplicate_count IVKNQEJ01BVGQ6 1 IVKNQEJ01BVGQ6 GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T T IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 430 16.4 75.8 22N1S275= 11N280S8= 6N292S32=1X9= 1 1E-122 1 2.7 0.9762 6E-18 1 275 1 317 280 287 11 18 292 333 6 47 4 4 1247 IVKNQEJ01AQVWS 1 IVKNQEJ01AQVWS GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T T IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 420 16.4 83.8 22N1S156=1X10=1X17=1X89= 11N280S8= 6N292S42= 0.9891 8E-120 1 2.7 1 2E-20 1 275 1 317 280 287 11 18 292 333 6 47 4 4 4 IVKNQEJ01AOYFZ 1 IVKNQEJ01AOYFZ GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T F IGHV4-31*03 IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGG 37 CASGVAGNF*LLX 430 20.4 83.8 22N1S275= 11N280S10= 6N293S42= 1 1E-122 1 0.17 1 2E-20 1 275 1 317 280 289 11 20 293 334 6 47 4 3 92 IVKNQEJ01EI5S4 1 IVKNQEJ01EI5S4 GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T T IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 430 16.4 83.8 22N1S275= 11N280S8= 6N292S42= 1 1E-122 1 2.7 1 2E-20 1 275 1 317 280 287 11 18 292 333 6 47 4 4 2913 IVKNQEJ01DGRRI 1 IVKNQEJ01DGRRI GGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGTCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T T IGHV4-34*09 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 389 16.4 83.8 22N1S23=2X85=1X15=1X1=1X3=1X2=1X1=1X5=1X6=1X118= 11N274S8= 6N286S42= 0.9628 2E-110 1 2.6 1 2E-20 1 269 1 317 274 281 11 18 286 327 6 47 4 4 1 IVKNQEJ01APN5N 1 IVKNQEJ01APN5N GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTAGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T F IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTAG 36 CASGVAGTFDY* 430 16.4 67.9 22N1S275= 11N280S8= 6N292S10=1X21=1X9= 1 1E-122 1 2.7 0.9524 1E-15 1 275 1 317 280 287 11 18 292 333 6 47 4 4 1 IVKNQEJ01B0TT2 1 IVKNQEJ01B0TT2 GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T F IGHV4-31*03 IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGG 37 CASGVAGNF*LLX 430 20.4 75.8 22N1S275= 11N280S10= 6N293S32=1X9= 1 1E-122 1 0.17 0.9762 6E-18 1 275 1 317 280 289 11 20 293 334 6 47 4 3 30 IVKNQEJ01AIS74 1 IVKNQEJ01AIS74 GGCGCAGGACTGTTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGGCGGGGTGGCTGGTAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T F IGHV4-31*03 IGHD6-19*01 IGHJ4*02 TGTGCGAGGCGGGGTGGCTGGTAACTTTTGACTACTGG 38 CARRGGW*LLTTG 424 20.4 83.8 22N1S3=1X8=1X262= 11N281S10= 6N294S42= 0.9927 9E-121 1 0.17 1 2E-20 1 275 1 317 281 290 11 20 294 335 6 47 5 3 4 IVKNQEJ01AJ44V 1 IVKNQEJ01AJ44V GGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T T IGHV4-59*06 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 386 16.4 75.8 22N1S45=1X5=2X6=1X3=1X5=1X22=1X4=1X1=1X1=1X165= 11N274S8= 6N286S32=1X9= 0.9625 2E-109 1 2.6 0.9762 5E-18 1 267 1 315 274 281 11 18 286 327 6 47 6 4 12 airr/tests/data-tests/bad_data.tsv0000644000176200001440000001602313402556313016703 0ustar liggesusersrearrangement_id rearrangement_set_id sequence_id wrong_name rev_comp productive sequence_alignment germline_alignment v_call d_call j_call c_call junction junction_length junction_aa v_score d_score j_score c_score v_cigar d_cigar j_cigar c_cigar v_identity v_evalue d_identity d_evalue j_identity j_evalue v_sequence_start v_sequence_end v_germline_start v_germline_end d_sequence_start d_sequence_end d_germline_start d_germline_end j_sequence_start j_sequence_end j_germline_start j_germline_end np1_length np2_length duplicate_count IVKNQEJ01BVGQ6 1 IVKNQEJ01BVGQ6 GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T yes IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 430 16.4 75.8 22N1S275= 11N280S8= 6N292S32=1X9= 1 1E-122 1 2.7 0.9762 6E-18 1 275 1 317 280 287 11 18 292 333 6 47 4 4 1247 IVKNQEJ01AQVWS 1 IVKNQEJ01AQVWS GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCAACTACAACCCCTCCCTCAAGAGTCGAGTCACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T T IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 420 16.4 83.8 22N1S156=1X10=1X17=1X89= 11N280S8= 6N292S42= 0.9891 8E-120 1 2.7 1 2E-20 1 275 1 317 280 287 11 18 292 333 6 47 4 4 4 IVKNQEJ01AOYFZ 1 IVKNQEJ01AOYFZ GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T F IGHV4-31*03 IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGG 37 CASGVAGNF*LLX 430 20.4 83.8 22N1S275= 11N280S10= 6N293S42= 1 1E-122 1 0.17 1 2E-20 1 275 1 317 280 289 11 20 293 334 6 47 4 3 92 IVKNQEJ01EI5S4 1 IVKNQEJ01EI5S4 GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA NA T IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 430 16.4 83.8 22N1S275= 11N280S8= 6N292S42= 1 1E-122 1 2.7 1 2E-20 1 275 1 317 280 287 11 18 292 333 6 47 4 4 2913 IVKNQEJ01DGRRI 1 IVKNQEJ01DGRRI GGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCCCCCAGGGAAGGGTCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T T IGHV4-34*09 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 389 16.4 83.8 22N1S23=2X85=1X15=1X1=1X3=1X2=1X1=1X5=1X6=1X118= 11N274S8= 6N286S42= 0.9628 2E-110 1 2.6 1 2E-20 1 269 1 317 274 281 11 18 286 327 6 47 4 4 1 IVKNQEJ01APN5N 1 IVKNQEJ01APN5N GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTAGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T F IGHV4-31*03 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTAG 36 CASGVAGTFDY* 430 16.4 67.9 22N1S275= 11N280S8= 6N292S10=1X21=1X9= 1 1E-122 1 2.7 0.9524 1E-15 1 275 1 317 280 287 11 18 292 333 6 47 4 4 1 IVKNQEJ01B0TT2 1 GGCCCAGGACTGGTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T F IGHV4-31*03 IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGTAACTTTTGACTACTGG 37 CASGVAGNF*LLX 430 20.4 75.8 22N1S275= 11N280S10= 6N293S32=1X9= 1 1E-122 1 0.17 0.9762 6E-18 1 275 1 317 280 289 11 20 293 334 6 47 4 3 30 IVKNQEJ01AIS74 1 IVKNQEJ01AIS74 GGCGCAGGACTGTTGAAGCCTTCACAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGCAGTGGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGGCGGGGTGGCTGGTAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCA T F IGHV4-31*03 IGHD6-19*01 IGHJ4*02 TGTGCGAGGCGGGGTGGCTGGTAACTTTTGACTACTGG 38 CARRGGW*LLTTG 424 20.4 83.8 22N1S3=1X8=1X262= 11N281S10= 6N294S42= 0.9927 9E-121 1 0.17 1 2E-20 1 275 1 317 281 290 11 20 294 335 6 47 5 3 4 IVKNQEJ01AJ44V 1 IVKNQEJ01AJ44V GGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T T IGHV4-59*06 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 386 16.4 75.8 22N1S45=1X5=2X6=1X3=1X5=1X22=1X4=1X1=1X1=1X165= 11N274S8= 6N286S32=1X9= 0.9625 2E-109 1 2.6 0.9762 5E-18 1 267 1 315 274 281 11 18 286 327 6 47 6 4 12 IVKNQEJ01AJ44V 1 IVKNQEJ01AJ44V GGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T T IGHV4-59*06 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 386 16.4 75.8 22N1S45=1X5=2X6=1X3=1X5=1X22=1X4=1X1=1X1=1X165= 11N274S8= 6N286S32=1X9= 0.9625 2E-109 1 2.6 0.9762 5E-18 1 267 1 315 274 281 11 18 286 327 6 47 6 4 12 IVKNQEJ01AJ44V 1 IVKNQEJ01AJ44V GGCCCAGGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCGCTGTCTATGGTGGGTCCTTCAGTGGTTACTACTGGAGCTGGATCCGCCAGCACCCAGGGAAGGGCCTGGAGTGGATTGGGTACATCTATTACAGTGGGAGCACCTACTACAACCCGTCCCTCAAGAGTCGAGTTACCATATCAGTAGACACGTCTAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACTGCCGCGGACACGGCCGTGTATTACTGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGGGGCCAGGGAACCCTGGTCACTGTCTCCTCA T T IGHV4-59*06 IGHD1-7*01,IGHD6-19*01 IGHJ4*02 TGTGCGAGCGGGGTGGCTGGAACTTTTGACTACTGG 36 CASGVAGTFDYW 386 16.4 75.8 22N1S45=1X5=2X6=1X3=1X5=1X22=1X4=1X1=1X1=1X165= 11N274S8= 6N286S32=1X9= 0.9625 2E-109 1 2.6 0.9762 5E-18 1 267 1 315 274 281 11 18 286 327 6 47 6 4 12 airr/tests/testthat.R0000644000176200001440000000006413402556313014336 0ustar liggesuserslibrary(testthat) library(airr) test_check("airr") airr/vignettes/0000755000176200001440000000000013663242111013216 5ustar liggesusersairr/vignettes/references.bib0000644000176200001440000000460713402556313016027 0ustar liggesusers% 19541912 @Article{freeman2009, Author="Freeman, J. D. and Warren, R. L. and Webb, J. R. and Nelson, B. H. and Holt, R. A. ", Title="{{P}rofiling the {T}-cell receptor beta-chain repertoire by massively parallel sequencing}", Journal="Genome Res.", Year="2009", Volume="19", Number="10", Pages="1817--1824", Month="Oct" } % 19706884 @Article{robins2009, Author="Robins, H. S. and Campregher, P. V. and Srivastava, S. K. and Wacher, A. and Turtle, C. J. and Kahsai, O. and Riddell, S. R. and Warren, E. H. and Carlson, C. S. ", Title="{{C}omprehensive assessment of {T}-cell receptor beta-chain diversity in alphabeta {T} cells}", Journal="Blood", Year="2009", Volume="114", Number="19", Pages="4099--4107", Month="Nov" } % 19423829 @Article{weinstein2009, Author="Weinstein, J. A. and Jiang, N. and White, R. A. and Fisher, D. S. and Quake, S. R. ", Title="{{H}igh-throughput sequencing of the zebrafish antibody repertoire}", Journal="Science", Year="2009", Volume="324", Number="5928", Pages="807--810", Month="May" } % 29144493 @Article{rubelt2017, Author="Rubelt, F. and Busse, C. E. and Bukhari, S. A. C. and Burckert, J. P. and Mariotti-Ferrandiz, E. and Cowell, L. G. and Watson, C. T. and Marthandan, N. and Faison, W. J. and Hershberg, U. and Laserson, U. and Corrie, B. D. and Davis, M. M. and Peters, B. and Lefranc, M. P. and Scott, J. K. and Breden, F. and Luning Prak, E. T. and Kleinstein, S. H. ", Title="{{A}daptive {I}mmune {R}eceptor {R}epertoire {C}ommunity recommendations for sharing immune-repertoire sequencing data}", Journal="Nat. Immunol.", Year="2017", Volume="18", Number="12", Pages="1274--1278", Month="Nov" } % 29163494 @Article{breden2017, Author="Breden, F. and Luning Prak, E. T. and Peters, B. and Rubelt, F. and Schramm, C. A. and Busse, C. E. and Vander Heiden, J. A. and Christley, S. and Bukhari, S. A. C. and Thorogood, A. and Matsen Iv, F. A. and Wine, Y. and Laserson, U. and Klatzmann, D. and Douek, D. C. and Lefranc, M. P. and Collins, A. M. and Bubela, T. and Kleinstein, S. H. and Watson, C. T. and Cowell, L. G. and Scott, J. K. and Kepler, T. B. ", Title="{{R}eproducibility and {R}euse of {A}daptive {I}mmune {R}eceptor {R}epertoire {D}ata}", Journal="Front Immunol", Year="2017", Volume="8", Pages="1418" }airr/vignettes/Usage-Vignette.Rmd0000644000176200001440000001234713402556313016523 0ustar liggesusers--- title: 'AIRR Data Representation Reference Library Usage' author: "The AIRR Community" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: standalone: true fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Usage Vignette} %\usepackage[utf8]{inputenc} --- ## Introduction Since the use of High-throughput sequencing (HTS) was first introduced to analyze immunoglobulin (B-cell receptor, antibody) and T-cell receptor repertoires (Freeman et al, 2009; Robins et al, 2009; Weinstein et al, 2009), the increasing number of studies making use of this technique has produced enormous amounts of data and there exists a pressing need to develop and adopt common standards, protocols, and policies for generating and sharing data sets. The [Adaptive Immune Receptor Repertoire (AIRR) Community](http://airr-community.org) formed in 2015 to address this challenge (Breden et al, 2017) and has stablished the set of minimal metadata elements (MiAIRR) required for describing published AIRR datasets (Rubelt et al, 2017) as well as file formats to represent this data in a machine-readable form. The `airr` R package provide read, write and validation of data following the AIRR Data Representation schemas. This vignette provides a set of simple use examples. ### AIRR Data Representation Standards The AIRR Community's recommendations for a minimal set of metadata that should be used to describe an AIRR-seq data set when published or deposited in a AIRR-compliant public repository are described in Rubelt et al, 2017. The primary aim of this effort is to make published AIRR datasets FAIR (findable, accessible, interoperable, reusable); with sufficient detail such that a person skilled in the art of AIRR sequencing and data analysis will be able to reproduce the experiment and data analyses that were performed. Following this principles, V(D)J reference alignment annotations are saved in standard tab-delimited files (TSV) with associated metadata provided in accompanying YAML formatted files. The column names and field names in these files have been defined by the AIRR Data Representation Working Group using a controlled vocabulary of standardized terms and types to refer to each piece of information. ## Reading AIRR formatted files The `airr` package contains the function `read_rearrangement` to read and validate files containing AIRR Rearrangement records, where a Rearrangement record describes the collection of optimal annotations on a single sequence that has undergone V(D)J reference alignment. The usage is straightforward, as the file format is a typical tabulated file. The argument that needs attention is `base`, with possible values `"0"` and `"1"`. `base` denotes the starting index for positional fields in the input file. Positional fields are those that contain alignment coordinates and names ending in "_start" and "_end". If the input file is using 1-based closed intervals (R style), as defined by the standard, then positional fields will not be modified under the default setting of `base="1"`. If the input file is using 0-based coordinates with half-open intervals (python style), then positional fields may be converted to 1-based closed intervals using the argument `base="0"`. ```{r read_rearrangement, message=FALSE} library(airr) example_data <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") basename(example_data) airr_rearrangement <- read_rearrangement(example_data) class(airr_rearrangement) head(airr_rearrangement) ``` ## Writing AIRR formatted files The `airr` package contains the function `write_rearrangement` to write Rearrangement records to the AIRR TSV format. ```{r write_rearrangement} out_file <- file.path(tempdir(), "airr_out.tsv") write_rearrangement(airr_rearrangement, out_file) ``` ## References 1. Breden, F., E. T. Luning Prak, B. Peters, F. Rubelt, C. A. Schramm, C. E. Busse, J. A. Vander Heiden, et al. 2017. Reproducibility and Reuse of Adaptive Immune Receptor Repertoire Data. *Front Immunol* 8: 1418. 2. Freeman, J. D., R. L. Warren, J. R. Webb, B. H. Nelson, and R. A. Holt. 2009. Profiling the T-cell receptor beta-chain repertoire by massively parallel sequencing. *Genome Res* 19 (10): 1817-24. 3. Robins, H. S., P. V. Campregher, S. K. Srivastava, A. Wacher, C. J. Turtle, O. Kahsai, S. R. Riddell, E. H. Warren, and C. S. Carlson. 2009. Comprehensive assessment of T-cell receptor beta-chain diversity in alphabeta T cells. *Blood* 114 (19): 4099-4107. 4. Rubelt, F., C. E. Busse, S. A. C. Bukhari, J. P. Burckert, E. Mariotti-Ferrandiz, L. G. Cowell, C. T. Watson, et al. 2017. Adaptive Immune Receptor Repertoire Community recommendations for sharing immune-repertoire sequencing data. *Nat Immunol* 18 (12): 1274-8. 5. Weinstein, J. A., N. Jiang, R. A. White, D. S. Fisher, and S. R. Quake. 2009. High-throughput sequencing of the zebrafish antibody repertoire. *Science* 324 (5928): 807-10. airr/R/0000755000176200001440000000000013402556313011412 5ustar liggesusersairr/R/AIRR.R0000644000176200001440000000040613402556313012272 0ustar liggesusers#' @import methods #' @importFrom readr read_tsv write_tsv #' cols col_character col_logical col_integer col_double #' @importFrom stats setNames #' @importFrom stringi stri_trim #' @importFrom yaml yaml.load_file NULL airr/R/Interface.R0000644000176200001440000002151413402556313013440 0ustar liggesusers#### Rearrangement I/O #### #' Read an AIRR TSV #' #' \code{read_airr} reads a TSV containing AIRR records. #' #' @param file input file path. #' @param base starting index for positional fields in the input file. #' If \code{"1"}, then these fields will not be modified. #' If \code{"0"}, then fields ending in \code{"_start"} and \code{"_end"} #' are 0-based half-open intervals (python style) in the input file #' and will be converted to 1-based closed-intervals (R style). #' @param schema \code{Schema} object defining the output format. #' @param ... additional arguments to pass to \link[readr]{read_delim}. #' #' @return A data.frame of the TSV file with appropriate type and position conversion #' for fields defined in the specification. #' #' @seealso #' See \link{Schema} for the AIRR schema object definition. #' See \link{write_airr} for writing AIRR data. #' #' @examples #' # Get path to the rearrangement-example file #' file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") #' #' # Load data file #' df <- read_rearrangement(file) #' #' @export read_airr <- function(file, base=c("1", "0"), schema=RearrangementSchema, ...) { # Check arguments base <- match.arg(base) # Define types parsers <- c("character"="c", "logical"="l", "integer"="i", "double"="d") header <- names(suppressMessages(readr::read_tsv(file, n_max=1))) schema_fields <- intersect(names(schema), header) cast <- setNames(lapply(schema_fields, function(f) parsers[schema[f]$type]), schema_fields) types <- do.call(readr::cols, cast) # Read file data <- suppressMessages(readr::read_tsv(file, col_types=types, na=c("", "NA", "None"), ...)) # Validate file valid_data <- validate_airr(data, schema=schema) # Adjust indexes if (base == "0") { start_positions <- grep("_start$", names(data), perl=TRUE) if (length(start_positions) > 0) { data[, start_positions] <- data[, start_positions] + 1 } } return(data) } #' Validate AIRR data #' #' \code{validate_airr} validates compliance of the contents of a data.frame #' to the AIRR data standards. #' #' @param data data.frame to validate. #' @param schema \code{Schema} object defining the data standard. #' #' @return Returns \code{TRUE} if the input \code{data} is compliant and #' \code{FALSE} if not. #' #' @examples #' # Get path to the rearrangement-example file #' file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") #' #' # Load data file #' df <- read_rearrangement(file) #' #' # Validate a data.frame against the Rearrangement schema #' validate_airr(df, schema=RearrangementSchema) #' #' @export validate_airr <- function(data, schema=RearrangementSchema){ valid <- TRUE # Check all required fields exist missing_fields <- setdiff(schema@required, colnames(data)) if (length(missing_fields) > 0 ) { valid <- FALSE warning(paste("Warning: File is missing AIRR mandatory field(s):", paste(missing_fields, collapse = ", "))) } # Validate sequence_id: # - uniqueness # - not empty if ("sequence_id" %in% colnames(data)) { dup_ids <- duplicated(data[['sequence_id']]) if (any(dup_ids)) { valid <- FALSE warning(paste("Warning: sequence_id(s) are not unique:", paste(data[['sequence_id']][dup_ids], collapse = ", "))) } empty_rows <- which(data[['sequence_id']] %in% c("None", "", NA)) if (length(empty_rows) > 0 ) { # TODO # valid <- FALSE warning(paste("Warning: sequence_id is empty for row(s):", paste(empty_rows, collapse = ", "))) } } # check logical fields logical_fields <- names(which(sapply(schema@properties, '[[', "type") == "logical")) logical_fields <- intersect(colnames(data), logical_fields) if (length(logical_fields) > 0 ) { for (log_field in logical_fields) { not_logical <- data[[log_field]] %in% c(TRUE, FALSE) == FALSE if (any(not_logical)) { warning(paste("Warning:",log_field,"is not logical for row(s):", paste(which(not_logical), collapse = ", "))) } else { NULL } } } valid } #' @details #' \code{read_rearrangement} reads an AIRR TSV containing Rearrangement data. #' #' @rdname read_airr #' @export read_rearrangement <- function(file, base=c("1", "0"), ...) { read_airr(file, base=base, schema=RearrangementSchema, ...) } #' @details #' \code{read_alignment} reads an AIRR TSV containing Alignment data. #' #' @rdname read_airr #' @export read_alignment <- function(file, base=c("1", "0"), ...) { read_airr(file, base=base, schema=AlignmentSchema, ...) } #' Write an AIRR TSV #' #' \code{write_airr} writes a TSV containing AIRR formatted records. #' #' @param data data.frame of Rearrangement data. #' @param file output file name. #' @param base starting index for positional fields in the output file. #' Fields in the input \code{data} are assumed to be 1-based #' closed-intervals (R style). #' If \code{"1"}, then these fields will not be modified. #' If \code{"0"}, then fields ending in \code{_start} and \code{_end} #' will be converted to 0-based half-open intervals (python style) #' in the output file. #' @param schema \code{Schema} object defining the output format. #' @param ... additional arguments to pass to \link[readr]{write_delim}. #' #' @return NULL #' #' @seealso #' See \link{Schema} for the AIRR schema object definition. #' See \link{read_airr} for reading to AIRR files. #' #' @examples #' # Get path to the rearrangement-example file #' file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") #' #' # Load data file #' df <- read_rearrangement(file) #' #' # Write a Rearrangement data file #' outfile <- file.path(tempdir(), "output.tsv") #' write_rearrangement(df, outfile) #' #' @export write_airr <- function(data, file, base=c("1", "0"), schema=RearrangementSchema, ...) { ## DEBUG # data <- data.frame("sequence_id"=1:4, "extra"=1:4, "a"=LETTERS[1:4]) data_name <- deparse(substitute(data)) schema_name <- deparse(substitute(schema)) # Check arguments base <- match.arg(base) # Fill in missing required columns missing <- setdiff(schema@required, names(data)) if (length(missing) > 0 ) { data[, missing] <- NA } # order columns ordering <- c(intersect(names(schema), names(data)), setdiff(names(data), names(schema))) data <- data[, ordering] # Adjust indexes if (base == "0") { start_positions <- grep("_start$", names(data), perl=TRUE) if (length(start_positions) > 0) { data[, start_positions] <- data[, start_positions] - 1 } } valid <- suppressWarnings(validate_airr(data, schema)) if (!valid) { w <- names(warnings()) w <- gsub("Warning: *", "" ,w) err_msg <- paste0(data_name, " is not a valid ", schema_name, "\n") err_msg <- paste(err_msg, paste(w, collapse = "\n")) warning(err_msg) } # write logical fields as T/F logical_fields <- names(which(sapply(schema@properties, '[[', "type") == "logical")) logical_fields <- intersect(colnames(data), logical_fields) if (length(logical_fields) > 0 ) { for (log_field in logical_fields) { logical_values <- data[[log_field]] %in% c(TRUE, FALSE) data[[log_field]] <- as.character(data[[log_field]]) if (length(logical_values) > 0 ) { data[[log_field]][logical_values] <- c("T", "F")[match(data[[log_field]][logical_values], c("TRUE", "FALSE"))] } } } # Write write_tsv(data, file, na="", ...) } #' @details #' \code{write_rearrangement} writes a data.frame containing AIRR Rearrangement data to TSV. #' #' @rdname write_airr #' @export write_rearrangement <- function(data, file, base=c("1", "0"), ...) { write_airr(data, file, base=base, schema=RearrangementSchema, ...) } #' @details #' \code{write_alignment} writes a data.frame containing AIRR Alignment data to TSV. #' #' @rdname write_airr #' @export write_alignment <- function(data, file, base=c("1", "0"), ...) { write_airr(data, file, base=base, schema=AlignmentSchema, ...) } airr/R/Schema.R0000644000176200001440000001052513402556313012740 0ustar liggesusers#### Classes #### #' S4 class defining an AIRR standard schema #' #' \code{Schema} defines a common data structure for AIRR Data Representation #' standards. #' #' @slot required \code{character} vector of required fields. #' @slot optional \code{character} vector of non-required fields. #' @slot properties \code{list} of field definitions. #' @slot info \code{list} schema information. #' #' @details #' The following predefined Schema objects are defined: #' #' @format #' A \code{Schema} object. #' #' @seealso #' See \link{load_schema} for loading a \code{Schema} from the definition set. #' See \link{read_airr}, \link{write_airr} and \link{validate_airr} schema operators. #' #' @name Schema-class #' @rdname Schema-class #' @aliases Schema #' @exportClass Schema setClass("Schema", slots=c(required="character", optional="character", properties="list", info="list")) #### Methods ##### #' @param x \code{Schema} object. #' #' @rdname Schema-class #' @aliases Schema-method #' @export setMethod("names", signature(x="Schema"), function (x) { names(x@properties) }) #' @param i field name. #' #' @rdname Schema-class #' @aliases Schema-method #' @export setMethod("[", signature(x="Schema", i="character"), function (x, i) { x@properties[[i]] }) #' @param name field name. #' #' @rdname Schema-class #' @aliases Schema-method #' @export setMethod("$", signature(x="Schema"), function (x, name) { x@properties[[name]] }) #### Schema I/O #### #' Load a schema definition #' #' \code{load_schema} loads an AIRR object definition from the internal #' definition set. #' #' @param definition name of the schema definition. #' #' @return A \link{Schema} object for the \code{definition}. #' #' @details #' Valid definitions include: #' \itemize{ #' \item \code{"Rearrangement"} #' \item \code{"Alignment"} #' \item \code{"Study"} #' \item \code{"Subject"} #' \item \code{"Diagnosis"} #' \item \code{"Sample"} #' \item \code{"CellProcessing"} #' \item \code{"NucleicAcidProcessing"} #' \item \code{"RawSequenceData"} #' \item \code{"SoftwareProcessing"} #' } #' #' @seealso See \link{Schema} for the return object. #' #' @examples #' # Load the Rearrangement definition #' schema <- load_schema("Rearrangement") #' #' # Load the Alignment definition #' schema <- load_schema("Alignment") #' #' @export load_schema <- function(definition) { # Load schema from yaml file spec_file <- system.file("extdata", "airr-schema.yaml", package="airr") spec_list <- yaml.load_file(spec_file) # Load definition definition_list <- spec_list[[definition]] definition_list[["discriminator"]] <- definition_list[["type"]] <- NULL # schema info info <- spec_list[["Info"]] # Define member attributes fields <- names(definition_list[["properties"]]) properties <- definition_list[["properties"]] required <- definition_list[["required"]] optional <- setdiff(fields, required) # Rename type and clean description types <- c("string"="character", "boolean"="logical", "integer"="integer", "number"="double") for (f in fields) { x <- properties[[f]][["type"]] y <- properties[[f]][["description"]] properties[[f]][["type"]] <- unname(types[x]) properties[[f]][["description"]] <- stri_trim(y) } return(new("Schema", required=required, optional=optional, properties=properties, info=info)) } #### Data #### #' Example AIRR data #' #' Example data files compliant with the the AIRR Data Representation standards. #' #' @format #' \code{extdata/rearrangement-example.tsv.gz}: Rearrangement TSV file. #' #' @examples #' # Get path to the rearrangement-example file #' file <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") #' #' # Load data file #' df <- read_rearrangement(file) #' #' @name ExampleData NULL #' @details \code{AlignmentSchema}: AIRR Alignment \code{Schema}. #' @rdname Schema-class #' @export AlignmentSchema <- load_schema("Alignment") #' @details \code{RearrangementSchema}: AIRR Rearrangement \code{Schema}. #' @rdname Schema-class #' @export RearrangementSchema <- load_schema("Rearrangement") airr/NEWS.md0000644000176200001440000000127713663241774012331 0ustar liggesusersVersion 1.3.0: May 26, 2020 ------------------------------------------------------------------------------- + Updated schema set to v1.3. + Added `info` slot to `Schema` object containing general schema information. Version 1.2.0: August 17, 2018 ------------------------------------------------------------------------------- + Updated schema set to v1.2. + Changed defaults to `base="1"` for read and write functions. + Updated example TSV file with coordinate changes, addition of `germline_alignment` data and simplification of `sequence_id` values. Version 1.1.0: May 1, 2018 ------------------------------------------------------------------------------- Initial release. airr/MD50000644000176200001440000000253613663375352011542 0ustar liggesusers6da4f9a3703b24216251d850f4ad7da2 *DESCRIPTION a985d434dd073f6f0775a0eeef4f708f *NAMESPACE 89aa91313523cca147ad80d28a13ce05 *NEWS.md e7e70011a1573c09a32dcf98cccefa20 *R/AIRR.R 3f2f7db05feee67b62d59f6dbe9923f7 *R/Interface.R 742c67f7f4565346eb5c1fa209be5eb6 *R/Schema.R d76c4a395ff2eb1c0e915d968a79271b *README.md 56f8d8c4e6db6cd9a053cb3f5cd81f27 *build/vignette.rds 394ca52b637d400707b09f7e9eb8830e *inst/doc/Usage-Vignette.R bde545ecc0ccc401591b65ab452ad6ac *inst/doc/Usage-Vignette.Rmd 7586ee03b2e9c5a1e00d4ecd7fd55f9c *inst/doc/Usage-Vignette.pdf a458b363e1295e66927a9bc370a2219d *inst/extdata/airr-schema.yaml 1891f46a99cc5107008e020be186e09c *inst/extdata/rearrangement-example.tsv.gz cdff04f07a98899c9428b00f65e31e87 *man/ExampleData.Rd 43982fb32f8389134549a31ef7863c71 *man/Schema-class.Rd 09b20dfe691d90bf3bd3071f08880d8c *man/load_schema.Rd 90fc7b88dcaa2502265fa27dd2707c89 *man/read_airr.Rd 28a473d4faa6f24dec31a2bacab1da74 *man/validate_airr.Rd 2518e8d5cb51933531c4fec253d5eb7e *man/write_airr.Rd 672989307f81acaf9f9638bb1ecb8379 *tests/data-tests/bad_data.tsv b3175a10ac0c7e5e7984eafba51164e0 *tests/data-tests/toy_data.tsv 7890e4d0b19f59a1fe5d6ace64347698 *tests/testthat.R 3e138d9dcdf276b17f28b722242384c0 *tests/testthat/test-Interface.R bde545ecc0ccc401591b65ab452ad6ac *vignettes/Usage-Vignette.Rmd dfd0228e95694992e7848611f78e0d60 *vignettes/references.bib airr/inst/0000755000176200001440000000000013663242111012163 5ustar liggesusersairr/inst/doc/0000755000176200001440000000000013663242111012730 5ustar liggesusersairr/inst/doc/Usage-Vignette.R0000644000176200001440000000075613663242106015716 0ustar liggesusers## ----read_rearrangement, message=FALSE---------------------------------------- library(airr) example_data <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") basename(example_data) airr_rearrangement <- read_rearrangement(example_data) class(airr_rearrangement) head(airr_rearrangement) ## ----write_rearrangement------------------------------------------------------ out_file <- file.path(tempdir(), "airr_out.tsv") write_rearrangement(airr_rearrangement, out_file) airr/inst/doc/Usage-Vignette.Rmd0000644000176200001440000001234713402556313016235 0ustar liggesusers--- title: 'AIRR Data Representation Reference Library Usage' author: "The AIRR Community" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: standalone: true fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Usage Vignette} %\usepackage[utf8]{inputenc} --- ## Introduction Since the use of High-throughput sequencing (HTS) was first introduced to analyze immunoglobulin (B-cell receptor, antibody) and T-cell receptor repertoires (Freeman et al, 2009; Robins et al, 2009; Weinstein et al, 2009), the increasing number of studies making use of this technique has produced enormous amounts of data and there exists a pressing need to develop and adopt common standards, protocols, and policies for generating and sharing data sets. The [Adaptive Immune Receptor Repertoire (AIRR) Community](http://airr-community.org) formed in 2015 to address this challenge (Breden et al, 2017) and has stablished the set of minimal metadata elements (MiAIRR) required for describing published AIRR datasets (Rubelt et al, 2017) as well as file formats to represent this data in a machine-readable form. The `airr` R package provide read, write and validation of data following the AIRR Data Representation schemas. This vignette provides a set of simple use examples. ### AIRR Data Representation Standards The AIRR Community's recommendations for a minimal set of metadata that should be used to describe an AIRR-seq data set when published or deposited in a AIRR-compliant public repository are described in Rubelt et al, 2017. The primary aim of this effort is to make published AIRR datasets FAIR (findable, accessible, interoperable, reusable); with sufficient detail such that a person skilled in the art of AIRR sequencing and data analysis will be able to reproduce the experiment and data analyses that were performed. Following this principles, V(D)J reference alignment annotations are saved in standard tab-delimited files (TSV) with associated metadata provided in accompanying YAML formatted files. The column names and field names in these files have been defined by the AIRR Data Representation Working Group using a controlled vocabulary of standardized terms and types to refer to each piece of information. ## Reading AIRR formatted files The `airr` package contains the function `read_rearrangement` to read and validate files containing AIRR Rearrangement records, where a Rearrangement record describes the collection of optimal annotations on a single sequence that has undergone V(D)J reference alignment. The usage is straightforward, as the file format is a typical tabulated file. The argument that needs attention is `base`, with possible values `"0"` and `"1"`. `base` denotes the starting index for positional fields in the input file. Positional fields are those that contain alignment coordinates and names ending in "_start" and "_end". If the input file is using 1-based closed intervals (R style), as defined by the standard, then positional fields will not be modified under the default setting of `base="1"`. If the input file is using 0-based coordinates with half-open intervals (python style), then positional fields may be converted to 1-based closed intervals using the argument `base="0"`. ```{r read_rearrangement, message=FALSE} library(airr) example_data <- system.file("extdata", "rearrangement-example.tsv.gz", package="airr") basename(example_data) airr_rearrangement <- read_rearrangement(example_data) class(airr_rearrangement) head(airr_rearrangement) ``` ## Writing AIRR formatted files The `airr` package contains the function `write_rearrangement` to write Rearrangement records to the AIRR TSV format. ```{r write_rearrangement} out_file <- file.path(tempdir(), "airr_out.tsv") write_rearrangement(airr_rearrangement, out_file) ``` ## References 1. Breden, F., E. T. Luning Prak, B. Peters, F. Rubelt, C. A. Schramm, C. E. Busse, J. A. Vander Heiden, et al. 2017. Reproducibility and Reuse of Adaptive Immune Receptor Repertoire Data. *Front Immunol* 8: 1418. 2. Freeman, J. D., R. L. Warren, J. R. Webb, B. H. Nelson, and R. A. Holt. 2009. Profiling the T-cell receptor beta-chain repertoire by massively parallel sequencing. *Genome Res* 19 (10): 1817-24. 3. Robins, H. S., P. V. Campregher, S. K. Srivastava, A. Wacher, C. J. Turtle, O. Kahsai, S. R. Riddell, E. H. Warren, and C. S. Carlson. 2009. Comprehensive assessment of T-cell receptor beta-chain diversity in alphabeta T cells. *Blood* 114 (19): 4099-4107. 4. Rubelt, F., C. E. Busse, S. A. C. Bukhari, J. P. Burckert, E. Mariotti-Ferrandiz, L. G. Cowell, C. T. Watson, et al. 2017. Adaptive Immune Receptor Repertoire Community recommendations for sharing immune-repertoire sequencing data. *Nat Immunol* 18 (12): 1274-8. 5. Weinstein, J. A., N. Jiang, R. A. White, D. S. Fisher, and S. R. Quake. 2009. High-throughput sequencing of the zebrafish antibody repertoire. *Science* 324 (5928): 807-10. airr/inst/doc/Usage-Vignette.pdf0000644000176200001440000062615113663242111016265 0ustar liggesusers%PDF-1.5 % 10 0 obj << /Length 2465 /Filter /FlateDecode >> stream xY[~[)b$u y9>MPEAkiaTI'>s[Q:Gi>hw:3|Cd3_ܿk]fF.hܖIQUyr&?ݭVfnu珣|2E:7s(Go=vu]،c_[8U'Zgu>d-3U|xS_T YbuVXˋ2j)n؄~yQߨΜuδu#=l4\?,PCٛo&<%Ӝѐ'Ci>!*|hޟW&焉%>ྑ;Ɨ H[xU.l s<}W4b6"I?9Om8ss nX4$6#5$EATGBB^<糜UF.lP1|{?6p;Nw,gTU}Դms-,!$=ql\iV:bəc%LkPcc68sli[|Da:< }e//\nE E ۰.L{%B rQ=z |C0LzЛv`; DP60qdr l~ڎa #~%Q) W(:\aC>;œ&08{aKO<큜BʌeL8 C0 2"DF!f kRY[Vܭ+ JȗUԦzufѸɩHTs@#{4Y %A"&h¤we&4>ׅ6ֵ#KZ]G[?,! va-PP.RHŞ8 "8~.`~{7' +pbI#[p6Rp8v4IlP:eR" ?ȇY3"7c;}1udB)䒫Ri 0{~qCI OjlHA`P`ؐ @=)tjrqq̞hY&F5:RRKxM'r*S`bˬ,mE'`lT:&^;J]5EdsZ*prp}SW W_G|3C+.tgMsE} UdZ޲!C!-j6kz=߁!7k ]YbBdt}Z4mCHzjJn2N~_^iH}w<]Eh;"^U*7/}'"e%cm}C;B {YzAej/{0]2nKa9CeNq8[;;(4 8DՎT`Zdįq aA.c/crh󒆡gd,_[syfxк2?'+׬ca$=Bk Z)|y6*j*dH)UL_|(}5S8wuV ?@4^__n-\K/U/B>ku3 :*R |dMEDK=Gp2P9r-^[9 ooLig2)w޿LZ endstream endobj 32 0 obj << /Length 1953 /Filter /FlateDecode >> stream xYK6WEbF$E=@<( MiaF\I$=w!ej6Ê"93|8?ڌG}8F'|=g0(bOvEQ6ʢLyxe$YɕmX)\6eag Gx֪U٦تb"!iȸ7Znl3'y& C/ꦒ(Z'ݐUugctC)zɔze5Ù/edn;rF]m?oo7g(J Mq3$ 8xJ^vCZR eNĨ/H"OYs[M,ʺΖ&r0x3rW4;P1HďP"4%BYrdi*S#0j#T T5) Y5-ǁ X'q%&2 NMIViˏ; c“AvboP~FemYCkU"eV=kpU/`JB!I7*kK xA9OP"ㅉpz P76~R!?6tE$R' h`mg訪쪩J\/뻝*mpʖfs^tPGpkv_z}o! 6ᬍ#hE$ B:..\=t+v*smN5\??az;A"|~KpGDx};1WƭƮbGع ̦]dc/^ae]pܱǢ0jO2{ڞͰ.xN2sr6JAFEd.tJ ]$JgLQ}҇ T\#.cwkv;-nv=# b?G!#׃!1欣l*9P Pi%؅I={or,L -0&!\'; Kb.( q*XoFmwiV}K5Wk0\WvmMhw[;Piid1ǚJ M XO?B4 endstream endobj 39 0 obj << /Length 1391 /Filter /FlateDecode >> stream xڅVMs6WH΄@$XIMeMrhz$"UJ'2%+}J-q\ 8ԡM=D=)~RHtFe6!:mrR)U>/X&Lq8,_t* endstream endobj 68 0 obj << /Length1 1829 /Length2 21622 /Length3 0 /Length 22726 /Filter /FlateDecode >> stream xڴyeT[]-VJq'P];$SܭHqwww(Z8:޿wd$'sJ P;izf|pBW޺[Tb3Z:0$zuRLKO&tF`?(7rƢBd3ax675A434F[z{Oٯvw͢BBpn&%j8I N7g$;&Fhr!}9q.c,Qh[Z5RT^`)`r,E8-ꘅ03hL{&IAI߾ z}ʗud.H$BW[E~ZҐDRw;DXz7NQ'&{U}/FsS$j,j5~ 6Ej !Ȝ'~.LO <"ɩ^{r'KDc֑v=q;ЁR?570X5Ss}27CM ٹ>%<dIjK9*:yͤHJ#Rcsk:4"uE2Gd]WqHI)Z90xfZ颫#t483BO zeg?4QJth=_eܱ9/ԟtm z.2q9Y6 \.I\7~aLJC h*a O'~6F=Qm%)Jt=+oH$5&#mɶ ͼ<1c3Uϯ%w5$~1^vPnx*7ÏSETzߑ3]纬Km[(7R>8HG?whZy04TУCVobxc0xDWѥ]E.{[bou3sjngET5I$oZ1~k>Hc,+}䧮fnsJZS}N'n"J-XCZp5JB/&G^AVwft}!߲?t%RkZ,jU5AGp*:|쮞zxJI$K[RHunIJ̘=ϒi/f^I!MzW'cs4Ҹ/mx9J}vjq'FÉl:*p$~^}^DxBP R? Eqc&gȽ+95R,HDW<yx̂;Ng=دT=PX᧹LAo$WjH_=~t(<Z1xI8Jt[6C^1ݪEsEqv[ܿW o0T};3 =֨* J\@W) ML / `Y|'O F@0,']c4lT'plI]Ǔjk6s光iC$ pL?ɩ*ir% IQT0Zq(do#%~(9bA0]U2y!j3Ajmk {EVWUJ#Z`QjP,&E~KHvp5ivk{XX.*?'*oG!<]k3t3e`|+%$jLP[murbT6$O͑/!I[ڡ)  lҭ캲ԟo/x4ݛB-' |K áuQ" cTQD0Y;`Y>+Wٳ,OAKa"R*N963ø]y-o7[BȠT m)PfG$vͻj* fA$z3\w]Y.!Huՙmҕ qZM6A7TQFƟrKɻ>䆕z.Ў3wۡ ^;}~Aq n>)c cKdr?ČTok{l-W+);ؼf~y3,?Wg6A>6<?:ʯۺAywZ"gAseoSx徎@p/7{Xa8I3ק)'kC3 a+GZ6zCb Vxw Ò"}V_sh `H +;C½ M3B~YwE< q{ek xIzJC~lM׋:1g g:@ 燎6snAϟLf'E_9U>IahP؎'sx r\= ^^qwwB⑦cr:ezbؽVy+M5hyYP OQ.`Hմ D,/yxZJR9GXˀ t1vaߘEj>Ek3mqAz# %Ώ%~ƗN^ȼG ݩlI]%Hxyyе-d1ޫ<GZa8* zE,8ћҪe'JƊ+I?NZNd.V6ԻxPֵ. /[xÎa+/Gwdg/%}tjETҬBV#;yP;m^z yܷ"phɸ%}lBZٜ?~Mt.3!y|v,rϑQtsm]X[>C+=Ϗ)]1] S9o9jׂ: KE@*{,Ӊhr8}4^ZՁ\AUga.9axZk(c+RmّpPB?tbs=`'A!]G>sx x.:^J5ӣDtk7?zC^gbr\vt,C()AY'8(Vxl;-iaRAW1LL =zz& U"],} x|0Wa/ ʽW|\kɺ vb(Pw ^-Pf6UJ0z6bi7ݡ?lf&y't\L*9QGCc+KWHx.8܊Y)ir; C/WLbg?ܱhf} T@4,'1dQ.YLA/$vS].\ k}Zdιj-SyfA>~-Wwb-/ňB(,O\r23z˜ HovyD&Qye's~Q}){LL6{[p S<],<{ cӵCľieX;eۛSϱBy/"ZxLVѴUA5FV] X7̹_R,wL+Pos^0Җ+놣eD#&ٲJKCGdM %Kɜ\Y sD){e G% LpW>|n3p3aebOm+Cެzw@wV y9FNǺ?OzN+¸N-+eF0T5juPcQ7t>+Է /j/%"tk‚oTѐRASF Nņ8gӝ$X4!Դ뭕h~t3y#~ݘ,ӵ)iB/Ҟ+U7Ў$ я#莄֚vKCҟ$s6FGKҔc" 7k&Zh&ٜ|0#U(OYŸ U%&=c8 1up.B^9l#)lס+-;C>D(t•Vҡdp&}E=`ЧAo5y῀TvVddS]RXd+y%_8umſ\y}U6*W2>$^"{?ڼ[7 y%J5="s6P.GDNvٳpZ[?7sB<$.Alߒ)cOtG|}%aѻ?{-hӣcZtU.v/U$hPmA'EZPܨΑc' K(=NL5 yJxx9cݻh[up]1VՊ\rMolw+Nw6ru ~bClY7<Aľ/ /Ovֶ`5jHZ܏~~1lǂ5*w&wW la$5$xgNݓPx|rb j:~阯;eWӃ_2uƾ Wd ՃЭ.=k|Q5 {iOeVWx<18+/( ,Z*l>'sQnFY%~aϬ.g;:.Kax&/,Wm\]t!Ci@N2Y[f a%R[ڧ4c 5jM%\iHoI}&h>Be`|zX;7%nH*M Suԕ^#\L5E9a(Z+KD=uS3lqa( /TF( RstWDz\|z2޲+¿;a-@.ij쬙s&Pj>*HtEs]+hγ2}yU:F \b#O&N{C6e'2m-58/ʮ<58=iV[A880{|bGnI3'`f=[8eE(GZNhźLw ߁=}w-RuQ>"}8(*qUFzGL$8h(5=I{%騟g''?E W~eJZno~F[Qsd##Um-Wrƌv{ܣ{@+ ؄s#/킡撿QuayW̫H% s34[pD tHg!U"K͏J('ueoOy5f) ;S7]6 6hK@1/v!R="z+[k<K ѩ MHwY.,EFےXS v0$mOjkާu4구E^[{խ3-2eީ`nYNK!Ixxĺb)[^|"̸+E'2eHF10r8,hGD6;]8P6(MTDH _0nԃI ]z@vfVj rNv`HQjHqnjh /M$k^g Vݯ=S(`q%:R"i~Ppt"b[75; |_w_ gt*f ݆_}x?}\p۸ 8UfN6Xy؃ߨp v~{l9mᇒoC2$`~]V9pINϟ- +W8|15ף8zM{a ߷)4w`ߜCDG(w; s_}FEWqrCM+s4j.IY18\ɔhV̺ Axt"(2t!1Fj_L$/֘;<%vtCT%V4g{b.gs" DE:)_v?ҕd",hP>#t !g,<ȝs1j~-_} ?<غ%27͞[R:/^[9"qahO g~X/9+" <4ȧbT/6clZzaj jDq{29%@3?Y.beAu47&o@&Q <#Uc9 T^32})Ǐ7MuVXb)H ~TD{bHGpA&~ws.IEiQH=G=r5W}^v>g4?iXQ~OpLD߶oٔ#@3֢r{#7^;Xs;,9<]np) "q(<>\T17鼂jP,N|2[x΀9[&%oM-a~J~xJ#ތpT >azqR'Cy2񝍛ԧj(t쬫H!ijFFE\H-vіYtl'mNӡb\xUGط+9k0@gرn _4eМ@⃫BN9y)Vbүjf&XSksONFgHh@'7#J%]>q 9(q ~Ֆ x}ʝ ԫ)ɯO/ wmУ1)>w:]iCU%d"FT$I4PB2:jb ORx?ͽP}j`=GX>CH]uM.ci^(D*78Ұ*NJ _zGS9͔"VwT=\uq`BUUH|yPodkj[Ȱ.JZ"0^k~Jm8S$c8RW&t *8+%)lMn&#d1X-jbY0LCIZd9, $)p۷{1F[MY*g-&̢Rmlz 0=bЎ϶6/ޥ,thr-3TϘ"ma#ig?'(6w 1E_ƤRbj7HfwdQApfԁ(rp/ Wkv_OLOR:0|^i K v`tn_/Dgw?  -ީx/wCnh')GsOTh;a4L!kYۈ=iubyRN n/g7ݵ ;$Y?K3ȊM5:$ HĥU2TΆϡ:֕u⪍kM0bv*Wתʞ &/%eE|s?8'gU;m>`#0MZY;K 4n(͗2ʍ\j#E?\DA' ۄq:)äe br]*Ļx&T1!λAu9\P~a*>3hw/NSwD"7žECFEAÅEk~] P\=^v9BPfJ1hUΚiS{? Gc |ZPCL~ U6 m*oyАۿ*A\UZKV0?A2eEG&`.-<~Pma|=;X1Q| Ȳė(8E_*,z㕚gT;ܘXBY'W&l * j8#7>.[pKe0g8wup?yIU]Z\9"N? M:|Cy 6788JГcХFDZ3=Y'k='i.t%F* ﮠϳ:?>SePVw%E'_@srɳa';z]vA["&%.WV0fg]Lb|vkg@p ]h*W-i׺o-gy1-bC `1;\hzu$X['qD1PX` u2l0#Z),3Z XcprVFg!âfQ UۖS^1"L㕫Z, w7jbbRT~9w:#pARMe;>Ot̊ SDFYX;E<GHWO4$7+M P;;,VQۊ?!twW~WgV`KQ݅w$fnfcu8{sX}gSY 4]s߂ADXR@ o9r+ TyLqV6Eٌ"8+wsMN`bLWD;ko#&{ (ӮG恏dԦ?rGE yXϏӕh )ZsRzEO=$L-F+}ms^a&>mᤘu%{p#+UγB!ء8)iv5AWyJVr9ڼxXh*XN;/?3t КvYbMtsU>*s PT#*ܔW.}i'JoV b%jE!LUfnj%ʹOߝp0N@ȕ+<\6D"w52k'+"M({ylRʈrgs'GͲ$9%!8-G%I80T)q%Ud9!kbzεG/h=Y#85 nl|n@Ǧ__~2A ǒTMW dۢ[)rR9/yW0:P}O'N*ȔU }յJ{jNsN+7zƪ!`g~?80wÍ>?Q-pA@SKǕe` [`;Ӎ1Q@.Ţ~ˑ9IF-boM([%b%Y|;kuUOG+G8 ec MV޲+X`:t/cY`ۗD*Un=UǠ1m\ *j@r 2Sɒ [^sp;vS\E{]8~C|!uJR X_,$<5(T?$w&D3^s@ gU{}][."J_{24E"5^º姭ߊ:THgzRsK]mKc/d{ }}) ES*\Nм|eWs_~mEr̢ hS{]i_[ژSoBpKη/U0PLHҝz̛Ų+D-!֭4 gzm}VNUſ?K!3OiEIYNƐUH)il) tOiL!bYE8e\\4A}9H3^tij,fHܒ4Rviv@oslێSh{T2KP[zLi'~a [WL`ԏ1I.5O;|fjUn_l޹?dyAeOk5n([{OB#K|+ng7,:EJ]VmhIM-#Jǽ \طAT )-sY YC2AuԏwwÎ w( YJTI3M=.Ne*k8;dQhd@ƊoіIZȶ':\')pYan@a#ˋWXHum20Mώ#NL>R5c| 5ZRoro䐂 uItLc1ǣWVO CzȵsTD0sw-Ud5Ɖ^jsa<~VTy:?%P:M FF|=ZU{$RU|w|T|WkDzy˶aBeGmQe%6jsIx6j %¤sŠQs1T[l{`դt!%'WF[K~ԃONnT!C(=8kig]֜5;!L\*!m{FI2vD+Aœ ,q|UB`0:Ǯw+Y2gQ8.Гp>keĪm np= q95irn _TzTj]yEޥBkpuiFriIyaΨ;g-eL#||v{ܡ |_|{!fSJu,,5P%S˃>UjW=S *K%͐e_4VÏ=ty"E Mگg,9,xоbv W M, ,|&ہ6x#XҥG"1@:.K0GɋG,XXeZ?ޠy|+ }{!EY!fVrA3NJ|c 澠ZA o6`{-qNo0(%6m q߲]x]*5g %% ޳EEIiY\c濛*a0hF`d mWQz㿮Qp 8C[Yo>mՂӅ#agըg 2-5z+-1fɄj˜(󄹺V?X*jw0mNw{zW-#a2P@;An:ub"^w2B4_U](Q_ڹȢo?. :k/? )`{F~W4L/mS7׸0 %]"u7HCYRPçm+yl1qDT]fǎC8+"(o-밦U*̗$ADT<2),4HjVӲP1x0b.ɠ٠||w78_o |nu1blیٹI.Av+A @f}D4"Pj}'`㢨gu& ].jZ `n_^DjNc@ 6LoׁzMeptG;CoPkWm'wCL6o}k $ˣSfWisRU%{ 8;%,7",t)qOB$y*sQ1VW |*Su1=!M0̞:چLQ;hOKŸlb@)jdn7@wF׏@ִVfo;KS{ *k`y-Z_ۖX60»sk FRZ}_;4v{\K] aXa?GKv +,0G^5Ul1˳[Dci̒+KwRacMW9\LE4AW\ c*rδt&j!8_ïz˭\hYw3vtr02wd搥U: Y#'`5(1Ph-a~Q&wiIۨۋ,Dޞr*@f?N^Ϣ%;v ]iԩ(u5X?li("_RX(H2BA"&s9I'H#(K~_ƻ\oUz(UHg/"^ W-5r (+/Ts+v xH:42L8md^{P᩹>\kf9FZ|–'x@Qb @ ]JHV>R~kۺFhoX^bv=K\'UpBN5TZ+ok+!`=Rΐ6.UL2a\΢;΅vj (1W 20. Q PT*}׈AM mc*>M#jlt=fV5q_5ż@ۭ!Ű N44uBf]o2QTQS,/MZ| A.A)1 ,4&Uo@J&;e;v?V鎋 ["8IP?thurwyP~KN2e CvYC&uY[nqEW'XE͍{+)`zjјE:n8@Ս΁{NLƕ:\;K{(}$c =K@c΋wƄ]͏+3/P9Q@DtB)͑wn1 ])\, V<}-ݢPfUAMeBUh %9!?Ϟ ypsMSh'TY0LNEkՍ !pclإX ETP\,(Gj)cZ $jB?wt@oG2:BFhp SpcR)=]!QLkLXТ $(MٰfF/VZʏ4FXe/z"J:?F&=>1ʹ,_eCfzOTp=+m0@[g~{čQt)BbNoă`:v"2wOQ|!̺h!ߐZs/^dr6:^hij/,c=?cф\NR8=I |ʣ ?ΊA -0XpnG޹ݻFm6ǰq`WJjlp7k.#&[01iͥΰXCGa)d|M8 Lt ֺ%ς}~5,G=ψT.2ކfX 2UjͶ om͙S!IX%}.SmЧUr/_uxQDXU3\>; ! ^PkÜqi_.#/8Gh[غRӮ\D <#PoK E1u c#lbQCMf dX6B)Ӥ1 W^̔О_n[יm?z3Wf4I0j,2ܾ"q4GcvS&~ʝdIϪaf@cZѴo?~ORj 10WȞ G4lFѰa'y{A XH8W'oiI)v-)|`N"3&^ߒHhnƟ,,?‰qw"=fDKm( L|>SOr\oxwQeF]xp7Rycf,TC "7RzzKu&Pʴ<9Qş> ʗb ~`U_d/(67g=춭28j}ƻ2#lIհa dO%~_DaaΏ]ˣ-dv4~_ry©z5귽Iku\1#џ }L#cm(U*|ʅ ؾ,N/=30E^{JP`x)!8-Fs U!L2m0etz8mr?,:21Y ˌ\eOP"m3-u8ؘwG[Q͐t{ B}jlLh4Nz>bxEx[޸^{^"F95۞tN#S:c4I{1If%lULcm ^r+VPwzx jGlnS"dA6)aL,_/!HlW#"T=M%6G}d *L)_ه Uqb=+(ꑭ n`4Hr%(K7XH4tbV*_,P҅z||F3TZnx =-(M({Mw7cN!>S3YVp^! xF!%!q*K.ܹU _w^Kl m `Y; ;n6޵OЂr]QFOLyoPn ҝB ; 3uIv0ѵ0O ,|#sq4ֻgv | dmC&OG'#"m]ĬL|[)[;%Zi!ewm}Ull b W 8S<6NѾ G8s z : j DScϤ63'~{Eh{\mT#9Pq9$@P`[IgԟPOI ^rls.:SzY@n:|H^Í<5L%@,k xŃcDJ*}M-Pg=&3f?z$ĩ;e˒7q+ mɂ]s' bONɼ84R炑riJ/Cb>9rݎn=%0A驣U^MFoa{h XM I@&̇jzcgo|=8~PHy?s VNXїAhZ_#YE x`i1M 55S?;ZL\y|FiSny }v~ޅ[R z'śP*Pbdn3b/ ycNۥ: ' lngݝOu o0`y/L_9gCjoU /w>*Icɥzz`hz `BW[teorE endstream endobj 70 0 obj << /Length1 1919 /Length2 22125 /Length3 0 /Length 23282 /Filter /FlateDecode >> stream xڴzUT.xq {pZ[ܝ)R}{3Ys͹.BEAVd:21pdd@6LB k <)d+b;䍝L q-]i0r U퀌 ÿщ] 5R,̝`鏷@ he05H@B `476L*@ 2@\I^UA=\UTi"r* @\UYϧ  @N]'ϻwYQAMQF?k0\7wfP{w5u@adEOJgDr0#`x:作N% c#JR;˝MNbZWsCǿ|ed6N@[C[wC'C'gG_7Єag?9drwQLwoel-0ag,l I*ʼ7-,:tNnNY'("``0rޛTDdcOD,rpzOMUm-읁"}Gft09Tu1{ =@vSCkG)h898=o00vzoA+); )l&@Sxz9{3P%lm-gh:UQ h`dlC.dfKgбsfhYGދV@GG_*{ {+(ROe$jk 250  {&@@Og rzw9;yLA6@/G7bgKq0-8ߑ'߈@o7 5dz5;ݿk96mYN t )9=? na7YC' 7ma|Mg-$reag2qpY)2{?Ͽf^ h 82LR#7Y MIw\ɧ!>ي-Io Hp$jaX6%VL\( l! dѩd.QHejLg45TG9[;P/tJ@26;X--L;=Dv .R`Huuh_.Vz7zTbtuӟQCDVv|=I%kqUٗq>D+KJ=v/CQ H F8A ƥԿr>T}SXxN!jp3B} ,P@ud!|U#ac=oLMTRaN2MғxKrH`$F&>Фu !ҕlmeuuRe?8a^.˔`]dPvI1{+47<>5M}+@( ='k)J˸35cAC}&Ù"*"7O-pD2.*Y>hPWG0};@*5}3syۈzʚTy'i J֧Σ3eѼ8دB0yTN&ɤPwp!<.3_SrM~Y+ϵZڬX-!]i0?%KI@}A/@f8`q1B[㉆!3O-tQp;hoE;lO4ğ$\J+SC!-3[x"u_vI0jfky/Y9)+OX+vZdՌLճ?<û,/kM~=1]B"\det6ɩF-[s~t= Cbώ{BX-cC/m'N>imlwuK{ܠٌvmyTi^m|NV j%\&[ J،l|$޻8%CԞBq$ACM}dV;8愌D N4y1 LiBV9ė~N97^8 ήAOlS{ވp'- jX *5¸/5cLe]t|2hEl~?`iꐘpv m9!˸:{&%X˱@6r{$/[7hD jkB[,@T$]P=wQbTG8(U4з&ddjΈfJ& ͐yԡ5y0qR_ cdb/nXi(2i8f%/_T@t0H22J%5tڒh}(-uˈ0fHztE(OtG7"oSkY?BrG_FNR؊Rλ1d~rߵmh%( ѤCO &Dy2ślLlbia6*#fÊv|]3LH.y`guxޛ^@8?EЩQiuvl|zDZ(nJՒ9eoBhYZbtkT1~@FVG96pͳcʷi&'_!}kd ?&ݞylBeM?K4ujw< &_ثfpʐ'l#B_zqMv~݃Ub$ҳڠq|ZWnp8݂C_MRQ0(&@?eb^q}m^ҲKXܢE #EQMB2'4t[Gh0zxFav 0D!Ɯmk;A2iɖ~wQ._O -Z{cOT6.ֈ[GUe$V){OH.y^>לt\ƨa}TN -JR7E,J K'Zf^l.t_*Rм 5O)g|5V-wGKD a4YW4B^NDdPҋ=}Q~睧w&ir/ ~$<^[qR,MYKzV {a o" k?sL_e4tJ& ىvΗYvb#MŸ5kQyfk> ,cnۉW.T1.& P8<(>S.Ö쑈M^fqjo)cf ibx<ٲaV _3>A4B,RdkyxwCwBLNx{=],1!>5\<s'޼*hٝhh Ю. ԥf\O~T Qw(nҘY?u^Ǵ-X=cY$nLQr(5RW/J7§>ᘚ*(}KhRY\++IYkUQ3xIFDcZTEdOG3񌡾Py+S_&gS9x7z:ц6E Ki5|b -;FMӾ7hL4DRmf@u~t FA` = fV,5|&nX;.IzÇBh2<.'rz$U"9,mbh"1"̹LO:V%t?m5RAfhH~Dcr%D`)߇^bm?7wf<μ~.?kվ™vx}S@{l¢v~6# cy- P9fKAI%Dd6/;>ly,d@y x#gQD#OEbUXbӦnݥdeiD?'FWB Н~QӄW&b3g;~KqJ Ɨ{-7|~[ 3Ũ5`xX$/kF2>֬YF/<N1KtRQVG(tׁ 6*wDZo*:~$G#u;g+X`e("lXBÖޯNw u1P8/c.*d gE;Y\(H2Pӓ1זcYjeє9kl+PBM|P0 ~VïoO`>-;`8D*Qr+p{GkCC>)#ЋW1&N,i#0ܷntY7W+\|:.盧OA`+ʹM]m"~Z?=MZ1E[Ÿp:;!K'{`Ԁ# yҎ#trwA}C[k6 w3Ul.U^~UH<羨ui5o֟d@22[KRԺ]V0G'+ ~͊ǭ qP0Gg-^8 6sT|*PXj`0x2JFѢ?/ (!w>KoR$D $ ˠyGIRYh LC*%˛7:_/V$blu+:Fh>ڷ8B &=-[+sl-,<LG*mՏlƿ7ޏ:X߳=2J˚UKM{mo׋Ko cVP}-%2w0lT0ȃ`Ee^qϭܼ*`e^c+v z~LǢ<9}#玪 Xrû] +s5z*c̞ )Jc&k4%2*w{E\׾=Jwaل}>:;t4]􅴚Gcy}YMϐn=K8PS~kd0VtN B4V ,.:A&$9ʤYɕS )M̀F/-&TPpgkXnn/?/6 ;YPv2F?\Dߪ0JF+Әޮ٥;ʆo+peHD*U(Td%GBݮ<[_ z>QQ(>K..rvr;^ )GR.xNp )lk6e+.e8W!a+deE FDhucQ(UÍ-5}86 .t򷪙c|!>k]qz-T ӷML&.X.`r5jQX7*jF/,ft- =LW19MWM8΋7N?] IA&I{|EIgXpB/5PbMk->s fx雨Jx-E3J6}}4hW9QcX^IҩلN<(8mt+1x';pj8h׀ԔG z?71T_N0)+L\.7_ۊؽS. -nv _xFmrA5*TV͗mFtc6s?BgO$](7;p ->)*SV:,P°E?tMA+pR9/0=0Ǥm`jİD#t&%I|!]6OsmO{nxz;N5s挕F| V ?0gG-W@`(- 0ĺ~SijL j^hJiŅƌEqKV>X_Zy*n&Hr)U8]qAK̃Z)Xұ纜7.|-rfNS 0i]xv/yVՠƾgX̦'skL/vvgEdTe sDlTckTp帪CRZm Jz,Kn<{oJP\)7:=mw9oե7#ڇ?QSDD0IUTNNk}Ҩ].LZ3poF;*+:ĒO.r"^x8I5qD@4of(q\d ,PNQCùI"nQr&Bndȡ"~BuPͩ #L}ƙCi yOpB1Ћދכ"7)|꘷cF$YNof-y OX HC|:uk(+gfb>5-nh՞UR+wZx@*!)OrȣFզy$Ns%1پ"nFAhERT z=gjwBI1|ѥDm\{9لVJ%koEؓ SNLgvZ?A<4*@@bk>׺ /|-(N}PQN4CW -8>6X}9b WsS={£t[W%GkZp%QwH#h5ېfz`9yƅ7`|iIcܱp"iֶNc~W٠a}wBn73/0~}8 YYNOSef]M_GOPt~/ Al]n=}gB)6 <ٱȕ_I̬k+nr2saK]rС>ȴ7 ѱ[4{Q'#ɒL)XE5Ï RuTwc8J'sDK5y5.aR@Z\NვwMcDd1M8 +RXPd6K/Oc_.ǽ]ج)% e. ɬxDCd 2l\US8w CT6,5*e-v`ٛt/v ޤl-]uuE/U4LIc{;{֗%aB(a55jo"a# lQqeN>J>=NZ2f-X\QgS5ƗP>䵸T1=.ws щ8%\qV% =iɂJ'\!f`pį]c"$AYDl#r'==O3xw,bteB_g+I O)E~ UǏ*g5^_^n{2śz;#-qW?9xW`<ֽaJti4|l"~a~0X`u垰II?gib~8HиM"*cESl%+fOyX]F})qHkh11)-q872M,:\NYgl1p9*@& 9apX.6jnc3VNՋu_XI)dD?Bʱ'ƘP5j~h{n:{{TܯD_ Y] oL`ެ,Bر#GirUXٕ,|( 2aGsYզgH(ycĊDR4RJJ߇=%z+_ R{aY QJ/*p`%1w[Il3 D$:a,A#ēf2z'Lz*aRyF+=5V$x]0=lHHi"W"pl/*^ԢA(ARF MJE21"6q5|_ [[i՘{Fz\DB,ݱR:s|/e# r)"8~QliFBi٣ꆽ PnC̰xq}GP *{9Z~zqk3V= Onɜjn9ʾ1%sS;|2D55E kyjp[Dʇ(o+*<+l?y |`%=R\R&{,w(v3]kJ54gf԰cP[f)ɵ>QPo廭$/"a?p&RdSlt 8}DNι'? Yqڕ~gc3ɗh)16 n ]|6fO~@*" ?/?YdJ N,n*q:<WϢe.m-r)iaNJ{$Bg?٩| &N 0[?fGpĽjzz0L Eh3Ojn2vL|i:XӄsXQ!U SbK_ZMՓiY~+Sx0VM*hʢ9Esϫ\*>ţ|!zb= g{q؜z!癏Y.V+C,!k ׷cytQZNxd~q\RvrА3qF!=Bv!eO^HY$s1Bx !];CdXw5(Q7(5m[AbF; A^#}BlX"E.]&sD>](o6/ y0^]i3]S:z$yG6[,aou5CvLKjb~ЀB=0`ȅG,&VS k#3eǦ0fE GyLV5Y70W0 d\ сUR.ah. $"'Xlo.10+%HTX`I\=Q/pn3l+qBK4gIl Qtjq yg ft=M'A15yiNl.닜~DnB dr4͚mD~T!V13^wjr/}Trdz9j6P=e p 4 wf,¿åto5f#ﺊ?_4wTyv{t]Ҵ*k:!^툟qp п:m}(-eC\4Y?;"}`xv>O|*bp: b WeK&םma^?Ծj.5xA67@2Gdf76p`v:\žXǍZL\ېTA8! _ULȹўʹHe[>ulpnS1zb2`9meMFUO0W&1Ca֭$t]L6=D3k/Ly"*;9'9Nl]7H]0(4ځ6ڗI{fvk}0 lm?B10UCr=c;kFD =rk$۬LͫHr"ȫp:z"vR"Yؾ"اa䥒񋴯My4=U)mƕLygP^M{ _d3QG7g>" fs{^˫+ @RݒOaet.Q.ajBF[4ӈ~)EtddZK$N|εQX,>Zp7sPX_pڗPc1Oy6F.w  J% ,?s9k1J))ږmPj_pjofra>Q[t|!d5BG3CeUrő&)t _`_\WV-UzԔ7-I%{m:XC)NpQaX&?~t,,$7qpJ ĶhJ!'+^4'+r ~"X9 +!.1;B6q0=4иgV[? %#UfDf& w̌̕p 5}b~ F{__7f_?V,w#򐒠_b"c,Jj;\RQbo|N-O ʈgn19|PfAI"IƬ=OџO!f@٪vX oY ԒJma|3◘.B @T)z0EHHչcp9fWa|:[ڂ` R(pBu%ItѯApfy9Z_ d"NLH ?1=GDcmş9hD,K7l7z0H/,cl?|=0QI ;<&+҆;HȢq*8{r-q!@yݨyw\bwt8ɼ1Ep%L@؊&~/8ƕoא~a;V^K.Mqe@ LeT+E?6Z' k\%}#s9CāQ'pMD V̫s7oڜ}f Vkb'f & ,GC+vS͜AFꄖ3όYO*HFH|PB$K+j]T,m=g+X.tYrAKEhFw Y*pr}_FO1'W&5褿hGQ_}D3KhpKm Vdb`1RE*$BxBEO$7spD!'ÒJVVT% Kə񩣩&[ Z ߂폨^C1ilTchQeK^AlSQiRI,.ӳ ">΀H.i_Y6$=|Yy7V7Em2ðt#eZ,~˧vRoCžFN,ihj9YNڄ>gTC#Oj[ V<1ݴoҀo#SL|iN0|3TfUރTQ pmH/8H,Zidz01z`obԎtb/V9u`hZ(x}a5j늗3;*A/huz/ƍIIEE?D&c$:~95̗~^@gT9>M86WYwlfH,C2 W-% O+~Jb8reC!$KR{2W@LMn-zXW%60*U|銨n/[ oqnъKdF./Y-Ԭ 8Ng./Z- 46Vl ݓh*Gf9´M-sș ̤ "p jsh,E6g:$")i ! x!i/ULTٗW]s,24[`! _]뗬NhE¤}WV?X۵*OhJ# k#jT)~+6ˇi8º:R”s#x;A_0UiS~)Gbrs-DOw[>QVE`$jP/-S&z W YΙd-Q Sh6o_Β(heǟ@\F>/-%Ї[+6ɹ,O&v+.nM'Es?= Ƀ JL!FB]eG;XI oipAݴ$)=rށd AK^K4ZCmk4x07֩H[\Ą2ŀQ㡂?d ;"yh4 zǶtG=4EpiY68f@+xFUҪ؄ܽxq5\[FCFƮ׿jgU^Yj|']`3m7RQAۍ<&bJ/drr0璹:c`r h fk |$ȟ;Xs;㺅z~z9_@S,՞2vuW"s0 tC?Px2z-3wwzʔ+{hIYxl䗘Y>;nYPE-r$ g|n,9Fdzro_1#͘veaylٜI nokj!1:N?e{o`o)e̘c PіV*VY݂i)h^á{Mxn6 A>fUKD+Dtp mi| T(ivC'z<*O2^><@ 5U;_xpgÀ"i.%$_~c7BIW4c@-EIvA=`gMI%OXKIq#௶zhHP-Kgwfͧ!!3'uCٛ4ڨr?9C' bMI_meCW8[9՛*rp Y*isgREyd:c߬L'^qDeL,mpEC3G./o2OZ^",wivJxO@P @uM x%[.#0[vS}ƴk/J D_2MM.LtUq粌E6V|܄Ӏ+aEe~#RO$."hWTNJc_)"~8<nnw"z]49?V=˶Ư!tr$\=H1$ V1ihP %Њ{*ycݷE&2U_?"Àvׂd%UK R>g'^Vof۲UrH>{vׂ~ld($<4jЂ: [nhp}3xni!KH&)jɤ 'I͉Sj&͈X:ԷIʧyhgjK@dX4!O$rRd7x"~+Uq{+P!}9BLKo;Z/xPū0O3sZÐR5Hd~#ۺe3[v+E6+|q~] b- e;bKؚ2К{`p($aJӧU[PTӒ{%T~^42t4'۳m꜔2Q)F`u tK:Az{v UTv;mQ(`|b*>ĚE;d9+*F02-*l&\I͏M})NT խwbY8V48 kM8BOII䪻V-fkjl@|Ӝ+H sCIV}K;Q߱2_٩5{Uk`H48ߘc]і!$T}^d;Aj 7phv9*Wx'Jx27Y @2;N+xEʌE9'Rŗ| 2qX}Xelx}åv:ݶ.:q&cNǁ s cG KQF Yqڄ#iLMdWKرkBKBRVR+|%ivzk V5ǙLtL(j|-} yoPv"&$e&x?V\_{X]$bkw3m|iͽR3 礠mn`4_/zT_"5msdE;.ո>+q݁5[хb2 n˩kqH|-3SY,?/Pzf%]6?D$.%]2+a_@2Ah|0UJJ[ӹ:PnkbdWyO~Ћ)~4˵Mq:rs#9; Ţ&AC Ph^m1GN un^forqѣpAסB(S]JjNf͝ڄU @k *>_3Y/ZMdhb#:Q4bA%SfGC)ϙy ]ˡ})';MEѿgkD+;A?~#iǰ:sD"oJG:-O "I歝LM5E8E`s ^\.*! !]uܷ[zUiU-j`UPvjHS Kz \4a~ V@W[㶧gX! CUC~[uٜ'{ӡ$ A2p=lz^TMZw;I.LsvD~r]TkYwU(X0,ZQCaJ}F @I[EG0;̶ZS!qCHս8Y+_Ou<[v');s,l|GF`/YTl@9b}Ѩ8B:TίpBv4;ȩa5I{ L6Mm !'ZBޑ[9. Bwy59m6zZ> 2RPydX:r(eCPwwoY 6MJh> stream xڴuX>LwJ5 ]ҍtw#t4HIt|w޿\ֽch)5Y%-@r`VN6!t88xPhi@@;g $[z@r!(yqZ,|  h8{Z!n bH;zl)6[Tj >൶6@^K6#py-TӑtYu~!mXj:>骲::x~/ntf? nN40zx{{{x{9ٰ8O|A a W߻PAtH I=M " @O h`KH` A@wuRr/;{K\3_Ak;GoMURMQNV[U2x`VUg:`6דQp8y![I;;9AXO/;`goᰶ[YӅ5(? @>3/͜!\]@GwP5<^oӿ]KAv?H.o`8]+A<v?EpQ \T ?EHEp \ ?Et H?#AAYAH#^2kmqroaϘYhm'7pgO @BlJB+b B,/rBV/$ 9!un{?nH1 pYQn! tCn]=!_ ?qrBR"Asyǀ֒ROQ^u[7_Y_ <?w:A6/׌@!]} R _ חH W*LjrwpB쐟?ʖrcr Bt<E szނ<[ eiR8>)}lT< G|1}$BM*xipKP]I`Z0\6 y5zJSb H!+9V:$Gu1q_ؠg&-z@Z.k"ʸm޻l"q'T'nBOryqKo76t\c,v-,Ý}DhNTR(4U6c|~U4بI R.b)iF{AK ٣ ,'7Z96>iLĜC{U_O{Nc(ϛHKH1n6v%Yth v,SXlUB2{DXCr{ahe)(Zonk7H;P?)>2>jmcϥ2yS9zHˡ XilV8`'2OY}Fsm˼gjB)4)}3O^Rx<<_gcxhqPPx<7zEבZLFXݥoWˊ8R&U@Vt/j64t }% I="$t]5}wN%䕭[8F ejh^A!*+?Pj 3"[8vIQ*=ertkdGz_紛"jk5uݼ7 "Ql29T))ex0 ,LsbpmjBcmܝ9CkXb'K .EfT'͛+RR̃9T+@ќdnOEi+<${nV}ؗ˩i$y²(xSLD_{.~~Je 7"-#;)<ꉥ+Sӎt0]8<\X*xmh[]:~3 ]iFrEo`N-yW0XQ;yJ Ѥ%2Nk67,)Y($ >;p_2FZʑ&meT_T3JQBҫN7l9qA_ހ>l/LDa| D+t[O(1N-w}Yzt^%,J!G&|~ĕ^tl.՞fгS)NQFHW'_ڴ5~,ͮ,O1ȹ_~(hŊ1A1(^'NHŕLwژHGd2mIH3g)sٶR:_ m@bU'?/W_?P1qq*tDˇY4)~]QZᢥnj:AzTerjRuNO.+)ΕFt'Fس$I=W0;q~M-\ue6qE7lkqi#.ur.[O3)bV*rQ) ]nfi2MbAH6zS\Rư):Z\ c,YhP-ٽ 6_BE{WIllۢk.tOFs>زiMST'-ގvYV{6GݝŖť]PbvC8<gvGIo!M=$ 5+Bt&8cPXs`T٧1hOH< "Vn'Rf:|8eLs3fRC,lҋ08QL+$-P_dK4 \*C\9ԋq@Bta,\,x!{6mhDF|_rМyHFCt[Qztxp{qsӭa%͚R`n=mnd|q^!,n2kr›P~K%<]zqnD\׏8og} j]!t+ȾU|S|ʯCQΡijV2@>v?m^B$D}V[&*WqSҨM9]bjEUR` f$zi7`s$@Mx^,]d fF譂oS&r]:|91"r.FcȀB^[| ,+?Y6enVUÇl`Awŵ1}w]clk"ӳJ.H^0Ϭx} nA/q#'.C,XxS7CqW]"!Yu +,o\D騎Y/rk-zfʝL鴄\3}AꚺLm4*ukR-1-*ǖ  C :k~s^#Oىu5#V@\HSR)?k}6 ]QzTݠr#'Q2SY Is0tÜj'gYew=Qc0DFrD kTD4]eed&ZOxC'|"J4Q!讥͇Njp-dp Ѓ<-l)G=s &>i_~tc(0ifdܘkI;DOK \`ْ8PcDoϖRI7k u r;J&f"+g]Χo dϵatlW4c!}oY/5=$clF^%Nǯ .$.; m|ifGy%k)qmL 1V֟q3]owQBՙˇv|Nb؊r"`Yi:Scbko8]/bFn=܇t\߫_xBT˯S|21!HNhpZx?N}diEn{YK-Eje曥rՊyjeYػ77D"rk=]2X[R0\JA~% [T1 *Ct@[ĖlPEj1]5WI{C{1>?%t(;IFEL/Io>H ɤt jh`dNHX8?'bcJ;B%ݟv8&lփ).ڣǐI JN9CrY2#뽔<w~yE]mucy0FWNj HQʑS(%]4!,Q)AOx ƥɭ20d89~<18uPk-9,Ա,7pAp$I>./9nAbzAM@bY 99f=xiRh\I+>&`L@3HN{]Ay'uH,ZkݖUJ+#Ti<\tEmҽ|Blz  ` N|S‚c($FC|m["rAK٬ﬥ'@ bb4~ -_xN+Z/LN0 OLx7Ӯy?I@T58`ۨsV_9/_Шa9,傕È(;'j N$\f5 ߩ6p]jYg7L:99&h'-{%&(A`ǦPR:%53i7pX`Gʠ 5hx,-gMao$z75pJYcK5/&W8K5Bꅢj_jM~lxy@7 MB)Ydi#77UPϔrnc#-w~ Tٌ@>" ABIw*{.# 73nT/#۝|gk2Q޺ W0``{{ZRujc:)X8}m0 UkX %oIۇ'3?EXPw']*xnҎ) @CAH-{*J<$"k ] ]tSA/;EY?%%6^69Uy$jguցT*'lV"R6hUށۓ-NzP ǂ5YzO}XM[JntYȖx= x }kXBR`2t_ &Kɻ3ҏn%1ce`Č \ ]u׷nҟ<8v7EO%]`uDa,&gb1%9": #E9u=?~rɂ0s՝p5Sްm9Ǣ4ϰjWZMbϺuҖZ/G%eꙥc4)ÈtKEI)sLw;fp˽{9ӳ1c-6(OW}y?gPQx>5<> 0dm9!M$6^N.;"vsG𔅷)_N3?nyϷ Q`ːrD2$e_dTT"l`5v6qkQ7oܘ$۾X:#!c/R3q2VyA*O<˰+wk޵ G5*ոmr]&D5 潲X޿y;%KDowyxh g]-T^؛r4CIZݟ؛DkmRm2trhW(wc}wt׭?9w<,Gm7ZtJ U*/Yr/`j%7\^:L^JH($Wv+z Xn9ÏM Gҝվ`ro^MB:r~?ėZRƆksj(y2A+ 1S,km*OBKe5X4s<ЉVM үCd+ 9#w~66/zK?s6yaL<-Y-1A?|.vCgcL7y[z5궍Н i ! XwROW ]gגJ.CҒWގ%D0GCPЮ|y  Жi~oooY)q`tȗC*㻫mz/{1o Q;p`ي<e·w`yf>z=T+R}Gg>t 3$/ZEܕ.@BTxmgW#f}QNbO3/0 .'It!,6e+:72[jw4*~D'ϵ\ ).*Z'PW - FgTy&%i9)ưeq5HY⾇!kR3e7& ]&gau`3qsUC9DV]$-hㆲͣoBxDÝ~4[zuJIg9l/NRjCUF(OOpJ rfm]NK(?'n)Pc<%%>i EPv'# ph쳧t&o+-Z>ۃR:XJz ;nFRPeBf=b:_Zk4 ~`e5{@îsbuG"eW&xS wÃpA{u[_LwފKߣHFzrOVz!GkjY&|#֕}}gЋ+#A׋9%!sg>ѱl#˃]qU^N5`aUpʅK1r-Ε±ϩgC)_n紪+H_r&ݥ}8GwN } 'W`!<4{dck$jW*c.uN;C/X@d']d^SENѐ-'4B4Ԛ5M/5ӍΆ|䢎˰v,9/.W."'s #~ndxOD@?ҕCѳ~B"1{j o)w{Hucw3Ig*Tqח<_͎YF^C_ 58 =^VexzrS؂o]':hT(푩'}%HI03 T;/\$b%Ǟ۪^OitWk;_W,$40 C s baՒ}-%HŔ灙0ࡘᒆ!6e}OF0rS^y QyȓNT^>MXTjAID7dSmŹ`")p2pt5w *S:#;$5{9ST-o?t4^Sluzy/[Rp7R|lm?0 o\͐"#ݫ3hd}nPְL/W}˓,ҖH6"'uyܖa*ȼ2xޖ?|/FILTY:R1ܹ<shzUaOxJ2(]eWvy;$(,AoyWH >;xԬk3CBM RN5О|)Lw 㚭C, ULvܶ 4DڻFxiq($l6!6oU6Kx LaĢ?9lK7j*//Hd͞ $Iن3W(| :,~e'{lyMvl)ffaس%hHL:A֣~= xlB+>{-!s)f.[|=!y4wdǼW+]zҌ?O 'o~ )ߧiձAE[hGlwSϑbqsuJUVЁUxќ5,1,1Ԥ sA k5mXxSvsnl8g7U6@7ešHo1l/n~m:f408Uj-uv%"CmØHn7D!#4+W 6rqK:oi> r`1<0'JCM#VH6|' uz\4%d`}Ne(~9&U|-=v寰?LlǿN\}0lGƸ׍aYR:Y+ΪI$[#Z8c݇d#M<57_A}cjhf5!uP#Nmt-B$Y 5x .u qUn!&Qj3y?lmҦscUgL%90BOa>bա}[b™\ z5 ̃%6 \AcHoZ+TyḀQV_0&ΑryRgfq])3? ޖuc7skBIۅ@Gjio*߷*8SWt(p6DEe|Jӟ}v&24]{;D|Gj>4!_UWPw3Yk{"\$/ 8Qt[xfSn9i:#iΖ/g˼rQ%^]-$ |޺-D ܉hأ962IsxKeĴ%G5iT# dمg@ F=Үa=AJv?Si;m}xsEdm ׽gt^p4G4^ ac9f؝ZF'ҟSaJ=6n+VR,B*~*D(/ SjIA (Bf'8(7'U< !nRI*CXa7mngA._jH06;z'!w&w[L:r)g߈=߭4ZH{ Hȋ>Y^ZTv:{RǧbL<66Қ4/>H3ߛrn!F$or"6ݿPa>2BCB pE=/zOlL,=/hJ-n7[^GhɤAnʋYU!NV6Z8* -7Sp.kdTj RetHMjp!SIP MM)t j28>6UU΢M+-`\@ZM-hVtۻ.{o1lxkf$^8AcMVH{dQrFrXYAo9`@^\6VS}6΋_c[ML%G´} H w'HhQ'QM%U& ox *B;N`.)'`@_%9mi_'s"tX7i,T=`2Xn$f۩""1(xV`0{o5&罅`˰[ Gh OŸk/:[\puVV*1uW|[$pgk7u:=t<raJK;/~ڧ|qs2w‚Ψ3/` J%w8]*+T)Tz WypK)Q7^ͅT++(@+$2{W C[=pNr9˕Wů_ SE(CP9dPcQ4 .dT؜L=ȵϦqxKw}ʾ5&(aY'd&\")D,͸VCXh=QVQJRB7;41d/ZV\ZN,;ځ1' I*k EZf}U)O^[ZR fK`h.vxC&'ǻxOKԍEJ[Ľͬ60,P.`ލvk%GrC@ H$IBJVO9NhDu)ڶLb`OX#"Ɣ _i\G8¤oq`uj(%)nv)FF./-&[6Fh{V,΂n 2pƇ^HtZ(IbU~i1Q FZ?BвO/y<^'9WѲQԔ[> .J}s;mHYz;9Y}aCuW1*d^#):/z%ؐz~<%h\9<= ⴓc /~'?d*-3 8%%JZz6`Dj*bxl lKz~71#|>C"6cBXgu t@cFJ[ QTSgᵔWY VX=(]B#S'EDc/5w:+ka[;>6ocws5"q,TXg3h R:b_J_V/p@RFhn'(Tp८5(9nɓ;_h"><]6&m`^r@{wdB5AO $ cR7:|&LP>0Щ:KޤiݹZ;>/_TlTOJ>5oHD*ċp&[SGzO#e`,nF˒[y|)ƤuCLT9*}#PCqz8}p6zkip{<ݜTgB)q1-[66-g!iBC*#&JA }dL]a|]ȕoKЍ'ӅdD˻amN-0c^QH=".Ͷg\9#^(U.p D f3K`$ 6itq{^zglJ<=8-QEImv.۶m۶m۶m۶mQE9D2_#, ׅkxlO7甀4/D!z4_̻w } E+į$ֿlzoT (H~5P@r î#Ԟҧ zّfzLk@Ed]*"@& 46 l:uvf&AR.T_"20)4\(&%rdܧ!6u!Fd2^n 0'P(-\L00Y4̱? { }4 e^aeH`r}Nl4 DY,2c\ܽd> :0⤘yLwbjèC?|Q5吨Я:(HQzc<3 +=;vS;cO7_OB|p{G$p+2ilHT :m*ibFHޞ\aHbY"#0^/W^ _߄Mm2=!oHw4p>jeVI],a30ウU_,d}颏|Q"x7p#Q'<ڳj^*k}crXA&T]kd^K";8!= `A:Kou_ 9PeEd%ӿ3'ڴ\pR[.d[KȃDJTwqZ1odV<(dBNt,9C ;hb a庨NG1c4R_iL# GWKH6[#]:_ǯ8hje 2'_ 7W 9^^Dx̎!w>w:njyIle)ٽpdEe3Auؖ`szJIRL]ѫCJ&L BUH`Cf"V=""˙GU{U)AmViL 7"}=$7xXΫFzoO#13%ܩl¹uasmΦU ?՝bgʂV.۷lu6XSjԄ- A7Vv T23J)qdIov$8a?:(/Ǵe΄lWƜ%|(4ڴ! 3o.4ٜEeqI^- p]țԝCc#^oK= < ͙mddK$o,g[MTA5vΜm  ^)MJ8I:/GqnF佃""C}dM(8{f_m_F.o{; S'EG"ѱ6]H9WK a˽^ ?4WH}J<1#Жz1\(ݧb_`#ռZSZLb]"8>9cn6B*A[ AWVi6eCa19z pzşiZж|1+i=l5"^}8:g_>P:1kdmi .BE7tؗGLT8/#]t.E(+(ns3a duA1D8 TI3(l4E(8HH̀y@:^ ul&SXÞWTRY@̤v.wo>ƀoض.UkX5mhP $JoS!Ϭl!+A p>GMNM@+p2n۝P *rB㢶~~!hp.„k.b|2`aQr8j|Mj-9?&ƛ ϶X(i@eWKeoi$yZk@'ɪx3 `~rδLi[#S+\[.wXz'1WCdHhV=l͜W1RnQgD hQLj}Y(X+"Uyc*X2^g!M u0*=5ziMl^e- xj+MY-OTO庄(L,詔x+ $F*6~?7, ܡ3^ٙ[b(~vm#L̮zC {C';E+)kF^|џ,(ˑ! ׵82HBuF=RQ:'SA0vJ3M" o`T簵i3ӲS v5|_B-( >* A71 :݄ojiNJSRꆺN(VaVT:r;HqU.PYD ~[їRi(u]x NLyJr&$ {|0Fsk;FX`x:!wO-!G*i(LFy@{60lwmYb[AKkIKaC#+F Ζ)ȟO{LoL}Й tD:3lUռ pe|H8 =|8|vkΠq x-2ӒkJ0'1ԕGgxLI6G58JUa Ԑ[Ī,{ z%|l"ȗC/a[mN:=EsoxJVz+~kğ[=^-u05+4LfIjE]&T t'򂵦7kb0(e%nxI*>Vx[r)&D!ȆJJt~h+~^gcORN>2i a~Nm#3; Rl67 fFo'l/dzq!tNe/ ^֏n&C,akez@oE_- @`wܖ f0*8eKpn+Rjm6Oaf# 7Sn{*b6_;!Wᵠ Ucm mp:xJh: :r G]/miJr?V_`T޶,~<0leӱȣn4+ Dx9,w%*\Lx %lrw98Q]sgyk_OuIK~Ҩ}pIO`L`٤+P3G0xu^ڿr|ԜV&*42N Fhm$,Ztouf$ͨKR :o|k:h*(Dcuկyag'fB/qrb _J#/зta6|À#l wvqRA>aL rg *j`*cDCN{BN/qܭ[ ԯ2lx kh AVQ@D_'rl[Ƭxѧ8QYJџw}HM3 +|МؕNUp뀀 wx*vty3l3*"][4U"8;znt|xr)"=N+;%؞CJEۜ,~KIGhYwPx!@ irCpL~Gq1ǫPOs0E^=?.AC]ʍϹZ* >ѾpRįkzìSrr4 ׁW{E! }|LeR,j!Eݘ)9i"&-+b*kQlc Ú4jTt>Pߌn2I7A2v!kjf]۞Tp{vy6hqi:y o!7RHV0't\G0IH&yL !,#Q'tYK1A$v]U%KVQݐu7 zӎ]lCu &HR [2kċd h%V-xz~.~(э2jw0uJviRŷƥW0?ֹعƙϪ&{p~[_h%ej}G&X.i-"8pĚB+ʯm1< V:ZMz3 `@ư-6顼xíJ pܷLB͢үs!oik_lZ =oG&qmZ2 Y}n ؚٲJftP6:zn<#@'7SWaD9O ShaE)RbCŒU#w ԨePcE`&í:nk)i;MLÄz~~E(#\c2֣I:cu8kQK& PԶ|; !Z!h _-"_.i 1OUqzMHn ѿwKg/%\͐8{LzJ' }ۙm"x3(M5(&ؠNy&lĉy k|aM<0b+Z!5-]1-G© v;0Iagk|D G;5PSײ_!a$v{a*khw[]PC+/D)Pn7iHAa1ina?,2my|~K9h 'edj8_QS]K" ]I1pڬߍ[[K~JNy{LB@W ⸆+a(?B4ul=ȽwǫCckBeR-R9WImׄz0۵L>07\302eKQ ?M)y3ZepE(옻; Ibg"9͊C=whye'$ 1o:JC]m=m.lnW3/c y'|'Y!8(qn-T٬.@5t$$OsDBǺ7TP-Z%2D:>g1"s.{5/݃Hë@&: ~'}~3;ԙsC,)VI;DxbonB>'}u3H.?N^3<]<<  Оzn:# fv6T9E}<("6Cҥ }a`WQ_ݰeKv3guu+/gXa\yA'Vkȣ<7g}VWOp\K@ N-25 N*W%rʀ6@Vn^ n( p3(坕zLQX7(/k9{`LYn=+m)Oe5$]ʫJ[#!(NkhBP8Ξg\##d8."97*Cſ5s=##3&VoL<5 B;Y"}5L)5R &U HBRbEC9=b?8>" "p7Nصoq#}xf+VF{@` My܀/Xzו.LF4/ `,!9?F7p)TńzqΨ'1=p"Bj&-G܃\[GGc6E{<"h%qCɋ~ [VPrnvpC܄IPH"/Gfu5-fxP 7|BY??}Mړ u(xPyBvV ¨uP`9/bPa]myrx$,!¶죲k])QQmuγua\:t$.NCFmovӮG:GWWS:$;gش;QF,pB>J֢vaz+-.w~mxފi,7j1z6׹;q%.=oPEN3\U*G~u߮T~0[5*Ɏd"c dX&mzH,2! Tf ~q0=Aq]%!&(HtցCه֞Q k֧n2ӫ*mc3j7xI7)k~ +.Ik*Br٩(JG\&َ2 Z0x6WEOK7ɁY(!çj'ѿHb2zЃg4DA.=/mbbqÄGZ6]CZy_&|a]8UEw;>58+VTbqػ.d`oCqs؁h%kFʍT@oA,S},qRlzY0YzI3G/L><wag Nl)TAޞ?a&i ߳濳hx#?/V`UL(MzfΊp}ܷԶBB^XS_2V k;|]'1:gƼ.h|i}54@ 5܏©/G^z J sN1ldJ c< /4UE-VН5>N9.ɹ Lew2)rY ּ1w^;a4{edmvoH˴ zt́qfח {=R KWb&⢇BWA^RɩUᗹ)@BH,ԢG&k$[s|(ā' S5|ݑǝ3iK= QG @qRXaKfdjcUIZ0LG"$~>3{aua UnYꔪ)X+y}LѪ}N&5?uOVJ&fs%EF* gczl .F'`.xӫR_3̃6PxL}o<Ę0%x85aW[)̟53P`xU.+CRυ.VQHwG>ɬbʔ^[j[  @;%p@PiŠ,9DxYPQD*`B߭}4ڷXuIB3V zըD-M䳨)S&t&ضGl-Fe&(P!JOd 1rK8KTeb0DBGSTP䗀9'ത qrL)&1hytJl8 j. ]tYN4LiMRL%[Ӊ:v1,__mZٓKh$Mr+1W,X2m2"#Fn.}ʩ+/o't8B(=vc&9$Q7!.X=&[`~.8xБ.H?ݰ0gWhs;nTJ?B̚f~bVe lhҀ~ npm'1wljf%5Łq[{h'4U9M=U\!hU.F~$vIfȪ5?ʏgf?kvrDy=?5LٚRߨwwR+ZPSs\V]At m@;Z3,bz+WNU%'@.5օƙ9Gt\h3L;zDU~{0mbgY֞ցxY442 T_zDj֖Ay2oo'Ȅ2ah*wX#Tf]`#ӎDEX;!ʼnDj>w>DEY?yv; 5R%'?B(f_ԣCM-%xADKwH#y)( _ e7#d݄')lOhpt'W~\h$\Rwjmi ʔ@8vbB-EoFx,t+ĥGQ$O*^1vM8HP{z*Ji P3oU]~Llb gFb QiS/GeP7M2RiQX+ZSL1n mը׶ѩ0xпGE7EVV"-ynyYӜ+ςyk S%t9 vyd]u#CFH:Q& lyed?ng3 j1mia+|_ՉBuprݬM&? wrÕ5Dxff%չmHDTZp%j\HsBEhdtյST11;oV䓃 (Eq,TXRʑg( R)@#/: Z T*ƭpb 3Rwd< HPɗ-NhGz_ok~hgBXiM ql$mѹ1> &h]Y!ϯ9SJxr64n$=8kӤGE\]Kܻr >dkqqtjXm6C2kz0)?? YcM=qڏ)`CṯleTiv6▀7. 8t`O:ZsQ.j $wp6m9 ȋ5,Kdŕ.Z1SCd;#z 3xu,W?hmA 91[͌ jK0齥wjIGLhRjM^}aSU&Q'U@ď|0cř;7!-C;-EoM<|G0pCe<*$/a#B?O*rDZ^v"? ]ivJ~7[ܳ u. BD$kpU唾\TOvBz7fA'{yhP~ l,l]{5oS:'{ ed[;Ӣ}s(un3^EMіYp# WeT črw[LapvtU؇S[+T|9`TS*ԈCZP'`s|0H آs=k&-R}>V4?x;aEk$.R?܋R@?yVd,zmiw8u{'fekMi>;l &kEaBK<>9ΕL.o̲sDʝG!sS1n[9 *4e Q}VsY \O# [(~4oH~ 08N&Eeg)YIE {sOWW8~eٲ#Xc9wTإq!Ck",*="i; 7(oȽ݂2'$BcoxWpVjL΢QW:oBN^i|w ~ι^gp 4Y4Bmדt/F^sPj}Wu쿊@[4U'Y0sq"grEǦ3xI ",VS7*\Q՛ND& &#: Rkj54eA&Bo IBq;{H^E{@#WAoY6ï-&; q^jZၘbcW^O(x86eI4syi @@ U:`V! 0.ICšC"a9fv_owEdYl]%_ׁ֞Ey蒇9oMg;yb}'c2"ZzRs*B?onQW/։6J/SSW㻣^ h/hJ~)Z *.I [-B sۚ2nSŊ1p@jR"LP&A~eNqp}+;E}>֖}C>C%"G0Vi׏Mni6weVT 'KA2tM}~徑S.[$=B ΋o׫3no z -Ypfj!:&zqbb3r Y51 g46V\㶢lځGcd C  "3+98-c ^dE&n.6H ĄEp 8LRIZ ܹGWAI=s9ẠOnGdoɞy@T|49?J_C8_oH&K-F0?; ĢӒsM\Gv>RǨfT;Fhf@2)I6_#SAqQgՅNհ:l%kJi[+%3,o{ta?w18xz)>zSż袙xvzL%~]$cqش $!Z\csm$`A;Ni4oV&x9#[\wfE8MIn8|Dd:<G4j_f^# wUzȷ&|L$Q&ҵMs~^f$ɞ<}&--FښWi@XU#,F0'OOB'<q^Ɉ@VKC1re c`LrG* G5.-͡_L&hh9!3(%-^\|*^#ǤG- E _)M=a(Us%Ӻwh}W2U#7a'GYsOL:~'>r?358I)ycQuf~(!fug3 /z%b"OI'Mj[+vQy[aU9(X 6z+PBj¬gmcS)aF|EmtM#5i`sOGq !:I~BpjnlI(\~TB.bbuF%E%3m75i"v@e{R3d-,ס%V7P_jߣ|VDݩcj̙|>N?5F];{FEȽW[h2G_JO04 Ƨvs+mi0Z~TH @,]`j0>}0}7e< RKg D8p^E9c28YSӳP?1 ȿu w7pP\޾a9[5H ]P~jR`*X(Mqq08+AZ 6Iku^=%!+G6,7$a,쌯ё>\RH:s#&q.a F+"j ^?:n7YLLz> stream xڴctm6fIc۶i0q&m6m4N4FƶOz]w͚qnDI^(a rgf`+Y蕁fֆ&&6xrrQ-H t2(;[01qÓ$ ;h0r U*ÿ%[G'z#Cw2]Dm,̝`鏷@`203l]ߕ*[hnhm 55j**IeE5%j*vv"&IVPj*>UwftwOw?ªZJ̌`-nj`kW#+_T-VWaA&t2OWr@#ߠ{)ߝN"^?168/_9%%9 2::9;{M(&:;8!O_iI]d֞ކ1C濏ml rptr;"`ja O,@%UTD/o^_ 8l!ؼvS>1:9:3ٺş @?X[6 {!{0+k+߱Ndlkb2s  g>&@uzw9;yLm4(G ` ``T`T `Kdw4pnn/=9:6aރ;Z`t7j)-s77.onҟk}cwq_%89Z5,LDM}Y~ugcaгpaff/_㿯ο})@~q֘72[Hxd997I%LX'`_EO?X<u5jж>h:Z@_y'C|錶6"(whohWɟtV\~17c:X-u/Lv9=`F /|_o.8K+Lk5d(=b Oo97R4Ghb)/#d6 ѫV M< P"HS2\Jk# >Ʊph0תu 5~sg uX8F,t:% 3Z ѪYA{4aJX|<ԡGUJ ؒDe(MS!az: YX`>8 c^xDҔ)tRZ+ 0dZyQJgJJt4 4N6 w"g]Sm4V )xXvX(\!JG(XsEEIS^%G8.f6l_Q'[;|" g gzuprB[T:p5]U:K{&:?R>5篿H>Dt5PJ-űe@͋09[x#d{N |^WCs{u~9W| 8pt4 Ji-}.`lS8<ȯo^P_dQ}ҿF+(s^ٵڔGf e,gHpL^(8T g^m'UOK֨XTqw7 й}$c]@{}i'rt7+zN,ԒNzmi`9d ]ڈ0i%!ZňwYp:qCXepqz ih!+WE3ksi φAgQ Gi,>2?H~wu>pVVSS?#R>.=h I}<)J. RCh?1}G Xҗ/S4_Ɋ1O}/ι13E~Q U>DB[.X:LĊX'yX$b}Kg.}uc#RDXA9}2\>&Ӯ_Z"<1He˴pm8\E WZ@'1LM0̤ u{ `9iF )WLp"jo*qO;?/AM뺃GWyKֻMF(veAI/ʿ3^، ]3fj)شz|Q?M%5B^'t-zn8 ʩ#.,+^(uf*O)xoP2qӫ׀պ3%dMgG#yd`6܈!3:g%`Vj$ZUvF-V%-)K)M~1j_ f8$u7( zBehnFbƨt(E;ȑYt; ԡ>"E%IL *6)s41I5$zزDosٲבȔA7xlLR!F5,ƧjA6Baزa4Ցvx!䏅ڃ,C/H0,z"ȉ#7ᥐ4F9Heog1"HEj;2u| b/N,VN3rPMb%T&r((n3l](}ML/O 60@zT+q#˫JAh y}>bq88$ֹMY7AloQ=xOIc^3`eB<]Ţ#G(R;tr{Q؟Ϲ^a^nч+ fK u_k2 7~.IlDNm :Lj?/\ɡU(9&mAgc}]:C*a!oQxHB*)J>)mt37tWǏ 0ZA?isL]1xv8Irm;ɩl&{J~bI&!,f~{zMX36/9+nP9a߷~'M)vG >)]QUyQ:+y3sE˄TmN+sKCˢcB{Rߠ'?`WxFA,~%cPoS_v2Y Vg;)maϳG7$ۏ<\5z WTHNg1QhEgp9Dɋ =8Ww.5kYЈhOKl*"mE hAmv uYjT.ӀʀYA (yj*a1۰'/ 7cSZl !5ak\ƨk-}-l$k Z9_tC_1Im4Kʔb9YxCQJ|M-;ib:5Gnd;jv`"-e.H0lU1GRmBd!K@񊕾:=E,y_`Mn`ͫ?꫇rÔ*HFfK9b#,"mkGY|SweK%+rWuC͜u(bQ]3U}G,9vW k8`lhou ̝;]j+ ʘOkOV(\Ke h} ^IQڍH o_ <6`F.EiɅu,ٝXTu#d?jfe-F-:UUk,TݜÄ`Bz>SgmIgdb)\N%tr Bt*oW{1=) ('5|ֱؿxb驈u1f]/H徹cskx3XtdVw*j[Jԑ 'ͱ+EzO-ӂ^qQdž7b*J<^A4["Lհ3_+0.w=: kpJGV߂p|13q<( {T5'^H>Oú/~)R$g?[0l_Suax;#dkwX݈?((Us$m] `fU :嵵 CCᐒIS+ǵ^UT{U!{+Rc(C9*) V~ƈoLdVʊGܼ\ v!1B e nlNIƹG#^>^b3EtƧL b1;NUMX]Zx=S悖DSHxE8 o$>Dt?a?tonًza2K`cQloU*X|' h_<$y * q˯P&/J|p6H7d#%4y1so o B:>gM{;>üU]5K?[+VfctHGY`nv<%?{Rw$ ȗp` lQDR.lpq&˝WQo|`_y g}w}Ae)ZeZW*17hTP6|=@C*\tUTk:/iٍQ*QP|ؠOn\W6[N*a{KaVEJę[FzHb/XLmYO5-Blv]h] UD: ,N#2}KnF'}) %B'Wzbtq5Y\/yI/ >n2[֠vVӢEۛ ~lICr(Sw_"ovEP>W$ SQ'Lh"Ynozs(ԦSYHH4PCUy2<̗K vg_7IgV\`Q( <6QbO:Oj>6AKiBkͦn䁪Z,sc+KN00o0pic%tVі`]F&%%0 K>Z)/ewykIjjKrA !RJq>ׁi*> 2EMcdd >j,~r2d&nPYi:f%p,BfoJ|x]>η-ϒcgpBF Wpvw DYXA  M|[QM@KKȰQ|r1,饪$nO^5|=Fu:J?NqOҿ]0%, rA3%^RuY }ÔƆY,}eZsY #jf{ɬf }ON;#ج)N۠fT5k{[_rWX5A MXWn#QcĊ UTkΫoI&%O!8aԉ/3?me>:tPRG|!jPYs+!- ?fPA3_Vsy͟Ëw_ZPpWt- cuDD3| ZpDոwD gpgBc2R,1,) ]hGl5 .yoՉz +@̕l.xaP'H\^cy֕Jj<L Aj=(Tͯn&Q䐜YxhcUo#'&ɪ}]t*x}F=vowmz(Q53*_6qmq)ز=c|I]{:xW~װʺsd!Y]O3!"ÝI_٧fI~VWu|ť*족_ڪ7yf9}tUeˆTe*HAmPdo#GSnܑnvֲBUNR]XwJ7(JNmō:@㥀7Wi(~ҀQ]/,Iva` $cXvG;85"7m̅$aZh/ A>S1Kd~X6;3ɮꄕ(pkwKt*ZM@0:&p&ܩ.؟t ʕCYI>i'Y7.(V -cg;M'Q)RHOxhD` -.)X+9{.:Zv~!c?>]Ebz0l8ƏQ׷v0| 'Jc>+ HV=w"{ e˜g ZwW4MTfᗣ"w?d4f5ސ kl %, ١`1]3y~I#z1%Flm+wMVs=[ʑrRUq@/Gn,!$S@Ve5.\/A<@tu;!dިg +y sdMiuP{M [ir}4T=eɯ[H`zY[3߯\gܟ,m/\M:GH= yn?|)ղ:$d]^յcM-o4;!zt5#'&TA5זdz[bA&Ȕ)9RgJ #G TC4Il2(Bk޽$;/f:UQ;rkZ?\]eC 乍'GFBD!E5 y2p:;ӉVq&=zYZ9li̸Ml`.$8|FL{yj3j(̓_#2y/mvW@eyd3F 馰JGZiaN` q{$6򂯥)!)5#2n(/B\/GQύmrdL*W]Ii I{|Ԉ/B^UC &=2[g7֛Slq83%Uq@yVEoOP`*} ɦX5㎸J}Z@ԜXUqr *U|яrZф6i>M~_8Ø%ce}ҞQF@'w];4l٫!z//W#&sTv|q3[d;v^#HR(Oq*%(rS`_鼭AzN;\36+ ~C@kFV#;Egk\ѵ^4劆19- ~u~%:tE!a=V@>,Vژ4HA(e_}6hWɥN>BD1.޺$Oʪi0FnK9i ? c~B X'])stJ}#1)^Bކ*SIl;fRVK_tVN[#ty̨j6 :mTc!zGk{%2ED)4 haaGTJc>-eݬjf1r#?ljӁ78 'DGjc8DIE1Y*bIhy#"1v=[C{<^ C m ٖ?nR&~rLq|$gUN<Ֆ%|=Sl[F&+f{W H}ؑB[x5d=*T.¤gB'>g26ڴ0X=?hk[\ _lДs@/LèJ7mnɢuZ5 kA' eQپ8^?9njn<.C~ 4nXoa]di5Y0QBFZe+PZ>ܖԦ'{ [u1ZI`# TO:jSzx ٞس -A`4CjqVVe[89Jq]4v40Khɏ7P04eKVL/.72I[!~ Tm]*c=fj'Jy%f @|7ԘX(լXPD/h D`k gJxDl_ 3J$aRr )*nb5qO ]21lyH>:Ȋ`?YFHJS6_z2z*@dK(1Þ/i)?B鼱.($-Hq:ܫ/-ĴF2Dc퉨 5VU+;Г?kJ9遮ٟhX9#LƮ_ rf ]c[|eg2\_R`0+Mp?R~.'$M꧛N=G1kU+^IvSIÍC /!)JmSW|CJZ/ U*V=%1U 1Vj٥Z@@84~ M+47ߒ@"QhP[Qۂr%O~ C3&)q5%FhFO 8ع\hyV,d r"K( ~.kh|ؤk%>B1, \,3oWeq3,놳5|۩1嫿$Tԑ!֊vvj ,Ɍ8oZi O۝’qS6v:!\%:շ9z= cP&%zϻ~ӕ?=+m du!-R֟Fc oXi% džbl̪S~V_#|iuCɽޠ??~Y*r;jѐS'A+ll#yH솷Anz$L_Sd#%d\V'UУů7Lw3 =ked%X ;YZKt_nP?{AdTգI>*G59Gt^LZ= :/LYd46B(V75׉4u jg6GTHS}#4hYezy>Y}8W!uL/XA@v239RE{Ȕ?Uu)4ٙ+w=ºzb9P24Y{uF\-ߐT˵KopxZU^LwєbUPqz;F'`!y8r&\ĎNڰB#0*(.>e,8&4/?; 'afvH2TKSa;E e='SYj7}/YcDk8U'߂!rOiU۾dqeAOLn y&glڗw̭dIiXzR6󸯩ë]Jp8kaʞ}0R3/MZC2D#vՇU$X~QB8$p2g`oM ַ장-3":TWCmPS#^o<9yv;7p\x7b"7/&oǸHtn" %Ab|ٷ̢7KB{ 2x0˝1K'Qsh ~:}-umĜV`zN<7{G-WiBMePM!Zpy#lsY\lds(P{D7Al-',xޤXLlkn ⤵%]0slu߱mo+gFc@w5Qvtțms~xd .KB7n8b6)~` -i`M 3U0b$IxTt=RQoQ|vݥR>Q7S*kCx2fL]aIyIhd2*XUe/;8*ث9Vg*TTQ%;6IhOvJk*Pg?`XW5r2rUb7yUxKC3GSC~sb=o&hDy3`9>Yɹu[ȏ~?[siH Nuo~52C]sQP~p4>y}Yw6_@m52 +W$R{`W ZoLE k` '9}v>޷X)g'7m\A{CPeCR 6u9E\_8QKF*#_c ac3Ct :&Xi{@7CZ5#7⺒ ?%)ƈLxSXe"ڞs괫BɩPU B(L X/IYoL7/lQqb,^S7JD&6i zfhz7r%ZWuZ@QC[.Zyh%9$B{蜙'~w0桷ȤVe?C9px)lI<2F`AT>t!l Lts5)EpFx=æG]DL;!Yb;U^AL+y,wO* 13{gCUEi*@V{ѬV:pR{uK2K*\3 )n h_y=drՏ%cCR3[Zy`'yX饱##e@.H>2La2㞱؅qδ>Fޫ>zкiڼy xFFZ6`@fO fj|-/ [b³zO/iK3"yrpz J҈]F2j^e^2?]7~N5Њ#XVI gUSfA`PE#tՇ05c`#e)sWl1͂62¹ gʽ,# ũǫehޓ*}7h&V>kP|R*wXrwlP@;O.:wJ24,~WQ 5l S. `q'>^a7t6zjR8&#͏k}+i?C׳|k22h²7˝Mx0 1,ym6A&0X#T;dM9M1mZY+LQ5Ipe[)+i٥vO 2q,<mu>BV6ɟ\)f/iBkD͏ftCJpϴM"q- .u@F¢\m.T> L{D>\?6k)r /Ez6քd90TpveH<]XfbsVpnyoYtxiu> +w}D׵MnB@SsV2jt q;Wy|;F"aCPciIg2EceStWTBD(u߭/vш}\]%NjiB^G6pn ة;h\, M5h%> ӯ7q^%|ta#XÔz2<L^g su#-+D}LX~mߟW 1h8y&UL:!n+,82na2 wLsl]鴢XǏ\Z[e֭"5[W,ec:ǖld

n(gbV \M' miU!6|(=m4^ O3\5v0.p>i:ec'PlT븈%aqeQ :r Ici7Ego ]|ж:)DŽ$ qq SI_3Hjˉښ(Ҏ5γbz(QŤS/#:ٖ#ʦ f[i_fB!WР2 st?5Qw\̍UJ6!xg#v><"?r_7Zu1" KaSF,A]U\rX$u㘜;jk7Vg/p0A k WnoJObi|iUXq?8Z*rƎ1`F\yd] ,NIl4! %Z_H4_O~gƅn TĘV5u~<%lܚ'8y`>1`EN劊z 0` zR;\e1oS[Vr}G0oQ+Ou0׵7~Cx: d}3%&H yc\q^2қX"m6=" yW߾>G Z ^&۠lЙ2c9uG߫v6+wݜgF5ce(@1bD"]+ۣLcԩm+;o>YԒʯB7pד@?KhV0GMU]Ѧ2]ťحV5ӌQw${__ċW(fbE-e2# f;6p1 ^-#V*Ag pH W-Zݣ_ W2JB (ٜjY;j~zPSn}"_'Ov k =x+*?ڈ~.NdK')P;Z'5"<V1M\-1;_: 2.MHK7Ԍ߶EV,2_ln`VHv"ͥX;9irI t,xe.чu4K' 啗.:+@NݍZPӿ/O#AJX-><]a4fa},KzpN-ya}Rg]M(u>xT?DړiF?w` ^:ε\ʣ˧NJx\6թʘI!{@1 h#dPo6>:^ǂ}`Y>}׮SWOtͥ<#ru{ Nu/;Gf܂dUiYpǡaF$P"=Y=6tvY@Yo65d dv͈~+2gצ\RH-n,W@yIX+QXuj4B8م<$=8GA1PU/d@e@ioPHes]R7-i'- 7#[<zqR(@Sޓ$0Fı?/æ _˯%G:]zA1ˢʱ^dKS {od2$$hZ?iEg#z]D,ay#gU8 8Bu .cuR~t<46?ea9f([28̆1݃ԑ,oZѯ{!.\t5fg*!k2h#ugn̦*fguRO*^ɂYV7iun&nP3"m(3MTĀ=/Ok*F&j"GT8 :"~GrwΑquqxɢS%1LdrO *D#{GX$5%are6sÝ\`8F@5pjZ!:%9+qy3Ü9& ڰZ@mU x1!>5. CÇ݋;x`.™ic~6,uRrƻݗ-jg\?da\3uX#wSl3'PhAʾGH;{$crpWgMK~aVYT=No_)^?7 ?,pv3+zbq#S:&H)ej;^1y<_4v!ppKCrd9>9/46 j7!G <KQw]yNФJFRtlVyX7ZjHm/n..MOiH#1e FB@5rWL|"j䕨rF5T>Pڷ 4Pڳ aQI~ILpRYYΤh\QxWFƜbd)طv' M/O)8Hdfˀ|&`/'vf %)sMSqֵS]@NYR`粽 yuhw^ FwމE)T|(I@ʋ9yBf>8Ul BVQFdJאf+< #lǁ@%dB'CZй?F/3t!lD7s+AX9˜|.LX\̅NIˋmj03/?lZ]/q4cqB\W1ϰ9:bvKh-8U%F*#R:5CS -zǘ/ yd{OR/Q9ߧz< 0i9v#Iۜ]8V <4<;] @`}Bx*Q1?jݍp_R+ANsXcR`dtx됛u 7WWZd9O^n Ƅ1\Ϙico&砎owrua"hMIz~.'7Ԅbg/{Dr8Qjx7S\84M~#8U$|P ìq.׍ڃ7VNJM2u_= ’9yJʀOݙTVuCwrjiAu66ݘ?N5c"lS}s+Nc31tg5=.eK p:Bb=25cN9G<B(8ES-gGQSqTs^(*q[Kfl%H${V(x$NA2 ̳.xY'3sq.>JzJ=g]{y 9O8s!=2!6<F Jd #%tdA2!k.ݓ֛8EӰ n)WNB+64Ns'vP_6z_:g`\e\sQGSni]UJ#V3 vTN`_z^:CIQ9 ̓u99ZãjR/^S?7j(A\/XLE7nF%riHh杗DJxsr ih -ng[~ k h3 @pфOi.\ m 2`s ,wGQ5~gF (FttY?,A8NQF;i*KY9zSEŽ6"0Nlf>/-~orů/l;Վ(g8V}z,/W$N|eQ %͢zm I\^3$!|,i pxa#^&Xu}G4Y}%-E~׻zVnh]E>G#pk%vByeYQ|ZB f.jB`A#MsA7q""r'd=ZD#P?"XJ5w2XYBA-Ù22C"+Oy) Nh g.xr|˺!|]M绒, fz A 请'v^\> stream xڴePڶ5JAwwCn!xp]]#{s>~_uk1WWW59 )(sgf`)l9镁.6F&&68rrG%Nt(8[01qÑ$v@w) t6R2 'gzc#w5H"p4pO? i#k%  -T ;1 25j*b* e5Ej*. EDEUM *$*$TT7ȫy7.'*( f+O2K{w5s@el`r4g>U K';v:[g*YK8o{+ߝ[{#ĴG #|eeFv@;#;wCg#g'_'ДG?9r4*]~2]/#?z69Y:9;0, K˾ώ^;gw翬p1L$3ھW}}r9z0_b[ہ 3K;S?7ugTtpJ2s3 tM,$/̌l>f78/'#W O"8fN;Rvf JP{j Ag+- l-mDjV杻 @_wZX_wOFM9Q!!KL@vv;X^6E#`09(;Qo`_ `70/b0*GQ_ `47zio `4_ `G5|/=!3==? =?ٜ YCys&C /jXYD]}[}^x ܽ٘ޙ`fesxgL̟Prj/,NL -ӘGf-.pY{8P i/mJׁ:rS16S$ߊ5~$3  @ʀba*"wdC'1'q]y۴cمgٞP:lC71͹-C ={/}R|;AKbI7AZG\{M"AH:6wKV[sMo8,Nh|O( 4(LkG/5ĕ%q oN6e ˾&ipgĊJ[RB5bkۖp4YK*15zdZ R} :nLeM.RvN#lT5uUX P,j/T9HoiCޭ>} =ځ5ѽ*d)ҵAO =,6xLCS&(wyEV֔덻g*X<љI;8Օ81Yh¡ 5=&4 b>eYs2i**]/g9;w0 +lF]NGQ3ܻ(ꛒ)AE0B+зҰ%Dcfaϭ4'U nSiGi 뇚ϛIHgsXXl\ g:^$⭪X2o(*IGk&'> ]Ț)>[coOM_Koڹ1?wQuk_65iuv3-Xƫ„7ȷ^O?d6!F`H0!:wOJ<`ҘIuۜnP'FzѠ-ogn[ c5=cM$8apMy <,56)0U ^%xedgAF;3؅;y wCNRP)jyvWGwWnlXWáe$(zn4B va?|YЙjCc$ٞܵajGJ3a 'bƖ#q|Z#LV ] ,smbj/$'_. k7k\^ NPA&Վ]A7Sb7$ o 遥չCF0#} GKj+p8+UH3] jE)dh!1 Ѐ,}|3ΑzL]ԹyTIMO:8>A9y$OgSD8;@RȅS,@[rM(E[]*5x>Y&ﱏF a,Wخ AxjcWGZr>-XgZBObO&Yht r\)m^v)NTұqc((;l GWMM}_6Eޘff:m&ݰ-:kƞ0bG $Դ_& lzR)Be|Kp4 iixo/WAZg?Dr[l~i}_}Y]{$ÅMZ¤LY_r;Qc@R~ݥ)suR{<)Tn,Y_M\8=ʒ9|2ZY}䳸ķ/p~BʊKqH )X;Kbx^E^ <4WC:[7 ?-gA^:1S!ۑ^Lg X6+ "B(/Uq^4Qn3TNđ#[H,Sd:9?94 u~C@ sq2g*  Lހ(R96M~5=ǜ;t.*6*|ʬwF.{,ifu9tU'!$THR~ ^^)̾"(kq.]yKRVFs8\-[24!Bv߼nmϟbnN&']*UV[URiQriY梨roJ/~^rt#;<ă\UKj}a(ݜ`cq{pccArD{/feXW߉+b?1@#ߨq8RW%gvF&<}%:6oc4>.U߯5+ V/q1Dq{ѵ[0or_B‰Qv>5##="nL5I2aE9}/q &BF]Sd{= n0t)IL_\UuUJ_i'?ϻ(5J$G"/hY~䥝mڲdm,*Jo#UZ esrc əZ5 28C/% []`|7FYco_;*]PlƋE1d؈Z!i$"Vut;Wfh-t$/6iGDgFO̗RxzFx\dW}+S0sdHJg ϾehxQJwhQYX2a5G~-O#a8n( * amN e]A"ZdpC5pFE3s k=O>Ħ4(L` # hGa5yp"M2~؈QaD1oܨ=CG+>t}%0afcArS{[71lJv/D &xԮ՘bx}j^cv-(,8]f$%Q x>N">k-ςE 3"h 'n(\Yy)J]|s`MgI&u('ՌJ7܉8*X̷:f2 ꦑNgsmob(<ɂKp uU/-@a(Ake\5DetK4g :d0%/*.~"~gO Ywµm(>VL[^f:d@N |F KH~Ng#ֶYiʪs E@b*;O>iwoQ ]4#t@ w$P=4_Yi'DP쫊D[%[ df ?Y82b_š݌Xw ZڙW^?9Fh`8Ұc9+Q8=@񝹫'Re[uUTv |ı`Zx;1ƃP*<{!Ma~6YsN %1D<-n5,4䄕zca4z^I(g*ٝpJ%$CsRS &r P;AuIq(b\P7ڕU0磷A^ Ln;ے/]2)4 (TNj{fRҖ4Ꞧ4PPH3#9ۢaLIUZ??iu:!1@I(n2"υ}ݖڰi_ ߲,}eYRz$8Eq@gxI|tgnR"bH2(1,dxz䋴5LYٻZ%Q ;jmx.[W5HA-B ]Qa #mty7^08.X. 6 [rylN1VvE]8X]q{ l3"w^YIϷ1W`ۊW)Gѐ1 0.1cjZB76J1ޔyj"6L6 6bBzEDl7uLkhnxXi Ba+:pEpd ?̍aW.’ *P~~@qEtaMIIIqfT⃝v)S $*SŔ*QMM7D툓{3IV ~aA?,د.H59 $j6p͔QVN`mj@Ǭ0A-3vdso#{#ۈTY(uCZ]5dܖ|OSZKcLj-~dJasl5bbnSD*cBl7Y\lؠ5 L,Wΰ UMĄġ%)Oޏ鴰xGڷ*H|>P?f X' K[ qd!YJA*DɘIELꍬŎ`,;!?VKm6/!?J񶟐նW`'D]m`s%]|>fQ KbA":'d[Ųc0#qYxi=C'Ƀˠa03 6IP>ܠDqD}\}09"1:[&;QtVȽhl"<}yTӞdEvExa[ @Fϖc3s1s|bƋь޴T/QD2%xZK<7ٸ`"-K{x.zQ~t}\)ZYYmO0NVL$BZYI)O"D,u/f_ —&?uYA ~,hʓ_̝Pr;࣍קT81)Y-eS#OP3c/uBXzyotjD<_~˚=V4*IMg3p/%.h+UnҀ|xA2:y Rޘ*eٞ1nI.f,6v0k†6SFU8=h2Bl”$vܳԾ-M%ޔ@Hvݳ'  "rms1rLD#;Q01ѣ* }gk~[ r81"_E[h, ;{?"/P (_&?_CeV:DR), &$<0VCW?IpctXG2rQDDq )bauxjts[ĚO6D|r:z'F`E=BuXmE#pzu᷍_qg9 CDzPɊwĀ%ǔ=154r.U|[ }^p$+Ae 7ӯ]lw'uKCz']e49R.f]vQ$Ng@[pk[!~6-fG#.g TRW7'~=N398˜<$nQb `T8:RԁI![ֺޕ 6!q}R\i|Q8qVBn$g=TrwPHa@_^0d(^hLwU܊3.>,B ΍4`Bj^Slhg^\iur[t.tzDjj%fh#ވZ9Y\,_MqU W>|_(-MXr=mpdUfwcj} %;N}{:Qt*!Z6ˋ' pk|";ZJbSڣTOLBIN\yу@aa|x.kztk,Ձvf$u?XIcJ}%T"i1zJ 28%wOAxFI^9|l~0@Anlz^N2%Iegoq/*wzX-|2wAe/]y+jNo.2y qp`.*sBؼ8_GNH k XAmq7`;n 'Gc"|9ik^0Lv0b4St;fJC|JYXW$pT!x{>k ɻ',֒wYbFЋr͙h}V*l|yGWOSiZs~6k$qÓ4"yAs&6;p'fK=7Ĉ:cɹc$? Ű<,wdH!{"P<iPpz]#!MLN[Tg͸Pxxila~$ש! x 9K 3zx &/ H\ 6p"%T2~dK*#)ݼk',~x: *1nYyq%'I7OAHYe$4\L}My ]rg2=kno-;*Z X9:/T!P yQ1IĜ@H4;sǵjWR1u=4F: Ԕ_J?!Cʨ(#AtH}bCK&:ɐ(5_i^Ib"̗r,Ñw5Ȥ 8a%eP8zjN̝:b{8f`~'ʊ}ID{e at#{%I%]ŌGfC}mR828Fŗfzl)WH egᩑ%G4@!Sx9*;,NxLjC޸L[ Q{cFOMQ1FJX(5+9NCkbB5ɯGrt&t҆[KSeL#MQˌ]$GV.j 񪾘BMG} Ebv`sfʳu\C\,I j+ GhN IA`Q̌ވ )S@Wl~Qr(0LC/{~Ra:PKeFƸGݍkHj$⑟S^Ĝ!/uJ sj6Le~ |lœ3C()B >+Wc,-=Əl8<^?Ă30俔 DjH![em-c'N0Adg1MXcTYI8"N y$.fj6=lfbaSH.+kvЕb&46:Cn_O$loŒbZޛ)݂OsvsK90 gf5[9 "ohMx>T;[^Z3Oת Um- f9HiRd *`Ve%I \nG"v!@fWNAqXXiAcNɺbѾf]FFP:' rwc֐))p'_qk4w9~.rsvS6sVjZgMkTdN QiQL:Lm8I gWK ]Nݰ7 ,Tx3N5Wk;ܦX^z(Pr*KoС'm6ৌIuvJGGuvi`y*Hc>RƝf]qWvD׌3sjq==(`Z:gҏIm!;T@ uQ!(K5]zH*,7 mEFl:9Η%CN;Cj؊yԇRs6Nk}y-uOQ9ߔтFUdǢȃ7,ш /S?K-L:XDu?rAxUV50ܤyer/W̵1$[C-b'0, †:~1Rۉo1ܒɖX^Ms<e&=r)qÎEy_.m)Bqj XvF,q(!4''c}'T43@dXRža`q֕cQy|a M%\"GXٍMj:RzAW^EL)2U,G'iwΡ9lq^/ n ]'Y/?>ƇwRDNz56ͧXZU;]mdp':(EEO_%eWi:##*R<W>Gi;Ev2͗}l2!g E7ЀK 2AUvj"'ytFax>"ˢ\d rvю;=t-] =PO&t5Y?y}9WrqYY*EIb"ƌ],"sT|Yl xh2aX4^G:rm.:Ib; mCAABYn9-+EAWn M2:(jHxfWv^ IcWuh{q#}uek9t1fy@C 9(βnQ1k<@Ǵ2o,1xhR){tEPLFTjdpCm7ɽImfpNOIJ^#AO;Na6Z<./T4_ƌ 0 ՙˏXb+,WN^oZdղ_z\ʅ_-BI:;. _c$+cVmYѾv0:3zo_HRw7ij}ot;TSEnw6]|qЬ3v4ZF`XD})~Ϋ9Y֒8ğS7ˌΈ07zK݃GD:yʥB?7)jÔZ5#2GD̐j6'.'MnrUg^,˝(.r-8ݘgJ31?[\^׋7ʜ[;ل|"rq1ě_ôp̣|HY+jy㫗Ey]O''IXo~lޙ Kvr9ݰN{Q"j'5[d }tH>$GQ} ?k^8^ U<^Ba-#: ؎Rnoѽd 4n7]ꘇZVdA #9wO_.Z2C@Pu,K`χ1[H4ѼrwJaOpfTm$p"ɑ\>7;EK%$nPPGũS(cP95(]Vn?nt!Hi56-k, UdIdp6jtjS6v9h&dt4`i\#7j%*kt NK♄Ɨ!8(Aa;RYP0V嘌4DS_FYiSͳ6#۟%tQ9ẓ'`z*B43[)W|wYa*iT/tliiQjKϧNn @`o#g*5i|01EIr>6`3`H.!߈WcڢQF'&8XNtwZKG0Zl?DnڰȼV.gֈ_nBHE OKݟu|^-b rO`ǂrvQ"Mw3AļHġz_}dI6`?jJra(8Ҟe.s9 #a04j4<2)'KnX K|>yw6!6aZ3 aTYcbuJV"z崊)UAM>Ί8grViQԦ{ 9RZb& [>sC;=W2pjģO/q9m9`yg`[5s] Κ0`(;HSԆ)2B^ǎF786#8Vo'.yCˑ W߮r/)6LXs}j(㢺պM6&w+UL!(\~q[oiaJ)AbdNR}N_<)a#M]xU$Zm=$:aSc6#ァ%N&*_PJ-eѰYj>m .kv G-e[+V_.:SѦCzu(b>qa o6!}nk1"?h@_'#>r\}^Фh^H[&r1J ^NѝYr̨ Vr*-|Q^-̳M #Rma[LeR9 M]/00x҂o:Յr"cb Ⱦ7>wt~2h[TSQ!8excᱥHNB 97-KV#uw|N6u FO*ה4(3!׶9~<9WK@o{=XTߋ|t6?LWJLFH[%( l\E=ĈkxI8|LcoI>Na+4x4gV{]G`tu/$ܨ5+BYZC?^Rgc&-Ls$'6H g͵Vv mn0ٶk5V;?{-Ѹy1Ha&ãygj䯥")G2y0oNhKtIWejm*;;uJ'5h8ʵUdyUjoQj7x.mSu0vh!݄%"0  ;ΆIC}BYY0vAe=COeĦ h>8 ).UŔf3\(O:LX$fH*$vVs{D Z^} 1vwߡwI}xGLl+p8щ) Zq*)W$6- ƚh*?nƠlKp2joǓDzG\BK{pz71t{֝+*<?#$)bOF8J VX&v:+VlK7'vL2YzigcE[w6ך) -\t %Mn]?=GԤj0>i 2}d;bjL8Q ~6g/B']PjGRa]6 La/"J3}bkr}Jds͑?vXy52PH|W >kVPMGKkAJNE S?bd \baxI"sqҖj,_Mq>,Ȏ(^ŒENFv[mnqk =RaP6DBl$-j$_)1*FRycBIjzڟdl_a#EGP%+q)-4oqͯWa;O2aaqģt8:\,xCi[oA~Z@hCfXz OdQc/4OVoѢ6댻e޲hhsfwC}*?d#. 0l%a6Bj[^-E*Ǽ}3 1$5_~oz0SZgLBV<*U_/٢*7e &Ɏ [DxV܋8vb>QԠu~L!t>N,Ū Qt/G:և > {ZH7LbaOtV^pئe2a4[luJ럃 Qx)bph7DWoܿN=>q3hBsMc찡~OdTRz8`Vutc,$d*.lV2#6|ASt)`ϭfLB`CO)ai>LS _WB 6|:6XT--UYͮB]=Bfι!̦}G~·mVKU\!\r9(>NL+fS3CYC$cyZk F f^,\׺OmyKS.i+/N&` (g d.3Inh}ŷtTV b×VC<񫽔e_j?cD~3*髶2s><+臋Թ/V 03AF* ղXK Ic[`g2KboXO`k h#l:!lIðsGK$'/mk&" <;PWZL jO:5uݤ,!7{Wy5ή^A󎩮NL(ՃoUa1]Q¾z@2.=W7ؒc-4%[K\Gf v9ng#K;'- ljQ|[ diA`U] ъX?:.>tdCPs|ٰus#F]a0,Y#x yJ#~Y0pka6EKc3Й|c %w;4!kbPi4ol}2Wޱal^@UGe>UU&P {Ϯq+dOo[x$oYM[|*#\wCM?YDhfT[Y>CysuMѼyHJN<'˫B 5~L^&ǁ8tN6 -и b=@U6@r%mro#Pf8 m2m2-TI:qVBu(܅9aZZt}MZđfpG OkA/G>>^^9O^4֪e)W,w\Y;H@P + VwYBM&i9ΎyJĉy=m vf*`ty!ezJL) "՟h`K?QlRfS +B^U̽Ͳa4rڦ Bl 4^) RD*ʳu@uWַ5ţQ$u.IOG?JIIy؊ j#|s|-.C[Ur"١uP䵔0<wԼ'UM<ķ7ۯulK@%n:8Wo/uˆA'@$7+m"4KG;UA N A+u4f&IdҒfTzú&s) 'J⏙Qjo@Xɲ<c涛E 1gla;}{d$R?_;EB)p$5/BI~hxWܖŃD`MM>y2aÉȽo  ֌R[|Vh-`)dy $[Jĥyp8@M&Z[C'w(5h΁0My[ВbXbO{ZޢJYDC vJ p2#x_DJ~IS f]%^G*П99Z W0kJ-$rw#иf3,%1%ʨ{( ԩ{t̗+: ж)?W _r| z+Ԯ=j`تd&.gSy3-KnrC;a|ǜZm9e@ CGBq9&\/'I]VLbo~Nuf:wY}GTR  g"JP!-c;@US99{̑dEiq:*YQDS%XQ|GRk@Tt|7ju&\.T{N%F$GD ܢ{AY^ضB%ia!X uqFc.v01P_ahSO u2BJLMҾ|ݬotyh4q7tݒh<]/c}ԋp+z2 H[ݍtt^pk+J  e!Mq*zOl ;eU9 +faƱ= ɿE='WS[N#bK퀽]ǃφWʉŽŘlNWg%ݟs E~qOvt]W]%{(n)N^ "첽s4OImIzQu. Ρ9Wa MX?0 *#VN HItAk~i&E&.GG ``J>V֌Yد=i}E-QnWQi Kr2Њ=QâeΚLWsn!s ޡ R(և~ٗivHTψ^9Z@d#gyxbPBmK0;ş"VD19Lc%gF ѤpЉ@.3}*8rJHn5woFz GvDElB+Y!*sRq4=+g= }wEh>\_I0qm:nPHL`e55+|Nӷhj?BVF ^uyCw5}]ؕʩru3ZIejH4鄀'ѐg2R C0!)m8g/ccҭ)hTG并+SvȔ{ԅuLbP:(rqt#V0 -'SHxbmú%!բeषǣĸI)Or~W a%]y2¤O0a̰Ө٤.>i34s8D'?nN\?ԃ8SWpzy쏽-_j}.$[mV;t~~ endstream endobj 78 0 obj << /Length1 1920 /Length2 14278 /Length3 0 /Length 15491 /Filter /FlateDecode >> stream xڵeX6Z={q A;{qSܵ[9^ksJCgȓ&Wde@N`fv6̉Yl`k`acBtmANRf`lP8@'` Pʹ: ln:Y:\$Aޮ6?18D-P0y̜, ,,@rm +=@[SZC IX?\$5eR*Z@V[Sϧ鍿5@EM'ϛwei-q-=5iv?gfv;"`eOl)Hkj1+ 2:N,`/_K) x\!v9:vCS>)۷:Aެg@NWnediάN.@y~![f @†O变 g @u3@*!,m-o,Ew1__J 'o% U~rɸ;89mghe CNh_:[7[/--;FZ9d /hZ;\lo/o=C*++-f/3i' 5`j6_ٶz51V'X\t*Ge7XU8FoBV#~ſ;[B@n?[NPoBoߪ|ϖ:쿰&dԵ|ˀmeof y2sq9zvsp_6L] h4 Ko. CrR+^! z)k_`(ZMS R0 H v*}O֖R=ue.m@*->âP!P{v{R;)@{H>c2sO0%-خ^]D]{X~%c }=X;%O1t;lSp_.̚ u2fi0oaE AZ ;F6MF̎c! ɎvT7!,JtGtwi0 mtOiˆs=?L%Vr鬻] `NS>neG^8 ZyԠG9 MɊkV&ڿ:>d(rIi,nhT@5%gxrYUmU՘;pd([0Lo䴊JQ,抢F;`B)sȰ AyH;\ic?˚jc# 7[mqZ]^sG[GBdBaJc^gQ0%tU!!8Κ+fΟ>f$G d;ĎDyHj[?m+s`k+6ƿ>GasK7z|4S"B qhJ%b5t ]ܵ2#*Ƨl$<",Xi?5 d4}qI&q'{OG8PTX>≷q :įKnFuc)>ĹwYi7RJh/r9}!%;_al#0v_l mc4);q.*8.;`rHvgٵ=Ť28!sȆ9:%U-ly|hZʥ.Gt;lQDǛY+.蠅MN8FjN>CrCp; jZ~@+ ^2Ɋɏ_5!EHc0ʕ_D,іa%tʶ&#C"b'ʙb.ާ :e b^iӁE?Hԛ9uz}@Ku# GL(ObاXx⇸K;snS<*qc[.HBW/ؾ~k{[`?~ [SR@]ǩ}*д R߃9vOY4L8nlɷуHKt>p8#9!cDLƹrUxRݵj/@ quag|o9C̴u¾. [w'> ړZg%\p~!DOnM-^wMaB? vǓJOSNq[!"1ʃyFը5j$ L$J5'悾AH%k>Zկr1O$ȟ&yKSge6GEcpx`;M.rlu{5As% v"MFv,KӞ7sc_Y鼝dx3X4R<=?c tvz6 ɱzXyOk6̃GS޻2b woS'W~ nB._tZxϒaks[K~XD)N9_5\S@p Ry#rQ㙇1J5DcۥKeA\y+s麚ASA) f{H"t;b4&66\IK{7 ` {Ǧtoc-Zr'cQ2@Zekn[ ܄P|ϔҴx8H8ٙGvSJݟyE#*yl;<3 1qbt/cұ`ՙG_tu?eλ{$ S7+{XO Ȃ.U:~5B9?$_-[6~X -xȶ+ˊYW\=5_Nҟ܃`yU_#_ QZPg'(+K(D1]I̜E>p#lUFd6}Kطq!џ{:DZ)kv-[KL `l#.cJFeK+Wh^"ͻ+.ꌐWۛl7%&y U,$@+RH 'Anޯ`iXl%ſm!tr;aS*Ow\%#׿W xU?D^X+Έ|/-y֩snE={0Ϥ^DؾGu)( s.2?HCdoB/jS39j.U{7ݸd]0|[$"`63 "%^JM,&uUS_ZCcl kwt|tqKrX8oٯYAȵ3/Kk"(Es¦'\EY?%6v .x7j.yW)b/-n+2ɜ˅2 jF(p (z{)Ҍ_J@ktGf0'e̎5LBnF."uQ}Ա۟Ȣ:ZI&СnGTL Sm*\ Xewڷ[N5e`'lpp_;Z/@s^ Cd\]',o墔3ggo+XsZ*;D{]OFɘPJh$T/aaq] |;KzE~sУ{(}RiO.qKE?5t\R+(v:G9 S\^!_D^jyHٖr??K|f-lYWH8y+qѬ6]8r`W_NXc̫&QW?og%Ӳ"ϳ_i\~Fu!>R3/C2)^Yj ɳgga}E04JdBZs Tms|x7lշ{wS(nӭiiI ;M7fU-1!ӌD6~ $&B,mܭѽJJ8&]箑L,)]t8ΫK;ɕ9]xJ%S6Ndl;gHJ~5J;b3Pb[?J|#y[ρnK6/  qJ䦋K:2+A3''Gm8B}v&MۆzU#{y9x(&ԗ^BWoG[طOz{!Yx({P:E* (MHu/:0W0(sX$J)2̇Wy J;BnHSJ|E4UN4ԭ8DtKIO ~d Q%?iAj}4'5zQ&B j*[ ! 3iT|fwxI뿯aL%{J `7LxS++~۞OXꍘ>,١k}8bn>l5[ P30'9ufMsKHq+ ui-4i )N|UPlKYixǃrIWFj]mɿh<(?eb\^!mS{Dҏec E)EuyKJyo~zL7/a8kdZV‡6/|M5DBfj4~$C-BUG(]!O듿;~$ 0Pʴ@xvFVa@Z&xn ^Q)!3AExrlEոh*Fvy/5?9'蕻/{\O̞K[[j*Ƌ'@59|=nl&LBÌJR]02aVK@5Rܢ]` ģݼg?`_;"˝ƕ\.VC <;Vr)I杰' {ߧ֔hKf،|sjYuWItt]rQ\XN~ [rcPkΫ죜OnEvhl[YV}<ƒb9;uqS!Xy˻-cֲRY4HOb3aNAQ$L;YQ6 'nHqܯٳ#l)_7[hׄ'b`3kiF wᔳ>Y^}{<-&P))}z'3}O;;OYyU2 *Z:EZFj[>,R'o `}ؓ4|G'D5C*.l{]kͫ&G p}~‡}Vz7jYy^=f} }q;>.Q9/ { ]I/YњdHaXyר9<:mj/`Gf# uIr{g:Pnz^㖩a;Z_9V޼>U0rv4OH٢P\ ALPRbr.xX=5_Qtn?jIWG{*m0|l΢qLD'>By?$'[k0@BКK_< U'j.5޶M0u׌e8C(E|Fţ]i^c|ʘ~d?V$!fiYa4]|Z"RkHX4Z5g}NR8Mě "st,9ijsRߑcj@33N\9ܖtCdԐxoB n`4y#p&Ñ~Ԡ,ΛՄNˍC:6^nMH^-,uT00]jλIngۺʹnC<Ѽ4{^N(kVz\0#}ڝqW.P0(FW[Yx'DǏD.G(( B H F4o< ]8EPĻ{2NDmݖ="q_S%oT10o -lMIOliQY:kcS k^+.XCQ=跢>ݒ7\]1GN Z"a.rSb qlIfj=k5Ғx=}ڢV$tdX",:CyY+ۭ]t,dk9QKM7Dz;: EdK$~kF$=cMAP>M\|rǠgib ϑ=bI6k_햫J]A:'6Bwt]7dhsxPm HUc -@sq)qnz"{bPP&#:\ %Y^݀Sv>黼s}*d4dAw uX k|^CE}Mf| ; AD*#E.J`S1{dDSW>H/*b:$5Z{wŻ٧)|Ѡi;t1^nV"mH僮̧'DPVބt'Jm`wCf!M5鞢"0ή T0BCd _aHh\V|S3ee\%l%.d!WU=M\*#{ #L*)Y])eڶ%B8km39,]&q?w(O%A۹+I,7ɊY+3S*< J>I_Ǯ-up3P-7rot'h[''|f M!Bx6XT=-6Ct%L+mEK[3UHNgxoW)#gZ_@qzi\#B6ɽ ;< 5M_Du#Kҝm3Mu깦 l!|fyz# `CuDԲk#x˘y%pTFauhY Qj-%!J</{0dn ~Qױ&!\ ݅3Ʒu.AvQ }IegSЫ2+b;ʧ/@tq ݜL@E{u9 ;HDq28JsZsZUS_ hE:jRXX@# iF;'5'rX<#9ۍ>QFeYл1eВg)KoOW&t2~6m|Y –&d >- g56@Ԣêmal\0/jTG!NQ ̒sW '\o]/zh:$cANʬsyw|v^Kc U4WԬm<=9x Wal (Y1SvW_. V]pp-m" C-ONטaEhb9WB0$ r\=q;$u|̓&MIps,C[fy 5,0y0dFdqy`> ˻vHq"wmffrtexZn_W[7Đϙ;m\Mn:N3V&Gpau]`]-.'לF忣P?=6_ײ !6>ܞL,j3q*-2/WH#ː5xI?%!}bhK$:; %.~% S?H%2Vヵ|^SW3&1rSg eo/s!a;6:]G7z=iѣwR,Ux*$?QOy.(_5sOQʈgs-E JH0lS3nntM<4@b2o ] '2D??G/e@[R mss&& L{[ɺ $űF_P)~ |VlU6(SCQ?kU "y)o4vzAH{eI{5Cͨ^Ƿ!D_ ˴g+5'p 8ICxe{G?WmVYa^ŋjv7$bN,M,9߇*1%o I=CDv9h mz!X\_)VK0־Y!, $]]7YKD_pKV*0SõhQƷA!W;쪟T۔sPo6&rp>QTfchͤ#``[7/p>SMA@ዯ-+yhLFX^ìIMB !?Dlx-*y7݀, 9s"(vGE<h}P(wf̵RWjq} d9%gBR:X:".hlljY}W]Aڸohb.LI E6J%}@|f!/a8|9ZƱD=y~"!!Ak4\nn\ ga y.x JqK)/-BHqvNբW"eN,)KQP:\Ѣ/ [xEq-Gr=QU>zkTk,QD\ tc6Dy+f猪-;.N6@d#7 ߪ/I=)v܋.?k!k[>|D|N'.(t~lNUn3wE8d%~>WSf(D%xI|@J0T?Ul*31砩Vj~g ΅z&ʔq!&yNyNhx gezP`8Ce`OM*`83B 97niT޶a0B8{@A[:(Ң[F/ Vvlʩ Z=dRڎhXd(R&>F*@lk* _`]kqIzNྃdtǎtC[gMeg}i/[~mO}\_*CZ ߫aWlbp1zrG80_af: f 'wC@\DхM3V#Γ[jA'M>@*8axnM$Ex eG4BG-Yh-cÿ`Nv+ZĚs&Se?è VLOXUxffXCVOIkWTSq[@!7Ffy5A1QVǾt7GQx_?;ԐX7SUl`˧e]d{+ oOvm?!}Ms(Gɀ1p&$ >X“/Y[$?=)U>qN Lpꦢ+~,_Ot FCZ< o)mhu{O>`"wƮ7]y;;0Xw=I;IF?~K#izE6/'20Z.Nb>/ǻnRW~\ȫF1Cë{I1Ƅ4fO׹G*KpG̴1(2]+ (M#Â#n ShxLI_,n[В*E"ݾGDٯI#;{XikaFZ |C|!4헰L,^M YZv(? \߯}󚡫梓u?% ҅LJp;9*?1f;d7&~!pqR ՠwi\Oh[mauX@-#^8v@ǿ- 1E7%/GP]}%JTyIK,wR^CnpFhŷqWK@aQ?_Yތr#Sh6b{vW1,ĝz|b5 m:(i ,\G%Y(LШԴD>eHŝ,6s5N8p42s[̵{n xp3NG}+]CioZKX~ ܯW!,V-ay;Z $`Z/Tq^='#q~Ac-B3[GO[whc^xguJ lDQ8ʬICRG{]-e^ BzUbvi / Ƕ 5e4!\-;&Չ7Jrj!z VLbTwܦbyONEGű1OJTlCU ЙrNHI](= ?&A "EK\;XOwoc[ͫ]Ac葡+UWU7 Jl7ڽ,[鈏jCJ;0FR) :i(l5sL-s$et)>J7x4~kr ˳ٶ8/F+=DVH0<Ϧ(u6MB@JMrK2G OE/ ۪yTTتΎ8B|>l˜%Y"*`UZuّN gw`Pۈ?"bKˬN̬h],:7Q/k4g~sJX!DM24=:e'2rQD`߬*|IRP8]b'iracpZ$,-H:s>F}SyuL9.6h|BoAS"3BXQ eD }š,>Hξi8VG e=09kQ'iM(.D) 笠PF2(X5S*ł - .G3Dj8σq!x퍴߿PǏy"?p"f݊EcȿPY@ϴ؀WL{̠PԳ;\aw=x7m?v5X˜|*&l="X$"7.ԍ TJvjL*ۗȍtHlOwu l|;:|i7gɳJ/|H3#)nC{tNA=iV܊09& eovHvdr`][ĕ(C.Ì\S+5]V+pR"=A,jmɥ#6g!Me*pXTed)W$z0R#s+wk:@8sWB~+527DTYW0ʺvSD1#Up_MwٙyJ1Cѷ|y:h6I[$:,YbXhffrkk-cR#:ʥP܏zw$>]1$ÞTGC1(|<94"= % YR*H/Y+%AlPJ3_K\p9p>42nܫgb\lb@]m[q3ی.lX ybݦ/Q^t9 \CV,{e4˵n%V;ɶOXFSHXjh`Ȼ3 5M__4JA0y,KitA Dp#p3TSQ߾V脚^UbPZNP.QdlS;P)Q-lU-v1NƳ_|[PPd1C|!أ|>J{mqC:=$Yja-)0Pi~ iyuSWl3CzCW?5ItySލEQoB?' endstream endobj 80 0 obj << /Length1 1917 /Length2 23516 /Length3 0 /Length 24705 /Filter /FlateDecode >> stream xڴuX>ww-kqw(^wwCqw}}]'ȚYq:gS߶ f=}F_C 8lZVf.7Q0vqcywW4߼EEAތFqs)8kմg~@)Ȕ?:1Wp GH[6j9cO{k-ATV\q2ݬQA(Ψ,CO.}jNR]Qi.J~XeČYUa\y)IɽJ;$="rFcXsZ?,)pЭL|n{ nrU ܠ[UbC0UY^M&YsXrX!-.C3 S3Y=K)(Lx^ RBgEĢ o($BWX1>,lEU }iTi ė6SU& "xd@ctݸC{J\;4|<5cVU[qlQlZa_|.UK38*rŠ\!>ʥ dhLtZys/MiId$~rW__gGEy*gR7jōm #/fjUL]~ny0 mf`XE"3 IoB7#$0s?JLZx>yK\x~vͅmy#Ғ>k8o\Mv\LOPFUv?8,{]"GN HCRدQ`1_&W_,-qUeY~Zٍ)D )\JJ )P@;m xpz(lʼno.|F"£ :[J1Em MeUAqѬ5ƛ=ZˋPϠO┴T| :02+? Ɓ0R=M"Ru{!.<2 6Cؑ%q(HOk!|lxU?wvd(/ΊVuirGװ#wW^WNY_ӽVD9^I+ PO0aƨX?FkIa=Z7k03䔫qv|;"Q|蝵^$&+5eV w6ک5h1=f}6d; s݂3<\3uϨ` @,myEHxVkR09FuፙN^`z.x9:Nmf]MW26tQ;i1lš&ߺ$﷾-. jT!8 y, N1H0z:>S4hOkT[/*o){? '5pe .7M3X{RҺXP r t}m&eeib|i6PysбWI'bWG&奉e%@5K6r\R2yYOͱe&&8Dh|+=n}~^nf> W{|9<վ>/E-BG7-fo"<` [(ԃ#j> rχ$: RZ?/5Lx>ߝ=VM6J 91X8[ )"Š-g*-KӪgN.= 2NH켬~SkٯV_T3o;.>F֪b K$$W_}|3*EsiX2^^L^Otdxkfɰ[=KTē 7BSwq_tY-Eξt<|24\'] |{oOӺQ푌Mb(M'vb I y>dMI;aȖYW~[THZIF(̓BkFt c&!lIiY6aZ9&΢͓ԒV9Eoww6撾5mݻ+`%xZJFº\VS4; iC\+4Lh;4(]|{gYz b((cje("7Dor~ pd*vMh,fxaV" ]"JH8(lt~?VD2ǐak,QG`%Cߧk _5R0i&^\9ے ;EPڅkp⊸A[%gigHI<ƯeLoՓF((7h{@)1x -w;(6z$ L]~Y <>t"n8eiU6gEσ [b|,oÒrcMUu9t=vvu`90z 2..%dΦY {Qhfe>4KK%rdњT8QMoh8) O n~8S&toB fНgX8i֠Yw(UN-3;?r;}  ba7eI`@F~ٽf aΔ3EXn1b ,CG 700@vr`'D9.Kegz[@=fM~ZqzXC/|,=PPLB' ׺vȭV\q)[2W1"þڄM:_'K~xr(YXiV5^QhO;q=?pr["sXEm7Zȉs@ J ũ PI~?([}Jy7qȲPpD'Dw̛KAXne#a7 "yc#VQLbzɾ(-SKB~ݑul1aFh^3K_ӹ9$[zk̿c>X'c/Tk>2Cͩopnsʓos[h+AF_Dh c{mSh9&uB-; H)S)6+qe·-WEۃ1lE+/vt<H&?%I\4RYT[OcY7ߤw 3ja,'44́=Q珚5L7dP[uI C\Z"`[t|'="&sĴ~HRH6X8|exx>v Y6)iO)׆SMLFp FH5 ,׽?%$7GӽydAzC}zEa\7-/Y<2W&hJPB'm]'/X4=E"XTy pR<. n$;iʶ=[uK^b&T\e۲M{n[H/dG}\OK2O|<\yeVD%\md:kcVBO'pt N9D1rģAD)<;_ULٙri#E!V5Drs8ImiJm7a_#5᣺pLge.w휰 ?k󣀉Q *|vzDV1ʜz<X0p'0aDIj_ȿю-M،ynX$qrkZ\(D?r$vl~(`i.;+S_V϶tM2ٶQ>f}h|"?&O@k1.(SçM{Z;T̵X|u2-ބmSއcjC:UC~skm 6 2CMz3XUĢ@6DW4RXaMM0RГ$.weKaƶn6: u׈xBg=IڮEU#*3ϓٚ s0J)kGPucc ԫfDs>/d4THVз㜅vR"|qGZ('v _ Zx'7=8=8*KC861 d)X\ [)icMIѫ~kkB5qzⶀ_}Al+JOu], l3?oǹ\IzS?-wTjP|V)z j0>nʊ}t*1="'i{o̟Na Kf^?CB/xD3:˥_W+d]tD"_D?̒*kk3+;Ҡ< o+}_D`N6̎3ݿWvwOt_cLn*СKT.l H+Z"&mUzԱZEP2szgHɜRͣ*ҏʏџI_->|٣݋D>GBk}iQdb"ͥSR(L5x>1(nqŎ][HZm /ey:2x;Ea'ɃkOo~Q `m$5tAz>%p͒_,YXI!(An1|IRFh>w)։xs,<0/f kV(YS["%ApG6{ۻw*UR >GG>ز~=ZR2DޕhUbhS$"!aڜ2ZoEI`DѸjhV(BPU)9iiAaIsԱ.R(I^)PH{ޝx6$V&+,l=YkBv3to[&X:y*aPI4ƐWUmddXRrVܗg{C/S;/ǖҡo':vـ|KND+ 2퓍jR/?A!~޼in*L(>gq]\+hg9C{=mn,I "6 BCx6xb(YtePP񓱱)ɒN`~WHNEWPO_9n5MW%aX<.#5n$Ɖ2pn޿RQL6$JJ7+b^0%PF<+dzakl$!zc*AsY`Oϐ$SwE)B= HKLBMlmglK P}by$DyBceo%xkIj,#z?Fz{)#uݒ_3:%hm6T޾_G9 bW̴q*o}2uRpHf҈MG 'FPef;v ʩ"A 5$t"ڽ4XQ qD,.& X6cQ0ye$9wNMZ/ov_J cK=9b)lQ0o;`VBl.SALb Qcr:n?!G<̓S$DAǟ~eê)( 嬚N1 :%)D1Yf/c`00]i2A8 Yڏ7W"Rўrӄg~wm?0gt`z=@KW6 n1!o[ P:  #'@D_y9P o#YU1oKZm?<=O旊" mu^~k9mW1%^~87Y,~և幫R$Ot: `{pI9ٟ'SˎDw !3ma\/: S劷)ݚ ) R) h4T)Eʬz7 ">63ԗt}RhT\_cHM7+0ICJ$u3ƺ\$k K>s(R)Z+hD F4JƱܫu{:R냳!(!M; \"<"nibZp{8 `bMH'3ʪn"}a/u}4rwdF:%LbP<0VlMJhIɧ։ RU-~nWA8.!L-*UV@kG6tYg\D"fdzؚ{;/U[". kbWt;lι@i`e|dHuήnha 3-ԑ9`G$<)@DmY%>6V͞x5VƉscuGw6.^€[P|Id_K`\cb1 շ:Cq΋yR|&`|.q˴Jl?~OitIV!ΰ ㏆!JM]_Cj { (,Ҕ;Ns; m'fOYt!a(.P.(ܺ!\ߤ*ثLm .jIsФrbf3Tg/ tbqi WLϦbE?rEqCϿk*.87E]$Uyv-r "%ucZqPH1BW|&v%%J~Zžt< #٥/B˱ 5-W< viߪ jSvK>.SEWi~]ݖ;¾i uQcb;< (z4'_?r;V`p߹Rr/v[~IKT) ~ Ӟj˞# >o\csy0KMx~aG,7nΔ]oo۹=sJdV&K|8֙nj,!˖4d=_8 LIGv23[VV-g~mup&gM c@{s j  p_;T?}pY~`uLxe]&i=լD):E]v*6g˪e_R⽫L>eI8|mmDР̔nO+t=d{nY?tU"UEIs}i86$qn.f.x\mZJ5Aa>O%@8Ơ4)W3=lcdEY gE6YȢr53wlş޸ h)X,DHR}(̈pI=Q<9I m0Gx׽^aѹK?b¢ΏZTCe :I*>3ZP;fUЇ ZY-G:%_c~1 nTq+}wLi!1Jyls44ƎN$SYRĨF2ʎ9N}/x@#pDh>&<!Le*ȼ7b{OD;O?B?m0 Tqoym;jύԒ26U+n{bBXw<2sBZI0Ǖ1Iy1Sd3II!{u3'_?C~+End0eAVnֿ@.M ;L92E ˆ׋Lo /stk#Τ~<nM`h\ ۛ*x"b=1saOD ?ڜD.(=c维"p !C4~XNp !{g{8(~pdg/TR4auvTO6`?Gg5'͟luo o綤C4Ku|}#FmЪ.˨+"c?s;\,aJbfcZ%妗ymKN?}6\.YLeOGc^II>8h5<$;Knr+ln0}剉k Vo(8-nO|C]L3 J DTz: ^Y'/g!⽑~7$Oly3C:땒iv*A@+smJdR믐.@W}*@7QV#b߷JJ.܄YQ ]ڶg[BqsӼĝ*"5}As$/\ ߑu!S5 s}W&)=l\AݐXR`8nrDKowۯ ;xyү\PX9|fQq:&Ǵ}vB)تQ3UiXퟂӨy< rv:-Bu{KUJtqOs<(Z?E=yU՘r9mbWYl[c`ɸtEvPBo-9翭d^K~NIJ[[^_*Ҿq>{}y`ѢMZjn{[6x} zGd;@r*lԤ#(IXL5Qyœ7g?Eu`M.X̒J˹G{Hrqn )C7Z<#zWCs;Z+nFC Q5lbztPn&@3ZBmjziQ#)Loӈ}vp?r^b+%,3F;ɍ,5Dc+cgRܯhp ji~r'üETGVh8BVat*GJ&  4^dAaSR%~8azc.JͬEP{qPkӛ8O||*xDy|8[%'`5IRM4`eζձ3B_Bxt'[奯ZXĮN<o*} 7ԗ*GP\npUG*$tibIH(gl>XIYJ~{\jl]9q7 s?U˷nLV/fm^?7Asi+)ïpj5'tRC"g(\fZg1.M:2f-.^ݣW<^T.QZkbm"K su'c_w7+}-O(awV o8b9d4Qf\T eo)^ֳZ U*pWD5ܸ=7a@^U 㟑/7'zY󃣓/ xf[oi"hʌ&XvJ 2Q& A9 MafZbRW[f4-ۂ,r}e{tR\D|qii8 31%SRΠ2O1"P^(0"oo!~ȴc7w`##{h^'?aUj䂅ύU 0^bYp%gG;6,TWIES/XDI@O9BN7fQ0k0d؍&>,<;8%+GU[hs.3zw ;dϊ\(-/q$,!@zK(|SFD_ˀK/E.* I 1\p`m: tY;nd5Y$T$xuń%8{0֖5{(Bse7шU:>@-QL( 13ԗ~O8LTӶjnAvWo}oekf`=q0~nS0x%?bl#,w 4tT F pCyVV-}1;Ҭց+̃may#a|n}gg@W aQzLg|=l|;K>’S,{_zP#ݵI닇3QK҄g(MK~,8(RVcRh70'Cf1 R-|h΀~!DFv側9AHub.|}*#A/ħR.eO{;OM(SM "ѥ%HM d rHS?4ؼrY2<``zOfB`oM8’:[<콉J7f1x>} ޖt}>?+5T rr{`qT@6ulBuQ39!Iu~DtB)͑wo~&ujql4kk_?-_ +dx2=gon'yd._f* @b;wGW¬c])37HXGDi/z!̌́dn0ІϜ AfF;e9 ۡ7ӳ (y3xJy`#n1DZ$&Z6J ,҈7@ %e`Ћ@hRzm>!~+nf&:谊0}xü( :,8tm VN0Ya8>*qث(':Z:6J/⟡DAk-念1}BW]#/.M3^t %hhd+:G>b*dr iyYe@ 7サI54W/R~'09Eҿ}rDܟgB"R_c4BhT!=WxMʁܾ@|u*geQJn:K಄GA6N1^z)XA8"qf؅yZeP8)^qJZD,(z)#&c#+ fˈA2iArw괝x`&WA f<%Xku\1#џn QTƢ|u5du\1t wljt!ݏ[*$-Tu>StiJLNQX',B]xU֕X/C6yD0oCl<9y4Aa "EuGCq'?a/18'3iy>I@giR"I/~*TH*>`*VK 4MgVōсR^:eߓ//v^K'aj::Z`E"PK,h4' Ħ1TC ({{ɟ 3sYqYmB<:,kzwlc~Z%Ǔf.2 ),vo,/=WO[\4ھ1GN`=hr%iq+[\K®4) wv{DkךQ K=h)#U|@ޓYB0M-{ȦP}& 6C[ۥADܖ1 %/dYt͎%l`[ZHo@ (M6nknYk b/ ycZϳPwSMLSf>coyo5Ef?d`#JCšZCM-b$Ϊϡ6<< ˰cPREv&ߖ0hll$KMo%Gr{8}hhe-wU#ےB*Go< 0(,̚/rr XCX!UӂLuBx$YcOEUH9̖GԣpWdpy:4L}tc0_UV˫Bp TrZW`}GzEl< Z$0Z^`vKe ??+ #-0$R_ȴZbI.D9f%$B@L>ꕠ{dXV -7 ٨[r',\E2j36g1H`n$E P~v2aㅆJ1 ^BvTڒ)׊ ɉdzG'*0l҉\K'ɔN#|>T[!FI:?k %vg^o6= 5ΧƠgtXl nn z:<}DH.m>W! 0X‹Hz]޿C6=/Ă'-q`/8ЊXR[ x$Ѳ O%5H1_M˝&P0)廄C¿4we+՞,VB;/}n ሻ}ڥžN8vTEɗQc]tX]9Av Txe;jff[]l #XoCL4tYH蔤R\FI''#PXp/jgq:BuaNM)ۺ Sa”2w39š趇4E AzmL2M/Ex:;,IX=چVTĭefr2 : \C 4__ht~ƧF_0lk$Y0x2Lfb ecJ7w(XѨ.Z|,#!_1 UMíH6ah3w޴~+8p ~t1<OtW>)i3rt/[(]o2sȄ6Tc[ lqluo9ˇpYyz!kZlƭy ̧-DŽ\&=F51 *F\0FDs8v kfRʫ6ZDΓRM|RKMT\}|7a uȁ%ņ:M;rV$dVzE"ƄgO\?e. leqi tKWG:;SH'Tk؛q+N6#g ._c-)X'dHdk>ed$LnJyAme.ݩ~X¥#^ Wa1ґ鏷v`ꍻܡŇ_ 紻lBj~'@Oe _j8K~L TԝRZ7=oߵ긖4vBøky?YxEEa9#@P MrKI м!rXǶAcT۔#&P0B_fh4z_Է9py֣kkX8*1[X~Ĉ6\L.2DBC`ifJjJ+nfƂgR]8vWJ7k{?! dF`I72T}\ +!vATAlLrjŒF m2n8x%7~ x[\ /54]nQJsL9g$9Deay?vâWtg$,G*ٕS'v;  @+0a,3;CLb, AӓYn3z2箪E)$,><@ ZH9e4$)KI 6Lo8.otϿ &B0]R/syF [|;LrAr-%ׄP%ǒkNSsaޛ=I-xCj|yV'hvCGNaꖿ O>Sgɿ# DcQy%ON & ڰZHˈbK僔_y:*cC*41=A h2ſDrq"ts Gcw5~H8Bb/QbݔijJ E7(hJxV"pf钐VE1vx)Kٴ+)dyDB tZɪ&ivI\04xKqeE9AH.gNjN$qd)_j'j 0tay+l/+x 0Zm<]O}[h!4#",ԛ 8 ӣIF$ӳsX 있QSylƚ<=WćJ]D߰wG)ױx/{=![ QؤW8)RrWu#r2ݬVfE[ Aź2H1y~)(y[bnh {]m4ִJȰ$9I[VӲq߇ܐ>}ww쏅Y0v /|maj %C,ُ*5vmb|(=T"vzN/uxso]t s2adҧ\9j6_Auz&fⰰtڢwA:]q 7:['R!La$'0o0 > stream xڴuX>LJIw 5tHww )])J7gֽ\ֽPbvʺ,e ;&΍LC#ۻ-@AfB"ir@XT` m_W f [{"nok]wْE +GoG{Ȫ Pu. %btd4rj:Z Z.EJK[G --2t m>*22lx=/nf? 6.4ہllެ`Vw[VWi{]Owa~'''22 k)ggkICtvxdm[ykOW6'PA!&?6[ >Vvl3-]]\6N{  {v'BX[!9,TWٸe0_?rJ]@Nk 2 2%j oI;?"+B+=d}`+TYl} 't~&'B=\^A& BT/KHK˩1'Ldbmp,-|!s瀌5A\'8`{3yylMB6?H&o`8lr'M)A6?A߈A nAj ,88!N +{N?QΖ;dހ`' M1x Ŭ\ ng翈C BZ-6twp+͟7{jvx S}CWf0u Bv BØdcit(D ?!%\@ܐuqCJZ@Hn6rC twkc8 r!X_"r@Y$oKCH_ X@ȁ܁m%d`o 2{>Hi+(Ib$Q}sy+?X Գb94>Fb&рeW? 7D.\|\ oZ_f>@+/.VB-eJgiXO>+&ítHRBڂsi\MC@4N/i57_-Ud$ uYuBsU) K qv$wtƏz9~a^ePWu{/p;a,c}"^ g/8o^7ʵÐ)D[?zl!zː9KN@2(ڣ$1k\y m̿\+vUY^ P*%L ؁™}_Ñ#qL:͞t ~žH7ռRˆ $H|sFERq,To?f?-lm{OnA&c/բ%љk[͢pu2vJ8BRqSцxkIJb'h ܸZ^=2$>RC k@ ; :er7uN(GeȠ>c}՗ / A覙=u$]<2֨R[1E豸pk:cNQygVwE#ޞn>sm®[P!1{oRqJi.Ɋ(X5(-'8="V4]A#0s+瀜yB3 _t||;ρϊ,l^ҶAHx ̓Y\I* }t4$Wx s#waP5E`h ޤ¬O 4_X] x mԗsK+~&v{#-e7],dU<MA?רƪ$fzm$ ŁM=vsfuBCO4 QvnRLo1"|Dv ]?8T }Nf3}t I^{,ccK^[Eؓw"<' Ǜ,M 00Wze!;7ef+28?G.b׭%aXy#UŞ`$X|&ȅi7&JeIJe5O)^/du}}|+-..3*7wu{Ɉ"b,Ԉ DB4{+)Y%~| ι}Z KM"tS V9E&,.Z~5.Hj/ube(JPxH5r"+YF >.50dOCrSa!J42n,;0cҠ#hN &/_rg}͏ͮ}6]w&V(c0 ;Ych7m*bY#~0OosZcƨ}@`qٽ7F-$*ewɮe?ת:Gq]+\g|-Qs :#ZU nԏD5{̚-T=svU79k?Ra2hg&7T@, (j.}C̗Nrsm;ȒK؛h!Mn7Ŏg)e`̏ڌώOf_uKzoUB^$V5Chqآ"T7mRqh B Lo(Q麰JgD=Jkʌ;T,:7g{hZ{TĪp^¤1З<iBiahf3% kUly7wz#-$!mhphݴSښx~߯%9д[0WK|JJz]y``9 Ct崙f#]{[R]LB_xz k|1[/mb`?g\!'9<=5w-s̐Fq>m806@[wZɅ7^L"YM8VP:SNEixG$d$S(Jf$fȮIhby$P[}j{(pdl2Q,=¥)CˢC_/F=5Zs0|2n5-] d|^(q$9X͗՜ `uBliS#{& ]whp6%)n%~J82/JѠl7)+ V4hZd0"tuW^Ԋk'So6GfzD][5U-[]Q [0ĨCP+ijab7H,npbѽMis+KJ]_M>1=Ju3Ǚ8 jkPn{`l7&p#P*r b3fbj5 BHi5eZxya| BAӕUR,[@RU <_ȍ,$Җl2t%}t=kUm{JZ_I0t"G*rc։nD)Dʶ,L̒QBMHvMw pa?3Q:j?'{ _Q: d.#@LbRp!#-tN,JVEgu R߁/|-6_qE} mB( yaG鮠$ \H:W)yYÃJJ|dG8Zc$rf4d!4ZҘ`VO6c>,ІsZHz&5u!!8AWo$$Ѭ 9f"+xCU;K*y$:̻xCFj3LdÓZ~Nշ\SU~1[#l|n2ǯBuJ%yՆs:]>nB㑴lMPU3Q[8k>Y"A.{Tw+1m$dB;|!>u*7T=U?Wric m7\%^港.&ϒ\;r{>؊-)*'6SK^赺ʪSf@|+8 _(z.I$s4h(v&~Akld `u@|f/BK^.l _bva)ƬY-ygi06&҃1^VS$'<~@i&>=rwڲ8KW"Dɶ ~k79VDg{˹2z#*՘ 뗞Wݎ堦q4myP>D*5vMwy8j`δgIT""bKUE)w>~faZ$٫2ƎJ-LS6Mv ։r!:NL"j 3Ӻ}g.e\&[Z_bW m0La*Z['o̳$޶'図aa>Cu:-b^].OOp|AVQ䑮E=Q"&Onϑ4扡$eujn\NF*w5OJq$v1,on-%8i(׌*<(چ˽g֊/u>&oh_'V3뾧(߽Ipqj=?IT8PC">:ѽy(,vAY׷m:PkɡuaA"xn:?Jt8\qQA]ac ph_}b0LCU{fl%,;ytV-dIt>w$%3|:e\in`qکjrBE雐)`{oQ̨c+uQ5̕,+ΨFa 5%"ܳ&0Bc5 EVg4<<[մ>7Ç 2WiP:{T;;_ո~tINw,"R'hDԄ% bbbѰ\9$݉?C8WLL0^fL!S/oTMgz4Fs)Ȉ 0Q;s⽚ EIF:-r!:HҪ|(J/U٦ RA@gNUa~̠Iij8c&ꭈ)Fh0;TC=𙈒:7vx y'(> O{X%v[NWcdɺ#Bx'&GXQfR&4ⴍ^꼌. aI!sfG//}GH;aw%X(wW-m*եao9 ;Nz}K2 >tpW~ц8(t|ѨʏrUg2L;k44yQOR('/;r☖7x2;`[7:i-:g-0g>Dș^[v΃]кpO[ȟ5w.dAzMAey)9^Z5))# +szg,`J>aN56(s5r <ku C8RUwSdP_&?FwHPj9}9-Ko{G:&U֒8l.WkłNO!p6-I{54pZB S1'`o{@p+[.{ >vnUO6bwKQ+SWƵIi3)G.??tCf +%vV+2` h`}`"?ۄ`⭒.bmRoLH|nRB@k>hmJ1LA:C SWIΈ]*Gĺ] 6Ʌ0Թt"3_/۴oLL%m;EJ+Bo#@`_>"Gd`{'rsU-Y:;'$\]-s2$Gׇ(N¿(4l3Jb95M y]jB@;Nxx|Fbơ_tJ$MTy:'PvZ 0 9C^0W ,#2Ҕ >Y0O_&S R3括)Pt)ng ط=1 %蓍3I9"fjٰ/jkeZvE̯٪eڕda2P5p5AδDHd(zc!J̸T*J޼*2L3`a-W!`هlk{kS4'Ղu"<ϑE=5+meNnaB6tS |Mqul}WD#Ѫf]$AeJ}ȷ^bpM~^(w8(gzBkeW&2PIlq+"bcF03Nz#ɫ0M~v 饆ӈ)~ Q">Jsw-m]!Ed 9C<_1ݨU6C&˶8O_kɟ H$dy=WeA. 5XGr}ݵr6V4e[iA@ ׉;T2>DTE<*$:w"=Yyx'(f/ߙsΈ#i] Ud<ԓݕ aoE_yت9z*xF?o w3>״w,;E!h l,)35&]qaߙܗRG3#˖7&Tt% wk@&´i^$ȹv="aTRkY>$n5:[TQ˲jc_cv6֤PaBF&պ/xXwi*l6 Қn٪|g %(&~X=T78;ȍTTȊ>_*}տczqyG4܂:,@sv_͎ZNVAq-^BOc=W Yg: g? ˖NL黷e #{=h3%˸ +bJ&Ew(A&]ex.UWNu{Ta[$s]*df8>mʤ+I) -t0eգ ZMM>̹7tYvD(1x2>hl_兮a2WÓ6^ S_#VnqNU\=)Lsb B1á]g2kh|cΪ򃙣= |bqױPi[]d#j~Myo$vbMTf$>QJA.dZK .4JVv~5Dl'PTz_WC1W'7m\zkx|CDfWA}LRŵiNBuHX$t"ZaPV(b\ݟ_j:rƵpoW՝<<J@/oOد)2rpyfs (9ɕGÆ?MjoQ_c"sjySA[Ջ|c]WBZɡR( ϊˋ+Bwm>Ui5Kzѯ1ˉlV${N%xϯx蟶XO4oUM"_.:fT|5ivCqpZW&8 r*hk^gQA.L'`$Qc@Oi鈑;(_-2m쨾Dtx+U.l,36/ D3{TcM],>3>/Ӌ# ދVh+& e{FwI~ř厏{KjnsXz?nt9T-U^ߨLAC>Y>q\mnycM7L>b-QWq#bw`wo邞aeHIQŶdx3\_'d u⾅E *WtT|fTjƬoLi'ʸOBUU-||hMml],C5Jjn) q;r(Sn|(U@^ , tldˠDn9mH{s>T(~ո6'abWfMC(#[~A+)נE[u.P㾾ʧXHF8F]rE6F@_MH~*(ƒyA?=̟j&:/"׋ ~-RRвBA +@Fo1zDA'ZUڡ؀RZFЗ^}5/{| kh\ǜɐ7"= ).nui6ۅ! {TԔtW=1`R ֺooƠ72Ag~S89 JܟO+ː0 ?๾N߆ɮkrY83T hpTF,L,ߠog0mShdlIe?ᡓ<t*.UEIפ :@gh}j2:vl:nZ푩S:@d@j6$@3 ,סvwq ~6]ZCϸ)aD]<1ʶ=_*qڧ0{go>~;y  MkcˉDlP+1zP4V\6!9'8Pb-]:4*~2}&ޖ *Q4#!ޝ2H{o=V8×=?k$4 cIAr| 9c3Ly:ə{UzWglZ<4Mi8agU)AanbfU^J.jzpNcYqPa7sdWOI?e,7 E3_y\Y\n'h?`eEYBTTG`)sèMь׭x;'JM?l&%1ŦІF8jw}"`eh![ZApSiJc`X<ξ&3gz¦:Po%[ZZ#AVk,Gb9V9q沖P/>GZihlyoFȳ^':n֏=>I Xq93C:K>AcFtʪ2ߒ=+A'I* ͨn*ż3GVj2|HnNW} 9#vRZ|kL3ǩ.%lI_Ĺz}1X M T`[KɬiCZw,i!{کˡ\g-gSKc0UeTǩtn>T>N0:@IA3R-}ԋl{XMsNe8#r50z\I:U6[K< Z(c'8~wzCOx ௒2hufG"Wh)9/''dtAϮV4^ێW 9JR]E&_ _I'fY!HO\DjG5JĦ:u4n J=liuڰmSә5Cgc)#i_>}fiQs4,h瓶s{\ZWl8. za끞v"'chMD8rgf RH(K*qxy+s&XKtpA̹FgpJ34ּė2}.Qp7a/t+~z.]m`rX$\m~Ғ+NGdOqHO!1,3/MAVq݋$t$JE<U3(LTPV7h_lN&&()P@9>wgPeug(_=4u;7yBW Xb:[d+}I ɠ3rd?q\bȔLd+m.b7n BS\;Swʩ,￞gY?6OLJJ݀]Oz8P噙 {˫ mW&|Qqzp4송aH@&ڜNRXxȀkI>d3C`h=:o~6ϻ飪(b;p]|hCmjE1p6U)kǨm14QZ쯂f&}6wxzX&K,uTލ-?>SgrG973S<f#Qރܒ/30Ogr7K&uDXDHqR'j TtV{m*+j&Wk'yz Tf؅n&^/Z}7J?/ksWy:{)ljoJq{SJoo1A!y*6/UKwQZJ~kc9.b1b\{4)Jo\ ţBkKKќd tNRVy@ ohRкd}}Ǭcr1ZDԞmXSWAV\<|5)fh[=٩b8QRy|5z7(8hLejs{d)UrQ;> =ʅИ&kT6Y0U'J&5{]i7%-ңL[= 2s<+Ts#fTj] #=7BUѪC7 8~;g_OGa)Ri$ _9PV%seu6{[]u {$:65@ z,hh ۍ PѧO.5Kr|S{<յ @~EWM%E`l!@ 9ԕ]/OG,–9v~ͅJ4F|}9@ {,tGS$83oN9i~=*ēnrn˖hp.jI[.cީL(ao15o*g}bbQLޝ;6U2v7|+p Tbc\͹T8E] 塼(’@E%kсCx4XД%˸<ٟ$%Z,R< \j&vsJ͜ܐ UV7veݛ$psc993r~#:o^9k .V3P4bO?1N_rC-yaMkO53,ѝO\2XAW(^UwIΣ(Q JAN3 O; Lӹ@՘(2֔ٳ&DClb|i"ӪsO2\igf* /|8*k"}Cu:eԉg f>.(7Lnb0T +Duq`XM)BzZ,k`thkӄ1B Za2P)HՇH2S g@яU7޹Xf[P$L{ٌyqP1X_kΟQ燔ވ{+P9ƻ)lrC;m2MVMyto+JGդSX#ˀŹQ &ABݞE$Fjki5oec!HG?!EPv*9?[_ ȤB-q1SeY(\F>z+0 !zХْB}K@K'|5r;TFP/'Vd+-qa;5@E q]T.p/Z'Y&2\ϫ"p,w3/"ti\*$vܓϖ7Jt8V$)ݴP?+@3=BC\YPSO=t o"Y&W!g1Xҧ0|pn#;\I_%߱r?7V443a7-D5GSjo6H<*YnfDo<17y X5k\fzVNc9%AQ6U\~bu~o_Y9""ԜzEcGlkz(bc6߆a=s^5~>Q/x>ɓg[4)Ӝ1}x:-[>X ~zɶYj>6t;E)UY Ȭt2?zn4fz_>D^mWh;#Dl:R@4KNZ2O SO|phH d !=֝-2Z#9j!ASVhtv"3 *)5xUJC~OJ~+d}m.RL~"}\ p':xJx6I|u]BGB߂jS5kmW0}М']4tH xJX#:J@a.E] # 2 W[05RO1jnBTj?EO'#qaM]GYIԯ?L EC9!}=S%P<1nyUC*q8!jgpI4Ul߀ԛ5w#V_ >Ɂ~ǿ7eE;\aW,ko`nQ ƕd=B <ӿH ?!.WC-^;තesѮƍIA0Aa7q8]KN┴VVXU&"'s xtopT%WDN[6Ut>$Q\Z0ʹtz,'ALMcD*{v-Als~Y2vFٻ]xHZ*g+Ac'>Su1bs@+M]>BZ&V:WIG2pszg.ϠI]%ƿ1a.Z>&{Jw.=K( +1s\=sYrqvjZW軎{y ]ZϪ"ôx&' H,QOD?__H .Y$[D/puwn ~Dn{1 U$=B7@kh-Y)cYhg9_Y[\\lhomM-[UNMsqڎ++=&ĀAzо"t R=&됒kptQAImHf{Ѝ2$zKBb -UuUoh}ɬp@)d/& +VO &'m/] fkM z(ީ4FV2bk!!ju 沖Tоt`4ܿ=gvM.Ȉ$=tFUY3w j#PE^"2_Z*|O saؿe%A\}% Ruo__p_Ox} ETOQ#HeaV.=oOp ITIeL{9䧮3~&)%8[֦}[6M4Sg`EBw;|[bPG4*A,'h5yFS2GLcߚsJԬpb6&Q!]iqbDh)aK\@}=1lVͶYT}٪GG P#Px2 DoS=dj /-~]jBK?@#]#{V~1ʞۯ}1Y*XReWFq<ƎL H|B;F/YB^ឮg-T\+'r#Ibh_ G<[x*z3Y_q}jV7U4E1-k;Nm5G20VVhN%Ӈ'iwll+CDZv.9MNAm@8o  g$VqE>'u PĀcCm="uԳ"#Ac'@jg:Be(~֘0C)` 'F)^= ݌̠G"A$>h"Xp]jWḆLY@IګiqId},J<[++FgT# *M8xh遱7 c&HpB0`D^3ڗ&mRY]&޶0){G1!&v>mdsl(OS@qe c؋1ȇ$U2H= 7wV!~[bƦWNjI (#.Q9zLsl &'iG59fIjm3<+G **9\`81u-y\$'܀BHڸ=@sނA-=HÞmYsrӳ0h.P`6uMY b ԤJwӑVO;E nt}pci7RbQ 20UF"W&(ԋӁlZl M:.Ҁ} l"BJ7a 0fyIi3IAΪէۥZ+xˬŐLλ@ZѫFT7 IwIb/[Q٪Dm,ߎ:HP){=4W߉0۹_+d^܏]&>`zPDQ+,Z\Z 8F}Te$)]XphZJr2 f}n: `9*m[KjE 2vaV8ip;*å3\Ia loI- K!iٔlEDf\ߡϼiuc0Jt"a!~A?Ά%YbɓABn8^] *V8sFR3)hOvaS<HB-1#&.1lVpAc[뛨L9Oc蒹Z^F\=]H/:H$Ҫqg†Į4qx6|MfiSZU)S4GEQDz2L/9ltyp7) tqW,ƴwDOUUI5&%.&tL*[0u_anH#%; 7W#b_V'u^?M <uppt֢T(\&ʫpvt@Qoe3. ӑШ_?sIF &Kږl_) ANqckx]6rMP (ԖEɠauWTɸ.!U4:Fح,Cź *[UDEe (Kѧ'>9 #Hf^\¿kV69yhx0$1 H=73/D`!,cT>fE=Ęm`"gtGl#GM-Z})&%Wio_Eq<ROJ߻?]Gf'4-/D>͈WRflnAʶOp; 2jO乽B$5G!$Zf39I?gqI]d+hr+9Ǥhf"xхtb^@n`p٣Rn6 *0 sF^Zwڴra&W ɽ,? tw.3rPeTr<Ѕ¨;V*Ov@+zXҲzn%t=)0Rmo2|l:y^M@o8л9y_@`BJc4{977 4P暎G܁ɔ]OjlaD쮿GhKtu/80NwCy\hS ܻb#"3*`)$G6a%%)AWeR_m;+3 sϔeuR(kuŘ=@G@Ro8q!SWs %" 3h} h \2 sn{85O݃k]J(ksڅZQjUCWy #3;D|σBP \ *oN&qD.\ǁl b!{@ǧA F`|;W}QETP %c盓,?oݡS7Ug\@ZbR{MUb &k<0,e- Ar!;vzmB1 ?>C>InMLJ/6;S c4 e/zR|)p{-5sĬ/nA=Q>6o'JF&!E 1VDIheۀY@~G9tmmzd_>3DNZb%qcVhT^L;^GT|t\9ޖST:9LuH0ThzUODC{ `V/y!Oo "\DuaT!y$&`$6D>{bs=UC# ΉB A7Lc)P*ypAAL+}jGf8Ȃ?xq*n6zJ䧳I5qݐgMhM`%?IO!a<+sSqÈ=9;Ln*^#M_ a@c:z4P'HlB*uo\׬6TULQG:%Adr`&e>ݖq0!GYG .juVdJ~nW\41'B'z2,i%y.E BדPsWֳ!6DL0A ZG?o0+ ;)":Ύmh2NCw4Ouˢ0#^ f¥ч,bPa Y(3/@}Xee qn& _C<Xa,ZwANTwd4&5 j?s7#/.ޠi0+!޳Hj#W^((BcΥ 5P*UHK|whfDIrBoyYuuO.7-zbth)XQFb%Bg'}L|wT G ^xx@g*6yAѸ*B7J %mAlV5RF TNѠ[oE"T Q,2H[ݳJ}z*L҇i֊AzdTZ NU } W]vԞ\ZU:TO0 oXx _Z1F'uc$$\aW:FwIk׀vy-F{\ 512+Wj" )!fR2׏*`i95|-e;]xY 뱊%N.ЮN. {j/rUQUӛLDž hr|kog9Tŗr%#:#%yG 1bYG_f0xqD%-Ew[R2RyJL\dŃ\v+\D;Tn g٢vQI xURG,p4Ӆ6)Ǭg6)`cuBh/oy&$G&xF/?XD6;VSp߷+w$Yc(?+g̏o+L |x? (d|Y Uɯegd %@%CT׋!h01ŬFz-XkqUG"t]<^Ԙq;'Uϊ7 _""J]THU{2/+dw31pIAZ uh+eN+h =265~kmWtrEo7'GT0OvOn>+RAtlɗNl9"?.C T|ڂR7+ewҴVm~6ez/o)XiϚHIiu˃Ll [?񍓀~ȧկZg&%_` n=g?Д\G>k78IZd"|\c Ey f.@'J|*Y"; al-J^dyW}9" \{);-j,(d+{8"BB*-a9F0?Z5vU(IeNt]}}S;‰~N4>aCˏ?pGxB}[sDjkUV:&K0wuDg/=Wǵ~ DX@]6rQ=-٣Xb%0М:Czq@Z%|l,dj%q(V [D ݱl#%Ϻ@]USf9@ci0xZcy+7)H3*{)~'1 ifY sB*Y_ Euv&՛b8ut2#{_ BqeVVAI=5$R,XE0z0sB5&-[ v6!bZg~nXSQ le 2T.$ ͭ|b%8oSɼ~2;4W y?]x[5bsz#C]T_Ux-T =IOE> afkXU_) Ugzr`:HZ %ۨ2 HPKA|j`-wyt:K@XBt?B)w17865In/SK81E)N' *r$|f 9MgZDJ ѢF~=.b:'D$rH]y~BG vh1c[޸V?(aQXg 2UHNiҞ lϽ VQj "'"`=og9䦪Ämj%{JChRِsrTϳ䰐U|O˖ІGV9p;_iobzVHH`^6,m\C,%-$/{@R!T$=h6.;Kwn>ݽ=-ٿ[2W0 }pݑ% lS\2fQ[Xvg>Y{l`;_Fp u$wNd|gok +~N*i& 'V"QBu(|1fiZCuQ{ rev%o* .&%g;EtBv t!N^h_=o'U_ _  9ʯ"T9d0:rR!8Ƃvdj LtO4]8?K4cd2 7 WU1CE5|dwc0@.C8|CC6M^qlrye:*锋鴰Id+]7έӵY<Ө"H)*O;͵/ΐjlvc#,X1"X^ )kIrlztioOc/8\ݣ *1\:ziA2P\ kG)B{_%#M}}.!lQn/qq#t`Q|M8a@b̄l0d8/\ ?,fIó![{{}T*iE) qVBO}pʪX^l/`@H GÚ\;elRx`C./mJx_Z ?q$kYmL]6/?K? endstream endobj 92 0 obj << /Author(\376\377\000T\000h\000e\000\040\000A\000I\000R\000R\000\040\000C\000o\000m\000m\000u\000n\000i\000t\000y)/Title(\376\377\000A\000I\000R\000R\000\040\000D\000a\000t\000a\000\040\000R\000e\000p\000r\000e\000s\000e\000n\000t\000a\000t\000i\000o\000n\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e\000\040\000L\000i\000b\000r\000a\000r\000y\000\040\000U\000s\000a\000g\000e)/Subject()/Creator(LaTeX with hyperref)/Producer(pdfTeX-1.40.20)/Keywords() /CreationDate (D:20200526093105-07'00') /ModDate (D:20200526093105-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 2 0 obj << /Type /ObjStm /N 79 /First 624 /Length 3447 /Filter /FlateDecode >> stream xZms6_ݘ ށNgj'6iSP,f+EM= @%[zC31b.@R)L8 Seici+%0!(QƏʀǐBuLKI_I˄ȔqXUX5R dF?ȭ% B4V*| +Ek7Ґ 2d:iH%7̐Ęl08 ;eGY{i!"cV2!:Z,!J ,7Tc xGP p .! AT籈*I(oNcf%ӒM8*()Xp`G9K,D)J72dp'cȓUh@i !o="H(Qr0ua}Pc_)K oՈ?of]5G#~\͛ÇbQ5QXA淘H*F٬sZ2Rϩqv:Z%N񓛏]lֳ_F|i'U-OK c+\6:%2^5<1nf(bHQXT /0Jj(}!$2a!B.yr1t CBAǔ.(]ե,@W,@(4X˪DM_^\_߳ˮmwϚY}.bOD]e (DB *l\xZі[?2Gtv3nžNa¦P`1zxl tH!JmBz6p Q'Cԯm9YvY)b Z%}d!{5 QMfܴ1p\Aۚ?SY/QQRP1↊~Gg;{*TTT{u?߽^XG9z]_T=IqiO0"-~zC6Zf?R8 SJ/p0 7321Q$a+pe g槺JPe,C >+J%5e܃"@le_j/{ebO* | ڒ$S*R`1owa6];YSgRKk ;U, .4a#Ud,O^t'e;KWOO>kn%&u;<ʈ<;ז.{(ii\M,5vߞ?N)$gh.)HGqBљ~Лj.ei$H4?9nňz V,c̕7n K)mAtʦh7RMOy<Ź{ڗyFD?Q~yC'@bT4DS!}ZTWe4EOLr G6YN*F H6`4)ꩌ+2BbQ]Uc}؟>jki䯔c,}ԓI5dj@@0b6\aL^G@ z S 7=='*orݫPUbt8ڧj*wfl{GdH.#@L=*q^OƵ b}AeqG$BI\aٕG/z%7p`*,#BB*ΔqуM43hy&rڨ2Ɩ@ d /ǣ± "ҘkQI¦r, 걤-h*ቐ8+ \[$XTh9ù(4q yvC z\!`(( { "+BtkDz4|ui5R]bs4+Xz1ZǹCFA>:^RѤOtpɧA5?kim #?{?Ltbt܏]-ە!-q%>Ɲ߆0ܤilW0zٍbZrO{0< <.-{=~_c~|+^o5ow;I5Y?|po}Uܦ#n(|eآ;(|U>5S~|' ,ԯI+Z?vÿmt{ 0Κi379IdLe5dLg k~Myjmdv]u3& Nr̫_e[U7f6YVW?Y1|<F^Nnc`bv؍~7Klr |[h̚n{2瓑 rEwjK6؝c֓l^E$ɪ/o^|:po@7@:Wv Yf%K)L< oHY]wtR엪7S|O7ȉ~Vca9i5`sdž)-ߎ쬙Գ \WX޶|.&`Ja,Xʏ0 ݥ G (^ԟHD #`R5A3"-2]4!Î N bh|\V3^>ST^l˄w;o^?WʆokKu;h y8 \G]=.N$]؟soj)vU*'֥~E*Q wj^_W7Rm endstream endobj 93 0 obj << /Type /XRef /Index [0 94] /Size 94 /W [1 3 1] /Root 91 0 R /Info 92 0 R /ID [<320DEFAB240DC883DE7E8E0BA420E557> <320DEFAB240DC883DE7E8E0BA420E557>] /Length 232 /Filter /FlateDecode >> stream xI2q!)"!Hby!fB UvlNY9;-WϢZ~dQUA 1)s Pvap= ;4 @L|[? 8 2><@Fa 0 C*pS0 00 UyXEXeSZ1=|y>^f- צƳזG\Bn֢O endstream endobj startxref 207494 %%EOF airr/inst/extdata/0000755000176200001440000000000013663036137013626 5ustar liggesusersairr/inst/extdata/airr-schema.yaml0000644000176200001440000031756213663036137016723 0ustar liggesusers# # Schema definitions for AIRR standards objects # Info: title: AIRR Schema description: Schema definitions for AIRR standards objects version: "1.3" contact: name: AIRR Community url: https://github.com/airr-community license: name: Creative Commons Attribution 4.0 International url: https://creativecommons.org/licenses/by/4.0/ # Properties that are based upon an ontology use this # standard schema definition Ontology: discriminator: AIRR type: object properties: id: type: string description: CURIE of the concept, encoding the ontology and the local ID label: type: string description: Label of the concept in the respective ontology CURIEResolution: - curie_prefix: NCBITAXON iri_prefix: - "http://purl.obolibrary.org/obo/NCBITaxon_" - "http://purl.bioontology.org/ontology/NCBITAXON/" - curie_prefix: NCIT iri_prefix: - "http://purl.obolibrary.org/obo/NCIT_" - "http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#" - curie_prefix: UO iri_prefix: - "http://purl.obolibrary.org/obo/UO_" - curie_prefix: DOID iri_prefix: - "http://purl.obolibrary.org/obo/DOID_" - curie_prefix: UBERON iri_prefix: - "http://purl.obolibrary.org/obo/UBERON_" - curie_prefix: CL iri_prefix: - "http://purl.obolibrary.org/obo/CL_" # AIRR specification extensions # # The schema definitions for AIRR standards objects is extended to # provide a number of AIRR specific attributes. This schema definition # specifies the structure, property names and data types. These # attributes are attached to an AIRR field with the x-airr property. Attributes: discriminator: AIRR type: object properties: miairr: type: string description: MiAIRR requirement level. enum: - essential - important - defined default: useful identifier: type: boolean description: > True if the field is an identifier required to link metadata and/or individual sequence records across objects in the complete AIRR Data Model and ADC API. default: false adc-query-support: type: boolean description: > True if an ADC API implementation must support queries on the field. If false, query support for the field in ADC API implementations is optional. default: false nullable: type: boolean description: True if the field may have a null value. default: true deprecated: type: boolean description: True if the field has been deprecated from the schema. default: false deprecated-description: type: string description: Information regarding the deprecation of the field. deprecated-replaced-by: type: array items: type: string description: The deprecated field is replaced by this list of fields. set: type: integer description: MiAIRR set subset: type: string description: MiAIRR subset name: type: string description: MiAIRR name format: type: string description: Field format. If null then assume the full range of the field data type enum: - ontology - controlled vocabulary - physical quantity ontology: type: object description: Ontology definition for field properties: draft: type: boolean description: Indicates if ontology definition is a draft top_node: type: object description: > Concept to use as top node for ontology. Note that this must have the same CURIE namespace as the actually annotated concept. properties: id: type: string description: CURIE for the top node term label: type: string description: Ontology name for the top node term # The overall study with a globally unique study_id Study: discriminator: AIRR type: object required: - study_id - study_title - study_type - inclusion_exclusion_criteria - grants - collected_by - lab_name - lab_address - submitted_by - pub_ids - keywords_study properties: study_id: type: string description: Unique ID assigned by study registry title: Study ID example: PRJNA001 x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Study ID study_title: type: string description: Descriptive study title title: Study title example: Effects of sun light exposure of the Treg repertoire x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Study title study_type: $ref: '#/Ontology' description: Type of study design title: Study type example: id: NCIT:C15197 label: Case-Control Study x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Study type format: ontology ontology: draft: false top_node: id: NCIT:C63536 label: Study study_description: type: string description: Generic study description title: Study description example: Longer description x-airr: nullable: true name: Study description adc-query-support: true inclusion_exclusion_criteria: type: string description: List of criteria for inclusion/exclusion for the study title: Study inclusion/exclusion criteria example: "Include: Clinical P. falciparum infection; Exclude: Seropositive for HIV" x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Study inclusion/exclusion criteria grants: type: string description: Funding agencies and grant numbers title: Grant funding agency example: NIH, award number R01GM987654 x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Grant funding agency collected_by: type: string description: > Full contact information of the data collector, i.e. the person who is legally responsible for data collection and release. This should include an e-mail address. title: Contact information (data collection) example: Dr. P. Stibbons, p.stibbons@unseenu.edu x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Contact information (data collection) lab_name: type: string description: Department of data collector title: Lab name example: Department for Planar Immunology x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Lab name lab_address: type: string description: Institution and institutional address of data collector title: Lab address example: School of Medicine, Unseen University, Ankh-Morpork, Disk World x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Lab address submitted_by: type: string description: > Full contact information of the data depositor, i.e. the person submitting the data to a repository. This is supposed to be a short-lived and technical role until the submission is relased. title: Contact information (data deposition) example: Adrian Turnipseed, a.turnipseed@unseenu.edu x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Contact information (data deposition) pub_ids: type: string description: Publications describing the rationale and/or outcome of the study title: Relevant publications example: "PMID:85642" x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Relevant publications keywords_study: type: array items: type: string enum: - contains_ig - contains_tcr - contains_single_cell - contains_paired_chain description: Keywords describing properties of one or more data sets in a study title: Keywords for study example: - contains_ig - contains_paired_chain x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: study name: Keywords for study format: controlled vocabulary # 1-to-n relationship between a study and its subjects # subject_id is unique within a study Subject: discriminator: AIRR type: object required: - subject_id - synthetic - species - sex - age_min - age_max - age_unit - age_event - ancestry_population - ethnicity - race - strain_name - linked_subjects - link_type properties: subject_id: type: string description: Subject ID assigned by submitter, unique within study title: Subject ID example: SUB856413 x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Subject ID synthetic: type: boolean description: TRUE for libraries in which the diversity has been synthetically generated (e.g. phage display) title: Synthetic library x-airr: miairr: essential nullable: false adc-query-support: true set: 1 subset: subject name: Synthetic library species: $ref: '#/Ontology' description: Binomial designation of subject's species title: Organism example: id: NCBITAXON:9606 label: Homo sapiens x-airr: miairr: essential nullable: false adc-query-support: true set: 1 subset: subject name: Organism format: ontology ontology: draft: false top_node: id: NCBITAXON:7776 label: Gnathostomata organism: $ref: '#/Ontology' description: Binomial designation of subject's species x-airr: deprecated: true deprecated-description: Field was renamed to species for clarity. deprecated-replaced-by: - species sex: type: string enum: - male - female - pooled - hermaphrodite - intersex - "not collected" - "not applicable" description: Biological sex of subject title: Sex example: female x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Sex format: controlled vocabulary age_min: type: number description: Specific age or lower boundary of age range. title: Age minimum example: 60 x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Age minimum age_max: type: number description: > Upper boundary of age range or equal to age_min for specific age. This field should only be null if age_min is null. title: Age maximum example: 80 x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Age maximum age_unit: $ref: '#/Ontology' description: Unit of age range title: Age unit example: id: UO:0000036 label: year x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Age unit format: ontology ontology: draft: false top_node: id: UO:0000003 label: time unit age_event: type: string description: > Event in the study schedule to which `Age` refers. For NCBI BioSample this MUST be `sampling`. For other implementations submitters need to be aware that there is currently no mechanism to encode to potential delta between `Age event` and `Sample collection time`, hence the chosen events should be in temporal proximity. title: Age event example: enrollment x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Age event age: type: string x-airr: deprecated: true deprecated-description: Split into two fields to specify as an age range. deprecated-replaced-by: - age_min - age_max - age_unit ancestry_population: type: string description: Broad geographic origin of ancestry (continent) title: Ancestry population example: list of continents, mixed or unknown x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Ancestry population ethnicity: type: string description: Ethnic group of subject (defined as cultural/language-based membership) title: Ethnicity example: English, Kurds, Manchu, Yakuts (and other fields from Wikipedia) x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Ethnicity race: type: string description: Racial group of subject (as defined by NIH) title: Race example: White, American Indian or Alaska Native, Black, Asian, Native Hawaiian or Other Pacific Islander, Other x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Race strain_name: type: string description: Non-human designation of the strain or breed of animal used title: Strain name example: C57BL/6J x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Strain name linked_subjects: type: string description: Subject ID to which `Relation type` refers title: Relation to other subjects example: SUB1355648 x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Relation to other subjects link_type: type: string description: Relation between subject and `linked_subjects`, can be genetic or environmental (e.g.exposure) title: Relation type example: father, daughter, household x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: subject name: Relation type diagnosis: type: array description: Diagnosis information for subject items: $ref: '#/Diagnosis' x-airr: nullable: false adc-query-support: true # 1-to-n relationship between a subject and its diagnoses Diagnosis: discriminator: AIRR type: object required: - study_group_description - disease_diagnosis - disease_length - disease_stage - prior_therapies - immunogen - intervention - medical_history properties: study_group_description: type: string description: Designation of study arm to which the subject is assigned to title: Study group description example: control x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Study group description disease_diagnosis: $ref: '#/Ontology' description: Diagnosis of subject title: Diagnosis example: id: DOID:9538 label: multiple myeloma x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Diagnosis format: ontology ontology: draft: false top_node: id: DOID:4 label: disease disease_length: type: string description: Time duration between initial diagnosis and current intervention title: Length of disease example: 23 months x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Length of disease format: physical quantity disease_stage: type: string description: Stage of disease at current intervention title: Disease stage example: Stage II x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Disease stage prior_therapies: type: string description: List of all relevant previous therapies applied to subject for treatment of `Diagnosis` title: Prior therapies for primary disease under study example: melphalan/prednisone x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Prior therapies for primary disease under study immunogen: type: string description: Antigen, vaccine or drug applied to subject at this intervention title: Immunogen/agent example: bortezomib x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Immunogen/agent intervention: type: string description: Description of intervention title: Intervention definition example: systemic chemotherapy, 6 cycles, 1.25 mg/m2 x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Intervention definition medical_history: type: string description: Medical history of subject that is relevant to assess the course of disease and/or treatment title: Other relevant medical history example: MGUS, first diagnosed 5 years prior x-airr: miairr: important nullable: true adc-query-support: true set: 1 subset: diagnosis and intervention name: Other relevant medical history # 1-to-n relationship between a subject and its samples # sample_id is unique within a study Sample: discriminator: AIRR type: object required: - sample_id - sample_type - tissue - anatomic_site - disease_state_sample - collection_time_point_relative - collection_time_point_reference - biomaterial_provider properties: sample_id: type: string description: Sample ID assigned by submitter, unique within study title: Biological sample ID example: SUP52415 x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Biological sample ID sample_type: type: string description: The way the sample was obtained, e.g. fine-needle aspirate, organ harvest, peripheral venous puncture title: Sample type example: Biopsy x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Sample type tissue: $ref: '#/Ontology' description: The actual tissue sampled, e.g. lymph node, liver, peripheral blood title: Tissue example: id: UBERON:0002371 label: bone marrow x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Tissue format: ontology ontology: draft: false top_node: id: UBERON:0010000 label: multicellular anatomical structure anatomic_site: type: string description: The anatomic location of the tissue, e.g. Inguinal, femur title: Anatomic site example: Iliac crest x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Anatomic site disease_state_sample: type: string description: Histopathologic evaluation of the sample title: Disease state of sample example: Tumor infiltration x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Disease state of sample collection_time_point_relative: type: string description: Time point at which sample was taken, relative to `Collection time event` title: Sample collection time example: "14 d" x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Sample collection time format: physical quantity collection_time_point_reference: type: string description: Event in the study schedule to which `Sample collection time` relates to title: Collection time event example: Primary vaccination x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Collection time event biomaterial_provider: type: string description: Name and address of the entity providing the sample title: Biomaterial provider example: Tissues-R-Us, Tampa, FL, USA x-airr: miairr: important nullable: true adc-query-support: true set: 2 subset: sample name: Biomaterial provider # 1-to-n relationship between a sample and processing of its cells CellProcessing: discriminator: AIRR type: object required: - tissue_processing - cell_subset - cell_phenotype - single_cell - cell_number - cells_per_reaction - cell_storage - cell_quality - cell_isolation - cell_processing_protocol properties: tissue_processing: type: string description: Enzymatic digestion and/or physical methods used to isolate cells from sample title: Tissue processing example: Collagenase A/Dnase I digested, followed by Percoll gradient x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Tissue processing cell_subset: $ref: '#/Ontology' description: Commonly-used designation of isolated cell population title: Cell subset example: id: CL:0000972 label: class switched memory B cell x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Cell subset format: ontology ontology: draft: false top_node: id: CL:0000542 label: lymphocyte cell_phenotype: type: string description: List of cellular markers and their expression levels used to isolate the cell population title: Cell subset phenotype example: CD19+ CD38+ CD27+ IgM- IgD- x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Cell subset phenotype cell_species: $ref: '#/Ontology' description: > Binomial designation of the species from which the analyzed cells originate. Typically, this value should be identical to `species`, if which case it SHOULD NOT be set explicitly. Howver, there are valid experimental setups in which the two might differ, e.g. chimeric animal models. If set, this key will overwrite the `species` information for all lower layers of the schema. title: Cell species example: id: NCBITAXON:9606 label: Homo sapiens x-airr: miairr: defined nullable: true adc-query-support: true set: 3 subset: process (cell) name: Cell species format: ontology ontology: draft: false top_node: id: NCBITAXON:7776 label: Gnathostomata single_cell: type: boolean description: TRUE if single cells were isolated into separate compartments title: Single-cell sort x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Single-cell sort cell_number: type: integer description: Total number of cells that went into the experiment title: Number of cells in experiment example: 1000000 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Number of cells in experiment cells_per_reaction: type: integer description: Number of cells for each biological replicate title: Number of cells per sequencing reaction example: 50000 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Number of cells per sequencing reaction cell_storage: type: boolean description: TRUE if cells were cryo-preserved between isolation and further processing title: Cell storage example: TRUE x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Cell storage cell_quality: type: string description: Relative amount of viable cells after preparation and (if applicable) thawing title: Cell quality example: 90% viability as determined by 7-AAD x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Cell quality cell_isolation: type: string description: Description of the procedure used for marker-based isolation or enrich cells title: Cell isolation / enrichment procedure example: > Cells were stained with fluorochrome labeled antibodies and then sorted on a FlowMerlin (CE) cytometer. x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Cell isolation / enrichment procedure cell_processing_protocol: type: string description: > Description of the methods applied to the sample including cell preparation/ isolation/enrichment and nucleic acid extraction. This should closely mirror the Materials and methods section in the manuscript. title: Processing protocol example: Stimulated wih anti-CD3/anti-CD28 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (cell) name: Processing protocol # object for PCR primer targets PCRTarget: discriminator: AIRR type: object required: - pcr_target_locus - forward_pcr_primer_target_location - reverse_pcr_primer_target_location properties: pcr_target_locus: type: string enum: - IGH - IGI - IGK - IGL - TRA - TRB - TRD - TRG description: > Designation of the target locus. Note that this field uses a controlled vocubulary that is meant to provide a generic classification of the locus, not necessarily the correct designation according to a specific nomenclature. title: Target locus for PCR example: IGK x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (nucleic acid [pcr]) name: Target locus for PCR format: controlled vocabulary forward_pcr_primer_target_location: type: string description: Position of the most distal nucleotide templated by the forward primer or primer mix title: Forward PCR primer target location example: IGHV, +23 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (nucleic acid [pcr]) name: Forward PCR primer target location reverse_pcr_primer_target_location: type: string description: Position of the most proximal nucleotide templated by the reverse primer or primer mix title: Reverse PCR primer target location example: IGHG, +57 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (nucleic acid [pcr]) name: Reverse PCR primer target location # generally, a 1-to-1 relationship between a CellProcessing and processing of its nucleic acid # but may be 1-to-n for technical replicates. NucleicAcidProcessing: discriminator: AIRR type: object required: - template_class - template_quality - template_amount - library_generation_method - library_generation_protocol - library_generation_kit_version - complete_sequences - physical_linkage properties: template_class: type: string enum: - DNA - RNA description: > The class of nucleic acid that was used as primary starting material for the following procedures title: Target substrate example: RNA x-airr: miairr: essential nullable: false adc-query-support: true set: 3 subset: process (nucleic acid) name: Target substrate format: controlled vocabulary template_quality: type: string description: Description and results of the quality control performed on the template material title: Target substrate quality example: RIN 9.2 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (nucleic acid) name: Target substrate quality template_amount: type: string description: Amount of template that went into the process title: Template amount example: 1000 ng x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (nucleic acid) name: Template amount format: physical quantity library_generation_method: type: string enum: - "PCR" - "RT(RHP)+PCR" - "RT(oligo-dT)+PCR" - "RT(oligo-dT)+TS+PCR" - "RT(oligo-dT)+TS(UMI)+PCR" - "RT(specific)+PCR" - "RT(specific)+TS+PCR" - "RT(specific)+TS(UMI)+PCR" - "RT(specific+UMI)+PCR" - "RT(specific+UMI)+TS+PCR" - "RT(specific)+TS" - "other" description: Generic type of library generation title: Library generation method example: RT(oligo-dT)+TS(UMI)+PCR x-airr: miairr: essential nullable: false adc-query-support: true set: 3 subset: process (nucleic acid) name: Library generation method format: controlled vocabulary library_generation_protocol: type: string description: Description of processes applied to substrate to obtain a library that is ready for sequencing title: Library generation protocol example: cDNA was generated using x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (nucleic acid) name: Library generation protocol library_generation_kit_version: type: string description: When using a library generation protocol from a commercial provider, provide the protocol version number title: Protocol IDs example: v2.1 (2016-09-15) x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (nucleic acid) name: Protocol IDs pcr_target: type: array description: > If a PCR step was performed that specifically targets the IG/TR loci, the target and primer locations need to be provided here. This field holds an array of PCRTarget objects, so that multiplex PCR setups amplifying multiple loci at the same time can be annotated using one record per locus. PCR setups not targeting any specific locus must not annotate this field but select the appropriate library_generation_method instead. items: $ref: '#/PCRTarget' x-airr: nullable: false adc-query-support: true complete_sequences: type: string enum: - partial - complete - "complete+untemplated" - mixed description: > To be considered `complete`, the procedure used for library construction MUST generate sequences that 1) include the first V gene codon that encodes the mature polypeptide chain (i.e. after the leader sequence) and 2) include the last complete codon of the J gene (i.e. 1 bp 5' of the J->C splice site) and 3) provide sequence information for all positions between 1) and 2). To be considered `complete & untemplated`, the sections of the sequences defined in points 1) to 3) of the previous sentence MUST be untemplated, i.e. MUST NOT overlap with the primers used in library preparation. `mixed` should only be used if the procedure used for library construction will likely produce multiple categories of sequences in the given experiment. It SHOULD NOT be used as a replacement of a NULL value. title: Complete sequences example: partial x-airr: miairr: essential nullable: false adc-query-support: true set: 3 subset: process (nucleic acid) name: Complete sequences format: controlled vocabulary physical_linkage: type: string enum: - none - "hetero_head-head" - "hetero_tail-head" - "hetero_prelinked" description: > In case an experimental setup is used that physically links nucleic acids derived from distinct `Rearrangements` before library preparation, this field describes the mode of that linkage. All `hetero_*` terms indicate that in case of paired-read sequencing, the two reads should be expected to map to distinct IG/TR loci. `*_head-head` refers to techniques that link the 5' ends of transcripts in a single-cell context. `*_tail-head` refers to techniques that link the 3' end of one transcript to the 5' end of another one in a single-cell context. This term does not provide any information whether a continuous reading-frame between the two is generated. `*_prelinked` refers to constructs in which the linkage was already present on the DNA level (e.g. scFv). title: Physical linkage of different rearrangements example: hetero_head-head x-airr: miairr: essential nullable: false adc-query-support: true set: 3 subset: process (nucleic acid) name: Physical linkage of different rearrangements format: controlled vocabulary # 1-to-n relationship between a NucleicAcidProcessing and SequencingRun with resultant raw sequence file(s) SequencingRun: discriminator: AIRR type: object required: - sequencing_run_id - total_reads_passing_qc_filter - sequencing_platform - sequencing_facility - sequencing_run_date - sequencing_kit properties: sequencing_run_id: type: string description: ID of sequencing run assigned by the sequencing facility title: Batch number example: 160101_M01234_0201_000000000-D2T7V x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (sequencing) name: Batch number total_reads_passing_qc_filter: type: integer description: Number of usable reads for analysis title: Total reads passing QC filter example: 10365118 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (sequencing) name: Total reads passing QC filter sequencing_platform: type: string description: Designation of sequencing instrument used title: Sequencing platform example: Alumina LoSeq 1000 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (sequencing) name: Sequencing platform sequencing_facility: type: string description: Name and address of sequencing facility title: Sequencing facility example: Seqs-R-Us, Vancouver, BC, Canada x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (sequencing) name: Sequencing facility sequencing_run_date: type: string description: Date of sequencing run title: Date of sequencing run format: date example: 2016-12-16 x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (sequencing) name: Date of sequencing run sequencing_kit: type: string description: Name, manufacturer, order and lot numbers of sequencing kit title: Sequencing kit example: "FullSeq 600, Alumina, #M123456C0, 789G1HK" x-airr: miairr: important nullable: true adc-query-support: true set: 3 subset: process (sequencing) name: Sequencing kit sequencing_files: $ref: '#/RawSequenceData' description: Set of sequencing files produced by the sequencing run x-airr: nullable: false adc-query-support: true # Resultant raw sequencing files from a SequencingRun RawSequenceData: discriminator: AIRR type: object required: - file_type - filename - read_direction - read_length - paired_filename - paired_read_direction - paired_read_length properties: file_type: type: string description: File format for the raw reads or sequences title: Raw sequencing data file type enum: - fasta - fastq x-airr: miairr: important nullable: true adc-query-support: true set: 4 subset: data (raw reads) name: Raw sequencing data file type format: controlled vocabulary filename: type: string description: File name for the raw reads or sequences. The first file in paired-read sequencing. title: Raw sequencing data file name example: MS10R-NMonson-C7JR9_S1_R1_001.fastq x-airr: miairr: important nullable: true adc-query-support: true set: 4 subset: data (raw reads) name: Raw sequencing data file name read_direction: type: string description: Read direction for the raw reads or sequences. The first file in paired-read sequencing. title: Read direction example: forward enum: - forward - reverse - mixed x-airr: miairr: important nullable: true adc-query-support: true set: 4 subset: data (raw reads) name: Read direction format: controlled vocabulary read_length: type: integer description: Read length in bases for the first file in paired-read sequencing title: Forward read length example: 300 x-airr: miairr: important nullable: true adc-query-support: true set: 4 subset: process (sequencing) name: Forward read length paired_filename: type: string description: File name for the second file in paired-read sequencing title: Paired raw sequencing data file name example: MS10R-NMonson-C7JR9_S1_R2_001.fastq x-airr: miairr: important nullable: true adc-query-support: true set: 4 subset: data (raw reads) name: Paired raw sequencing data file name paired_read_direction: type: string description: Read direction for the second file in paired-read sequencing title: Paired read direction example: reverse enum: - forward - reverse - mixed x-airr: miairr: important nullable: true adc-query-support: true set: 4 subset: data (raw reads) name: Paired read direction format: controlled vocabulary paired_read_length: type: integer description: Read length in bases for the second file in paired-read sequencing title: Paired read length example: 300 x-airr: miairr: important nullable: true adc-query-support: true set: 4 subset: process (sequencing) name: Paired read length # 1-to-n relationship between a repertoire and data processing # # Set of annotated rearrangement sequences produced by # data processing upon the raw sequence data for a repertoire. DataProcessing: discriminator: AIRR type: object required: - software_versions - paired_reads_assembly - quality_thresholds - primer_match_cutoffs - collapsing_method - data_processing_protocols - germline_database properties: data_processing_id: type: string description: Identifier for the data processing object. title: Data processing ID x-airr: nullable: true name: Data processing ID adc-query-support: true identifier: true primary_annotation: type: boolean default: false description: > If true, indicates this is the primary or default data processing for the repertoire and its rearrangments. If false, indicates this is a secondary or additional data processing. title: Primary annotation x-airr: nullable: false adc-query-support: true identifier: true software_versions: type: string description: Version number and / or date, include company pipelines title: Software tools and version numbers example: IgBLAST 1.6 x-airr: miairr: important nullable: true adc-query-support: true set: 5 subset: process (computational) name: Software tools and version numbers paired_reads_assembly: type: string description: How paired end reads were assembled into a single receptor sequence title: Paired read assembly example: PandaSeq (minimal overlap 50, threshold 0.8) x-airr: miairr: important nullable: true adc-query-support: true set: 5 subset: process (computational) name: Paired read assembly quality_thresholds: type: string description: How sequences were removed from (4) based on base quality scores title: Quality thresholds example: Average Phred score >=20 x-airr: miairr: important nullable: true adc-query-support: true set: 5 subset: process (computational) name: Quality thresholds primer_match_cutoffs: type: string description: How primers were identified in the sequences, were they removed/masked/etc? title: Primer match cutoffs example: Hamming distance <= 2 x-airr: miairr: important nullable: true adc-query-support: true set: 5 subset: process (computational) name: Primer match cutoffs collapsing_method: type: string description: The method used for combining multiple sequences from (4) into a single sequence in (5) title: Collapsing method example: MUSCLE 3.8.31 x-airr: miairr: important nullable: true adc-query-support: true set: 5 subset: process (computational) name: Collapsing method data_processing_protocols: type: string description: General description of how QC is performed title: Data processing protocols example: Data was processed using [...] x-airr: miairr: important nullable: true adc-query-support: true set: 5 subset: process (computational) name: Data processing protocols data_processing_files: type: array items: type: string description: Array of file names for data produced by this data processing. title: Processed data file names example: - 'ERR1278153_aa.txz' - 'ERR1278153_ab.txz' - 'ERR1278153_ac.txz' x-airr: nullable: true adc-query-support: true name: Processed data file names germline_database: type: string description: Source of germline V(D)J genes with version number or date accessed. title: V(D)J germline reference database example: ENSEMBL, Homo sapiens build 90, 2017-10-01 x-airr: miairr: important nullable: true adc-query-support: true set: 5 subset: data (processed sequence) name: V(D)J germline reference database analysis_provenance_id: type: string description: Identifier for machine-readable PROV model of analysis provenance title: Analysis provenance ID x-airr: nullable: true adc-query-support: true SampleProcessing: discriminator: AIRR type: object properties: sample_processing_id: type: string description: > Identifier for the sample processing object. This field should be unique within the repertoire. This field can be used to uniquely identify the combination of sample, cell processing, nucleic acid processing and sequencing run information for the repertoire. title: Sample processing ID x-airr: nullable: true name: Sample processing ID adc-query-support: true identifier: true # The composite schema for the repertoire object # # This represents a sample repertoire as defined by the study # and experimentally observed by raw sequence data. A repertoire # can only be for one subject but may include multiple samples. Repertoire: discriminator: AIRR type: object required: - study - subject - sample - data_processing properties: repertoire_id: type: string description: > Identifier for the repertoire object. This identifier should be globally unique so that repertoires from multiple studies can be combined together without conflict. The repertoire_id is used to link other AIRR data to a Repertoire. Specifically, the Rearrangements Schema includes repertoire_id for referencing the specific Repertoire for that Rearrangement. title: Repertoire ID x-airr: nullable: true adc-query-support: true identifier: true repertoire_name: type: string description: Short generic display name for the repertoire title: Repertoire name x-airr: nullable: true name: Repertoire name adc-query-support: true repertoire_description: type: string description: Generic repertoire description title: Repertoire description x-airr: nullable: true name: Repertoire description adc-query-support: true study: $ref: '#/Study' description: Study object x-airr: nullable: false adc-query-support: true subject: $ref: '#/Subject' description: Subject object x-airr: nullable: false adc-query-support: true sample: type: array description: List of Sample objects items: allOf: - $ref: '#/SampleProcessing' - $ref: '#/Sample' - $ref: '#/CellProcessing' - $ref: '#/NucleicAcidProcessing' - $ref: '#/SequencingRun' x-airr: nullable: false adc-query-support: true data_processing: type: array description: List of Data Processing objects items: $ref: '#/DataProcessing' x-airr: nullable: false adc-query-support: true Alignment: discriminator: AIRR type: object required: - sequence_id - segment - call - score - cigar properties: sequence_id: type: string description: > Unique query sequence identifier within the file. Most often this will be the input sequence header or a substring thereof, but may also be a custom identifier defined by the tool in cases where query sequences have been combined in some fashion prior to alignment. segment: type: string description: > The segment for this alignment. One of V, D, J or C. rev_comp: type: boolean description: > Alignment result is from the reverse complement of the query sequence. call: type: string description: > Gene assignment with allele. score: type: number description: > Alignment score. identity: type: number description: > Alignment fractional identity. support: type: number description: > Alignment E-value, p-value, likelihood, probability or other similar measure of support for the gene assignment as defined by the alignment tool. cigar: type: string description: > Alignment CIGAR string. sequence_start: type: integer description: > Start position of the segment in the query sequence (1-based closed interval). sequence_end: type: integer description: > End position of the segment in the query sequence (1-based closed interval). germline_start: type: integer description: > Alignment start position in the reference sequence (1-based closed interval). germline_end: type: integer description: > Alignment end position in the reference sequence (1-based closed interval). rank: type: integer description: > Alignment rank. rearrangement_id: type: string description: > Identifier for the Rearrangement object. May be identical to sequence_id, but will usually be a universally unique record locator for database applications. data_processing_id: type: string description: > Identifier to the data processing object in the repertoire metadata for this rearrangement. If this field is empty than the primary data processing object is assumed. germline_database: type: string description: Source of germline V(D)J genes with version number or date accessed. example: ENSEMBL, Homo sapiens build 90, 2017-10-01 x-airr: deprecated: true deprecated-description: Field was moved up to the DataProcessing level to avoid data duplication. deprecated-replaced-by: - "DataProcessing:germline_database" # The extended rearrangement object Rearrangement: discriminator: AIRR type: object required: - sequence_id - sequence - rev_comp - productive - v_call - d_call - j_call - sequence_alignment - germline_alignment - junction - junction_aa - v_cigar - d_cigar - j_cigar properties: sequence_id: type: string description: > Unique query sequence identifier for the Rearrangment. Most often this will be the input sequence header or a substring thereof, but may also be a custom identifier defined by the tool in cases where query sequences have been combined in some fashion prior to alignment. When downloaded from an AIRR Data Commons repository, this will usually be a universally unique record locator for linking with other objects in the AIRR Data Model. x-airr: adc-query-support: true identifier: true sequence: type: string description: > The query nucleotide sequence. Usually, this is the unmodified input sequence, which may be reverse complemented if necessary. In some cases, this field may contain consensus sequences or other types of collapsed input sequences if these steps are performed prior to alignment. sequence_aa: type: string description: > Amino acid translation of the query nucleotide sequence. rev_comp: type: boolean description: > True if the alignment is on the opposite strand (reverse complemented) with respect to the query sequence. If True then all output data, such as alignment coordinates and sequences, are based on the reverse complement of 'sequence'. productive: type: boolean description: > True if the V(D)J sequence is predicted to be productive. x-airr: adc-query-support: true vj_in_frame: type: boolean description: True if the V and J gene alignments are in-frame. stop_codon: type: boolean description: True if the aligned sequence contains a stop codon. complete_vdj: type: boolean description: > True if the sequence alignment spans the entire V(D)J region. Meaning, sequence_alignment includes both the first V gene codon that encodes the mature polypeptide chain (i.e., after the leader sequence) and the last complete codon of the J gene (i.e., before the J-C splice site). This does not require an absence of deletions within the internal FWR and CDR regions of the alignment. locus: type: string enum: - IGH - IGI - IGK - IGL - TRA - TRB - TRD - TRG description: > Gene locus (chain type). Note that this field uses a controlled vocabulary that is meant to provide a generic classification of the locus, not necessarily the correct designation according to a specific nomenclature. title: Gene locus example: IGH x-airr: nullable: true adc-query-support: true name: Gene locus format: controlled vocabulary v_call: type: string description: > V gene with allele. If referring to a known reference sequence in a database the relevant gene/allele nomenclature should be followed (e.g., IGHV4-59*01 if using IMGT/GENE-DB). title: V gene with allele example: IGHV4-59*01 x-airr: miairr: important nullable: true adc-query-support: true set: 6 subset: data (processed sequence) name: V gene with allele d_call: type: string description: > First or only D gene with allele. If referring to a known reference sequence in a database the relevant gene/allele nomenclature should be followed (e.g., IGHD3-10*01 if using IMGT/GENE-DB). title: D gene with allele example: IGHD3-10*01 x-airr: miairr: important nullable: true adc-query-support: true set: 6 subset: data (processed sequence) name: D gene with allele d2_call: type: string description: > Second D gene with allele. If referring to a known reference sequence in a database the relevant gene/allele nomenclature should be followed (e.g., IGHD3-10*01 if using IMGT/GENE-DB). example: IGHD3-10*01 j_call: type: string description: > J gene with allele. If referring to a known reference sequence in a database the relevant gene/allele nomenclature should be followed (e.g., IGHJ4*02 if using IMGT/GENE-DB). title: J gene with allele example: IGHJ4*02 x-airr: miairr: important nullable: true adc-query-support: true set: 6 subset: data (processed sequence) name: J gene with allele c_call: type: string description: > Constant region gene with allele. If referring to a known reference sequence in a database the relevant gene/allele nomenclature should be followed (e.g., IGHG1*01 if using IMGT/GENE-DB). title: C region example: IGHG1*01 x-airr: miairr: important nullable: true adc-query-support: true set: 6 subset: data (processed sequence) name: C region sequence_alignment: type: string description: > Aligned portion of query sequence, including any indel corrections or numbering spacers, such as IMGT-gaps. Typically, this will include only the V(D)J region, but that is not a requirement. sequence_alignment_aa: type: string description: > Amino acid translation of the aligned query sequence. germline_alignment: type: string description: > Assembled, aligned, full-length inferred germline sequence spanning the same region as the sequence_alignment field (typically the V(D)J region) and including the same set of corrections and spacers (if any). germline_alignment_aa: type: string description: > Amino acid translation of the assembled germline sequence. junction: type: string description: > Junction region nucleotide sequence, where the junction is defined as the CDR3 plus the two flanking conserved codons. title: IMGT-JUNCTION nucleotide sequence example: TGTGCAAGAGCGGGAGTTTACGACGGATATACTATGGACTACTGG x-airr: miairr: important nullable: true set: 6 subset: data (processed sequence) name: IMGT-JUNCTION nucleotide sequence junction_aa: type: string description: > Amino acid translation of the junction. title: IMGT-JUNCTION amino acid sequence example: CARAGVYDGYTMDYW x-airr: miairr: important nullable: true adc-query-support: true set: 6 subset: data (processed sequence) name: IMGT-JUNCTION amino acid sequence np1: type: string description: > Nucleotide sequence of the combined N/P region between the V gene and first D gene alignment or between the V gene and J gene alignments. np1_aa: type: string description: > Amino acid translation of the np1 field. np2: type: string description: > Nucleotide sequence of the combined N/P region between either the first D gene and J gene alignments or the first D gene and second D gene alignments. np2_aa: type: string description: > Amino acid translation of the np2 field. np3: type: string description: > Nucleotide sequence of the combined N/P region between the second D gene and J gene alignments. np3_aa: type: string description: > Amino acid translation of the np3 field. cdr1: type: string description: > Nucleotide sequence of the aligned CDR1 region. cdr1_aa: type: string description: > Amino acid translation of the cdr1 field. cdr2: type: string description: > Nucleotide sequence of the aligned CDR2 region. cdr2_aa: type: string description: > Amino acid translation of the cdr2 field. cdr3: type: string description: > Nucleotide sequence of the aligned CDR3 region. cdr3_aa: type: string description: > Amino acid translation of the cdr3 field. fwr1: type: string description: > Nucleotide sequence of the aligned FWR1 region. fwr1_aa: type: string description: > Amino acid translation of the fwr1 field. fwr2: type: string description: > Nucleotide sequence of the aligned FWR2 region. fwr2_aa: type: string description: > Amino acid translation of the fwr2 field. fwr3: type: string description: > Nucleotide sequence of the aligned FWR3 region. fwr3_aa: type: string description: > Amino acid translation of the fwr3 field. fwr4: type: string description: > Nucleotide sequence of the aligned FWR4 region. fwr4_aa: type: string description: > Amino acid translation of the fwr4 field. v_score: type: number description: Alignment score for the V gene. v_identity: type: number description: Fractional identity for the V gene alignment. v_support: type: number description: > V gene alignment E-value, p-value, likelihood, probability or other similar measure of support for the V gene assignment as defined by the alignment tool. v_cigar: type: string description: CIGAR string for the V gene alignment. d_score: type: number description: Alignment score for the first or only D gene alignment. d_identity: type: number description: Fractional identity for the first or only D gene alignment. d_support: type: number description: > D gene alignment E-value, p-value, likelihood, probability or other similar measure of support for the first or only D gene as defined by the alignment tool. d_cigar: type: string description: CIGAR string for the first or only D gene alignment. d2_score: type: number description: Alignment score for the second D gene alignment. d2_identity: type: number description: Fractional identity for the second D gene alignment. d2_support: type: number description: > D gene alignment E-value, p-value, likelihood, probability or other similar measure of support for the second D gene as defined by the alignment tool. d2_cigar: type: string description: CIGAR string for the second D gene alignment. j_score: type: number description: Alignment score for the J gene alignment. j_identity: type: number description: Fractional identity for the J gene alignment. j_support: type: number description: > J gene alignment E-value, p-value, likelihood, probability or other similar measure of support for the J gene assignment as defined by the alignment tool. j_cigar: type: string description: CIGAR string for the J gene alignment. c_score: type: number description: Alignment score for the C gene alignment. c_identity: type: number description: Fractional identity for the C gene alignment. c_support: type: number description: > C gene alignment E-value, p-value, likelihood, probability or other similar measure of support for the C gene assignment as defined by the alignment tool. c_cigar: type: string description: CIGAR string for the C gene alignment. v_sequence_start: type: integer description: > Start position of the V gene in the query sequence (1-based closed interval). v_sequence_end: type: integer description: > End position of the V gene in the query sequence (1-based closed interval). v_germline_start: type: integer description: > Alignment start position in the V gene reference sequence (1-based closed interval). v_germline_end: type: integer description: > Alignment end position in the V gene reference sequence (1-based closed interval). v_alignment_start: type: integer description: > Start position of the V gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). v_alignment_end: type: integer description: > End position of the V gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). d_sequence_start: type: integer description: > Start position of the first or only D gene in the query sequence. (1-based closed interval). d_sequence_end: type: integer description: > End position of the first or only D gene in the query sequence. (1-based closed interval). d_germline_start: type: integer description: > Alignment start position in the D gene reference sequence for the first or only D gene (1-based closed interval). d_germline_end: type: integer description: > Alignment end position in the D gene reference sequence for the first or only D gene (1-based closed interval). d_alignment_start: type: integer description: > Start position of the first or only D gene in both the sequence_alignment and germline_alignment fields (1-based closed interval). d_alignment_end: type: integer description: > End position of the first or only D gene in both the sequence_alignment and germline_alignment fields (1-based closed interval). d2_sequence_start: type: integer description: > Start position of the second D gene in the query sequence (1-based closed interval). d2_sequence_end: type: integer description: > End position of the second D gene in the query sequence (1-based closed interval). d2_germline_start: type: integer description: > Alignment start position in the second D gene reference sequence (1-based closed interval). d2_germline_end: type: integer description: > Alignment end position in the second D gene reference sequence (1-based closed interval). d2_alignment_start: type: integer description: > Start position of the second D gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). d2_alignment_end: type: integer description: > End position of the second D gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). j_sequence_start: type: integer description: > Start position of the J gene in the query sequence (1-based closed interval). j_sequence_end: type: integer description: > End position of the J gene in the query sequence (1-based closed interval). j_germline_start: type: integer description: > Alignment start position in the J gene reference sequence (1-based closed interval). j_germline_end: type: integer description: > Alignment end position in the J gene reference sequence (1-based closed interval). j_alignment_start: type: integer description: > Start position of the J gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). j_alignment_end: type: integer description: > End position of the J gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). cdr1_start: type: integer description: CDR1 start position in the query sequence (1-based closed interval). cdr1_end: type: integer description: CDR1 end position in the query sequence (1-based closed interval). cdr2_start: type: integer description: CDR2 start position in the query sequence (1-based closed interval). cdr2_end: type: integer description: CDR2 end position in the query sequence (1-based closed interval). cdr3_start: type: integer description: CDR3 start position in the query sequence (1-based closed interval). cdr3_end: type: integer description: CDR3 end position in the query sequence (1-based closed interval). fwr1_start: type: integer description: FWR1 start position in the query sequence (1-based closed interval). fwr1_end: type: integer description: FWR1 end position in the query sequence (1-based closed interval). fwr2_start: type: integer description: FWR2 start position in the query sequence (1-based closed interval). fwr2_end: type: integer description: FWR2 end position in the query sequence (1-based closed interval). fwr3_start: type: integer description: FWR3 start position in the query sequence (1-based closed interval). fwr3_end: type: integer description: FWR3 end position in the query sequence (1-based closed interval). fwr4_start: type: integer description: FWR4 start position in the query sequence (1-based closed interval). fwr4_end: type: integer description: FWR4 end position in the query sequence (1-based closed interval). v_sequence_alignment: type: string description: > Aligned portion of query sequence assigned to the V gene, including any indel corrections or numbering spacers. v_sequence_alignment_aa: type: string description: > Amino acid translation of the v_sequence_alignment field. d_sequence_alignment: type: string description: > Aligned portion of query sequence assigned to the first or only D gene, including any indel corrections or numbering spacers. d_sequence_alignment_aa: type: string description: > Amino acid translation of the d_sequence_alignment field. d2_sequence_alignment: type: string description: > Aligned portion of query sequence assigned to the second D gene, including any indel corrections or numbering spacers. d2_sequence_alignment_aa: type: string description: > Amino acid translation of the d2_sequence_alignment field. j_sequence_alignment: type: string description: > Aligned portion of query sequence assigned to the J gene, including any indel corrections or numbering spacers. j_sequence_alignment_aa: type: string description: > Amino acid translation of the j_sequence_alignment field. c_sequence_alignment: type: string description: > Aligned portion of query sequence assigned to the constant region, including any indel corrections or numbering spacers. c_sequence_alignment_aa: type: string description: > Amino acid translation of the c_sequence_alignment field. v_germline_alignment: type: string description: > Aligned V gene germline sequence spanning the same region as the v_sequence_alignment field and including the same set of corrections and spacers (if any). v_germline_alignment_aa: type: string description: > Amino acid translation of the v_germline_alignment field. d_germline_alignment: type: string description: > Aligned D gene germline sequence spanning the same region as the d_sequence_alignment field and including the same set of corrections and spacers (if any). d_germline_alignment_aa: type: string description: > Amino acid translation of the d_germline_alignment field. d2_germline_alignment: type: string description: > Aligned D gene germline sequence spanning the same region as the d2_sequence_alignment field and including the same set of corrections and spacers (if any). d2_germline_alignment_aa: type: string description: > Amino acid translation of the d2_germline_alignment field. j_germline_alignment: type: string description: > Aligned J gene germline sequence spanning the same region as the j_sequence_alignment field and including the same set of corrections and spacers (if any). j_germline_alignment_aa: type: string description: > Amino acid translation of the j_germline_alignment field. c_germline_alignment: type: string description: > Aligned constant region germline sequence spanning the same region as the c_sequence_alignment field and including the same set of corrections and spacers (if any). c_germline_alignment_aa: type: string description: > Amino acid translation of the c_germline_aligment field. junction_length: type: integer description: Number of nucleotides in the junction sequence. junction_aa_length: type: integer description: Number of amino acids in the junction sequence. x-airr: adc-query-support: true np1_length: type: integer description: > Number of nucleotides between the V gene and first D gene alignments or between the V gene and J gene alignments. np2_length: type: integer description: > Number of nucleotides between either the first D gene and J gene alignments or the first D gene and second D gene alignments. np3_length: type: integer description: > Number of nucleotides between the second D gene and J gene alignments. n1_length: type: integer description: Number of untemplated nucleotides 5' of the first or only D gene alignment. n2_length: type: integer description: Number of untemplated nucleotides 3' of the first or only D gene alignment. n3_length: type: integer description: Number of untemplated nucleotides 3' of the second D gene alignment. p3v_length: type: integer description: Number of palindromic nucleotides 3' of the V gene alignment. p5d_length: type: integer description: Number of palindromic nucleotides 5' of the first or only D gene alignment. p3d_length: type: integer description: Number of palindromic nucleotides 3' of the first or only D gene alignment. p5d2_length: type: integer description: Number of palindromic nucleotides 5' of the second D gene alignment. p3d2_length: type: integer description: Number of palindromic nucleotides 3' of the second D gene alignment. p5j_length: type: integer description: Number of palindromic nucleotides 5' of the J gene alignment. consensus_count: type: integer description: > Number of reads contributing to the (UMI) consensus for this sequence. For example, the sum of the number of reads for all UMIs that contribute to the query sequence. duplicate_count: type: integer description: > Copy number or number of duplicate observations for the query sequence. For example, the number of UMIs sharing an identical sequence or the number of identical observations of this sequence absent UMIs. title: Read count example: 123 x-airr: miairr: important nullable: true set: 6 subset: data (processed sequence) name: Read count cell_id: type: string description: > Identifier defining the cell of origin for the query sequence. title: Cell index example: W06_046_091 x-airr: miairr: important nullable: true adc-query-support: true identifier: true set: 6 subset: data (processed sequence) name: Cell index clone_id: type: string description: Clonal cluster assignment for the query sequence. x-airr: nullable: true adc-query-support: true identifier: true repertoire_id: type: string description: Identifier to the associated repertoire in study metadata. x-airr: nullable: true adc-query-support: true identifier: true sample_processing_id: type: string description: > Identifier to the sample processing object in the repertoire metadata for this rearrangement. If the repertoire has a single sample then this field may be empty or missing. If the repertoire has multiple samples then this field may be empty or missing if the sample cannot be differentiated or the relationship is not maintained by the data processing. x-airr: nullable: true adc-query-support: true identifier: true data_processing_id: type: string description: > Identifier to the data processing object in the repertoire metadata for this rearrangement. If this field is empty than the primary data processing object is assumed. x-airr: nullable: true adc-query-support: true identifier: true rearrangement_id: type: string description: > Identifier for the Rearrangement object. May be identical to sequence_id, but will usually be a univerally unique record locator for database applications. x-airr: deprecated: true deprecated-description: Field has been merged with sequence_id to avoid confusion. deprecated-replaced-by: - sequence_id rearrangement_set_id: type: string description: > Identifier for grouping Rearrangement objects. x-airr: deprecated: true deprecated-description: Field has been replaced by other specialized identifiers. deprecated-replaced-by: - repertoire_id - sample_processing_id - data_processing_id germline_database: type: string description: Source of germline V(D)J genes with version number or date accessed. example: ENSEMBL, Homo sapiens build 90, 2017-10-01 x-airr: deprecated: true deprecated-description: Field was moved up to the DataProcessing level to avoid data duplication. deprecated-replaced-by: - "DataProcessing:germline_database" # A unique inferred clone object that has been constructed within a single data processing # for a single repertoire and a subset of its sequences and/or rearrangements. Clone: discriminator: AIRR type: object required: - clone_id - germline_alignment properties: clone_id: type: string description: Identifier for the clone. repertoire_id: type: string description: Identifier to the associated repertoire in study metadata. x-airr: nullable: true adc-query-support: true data_processing_id: type: string description: Identifier of the data processing object in the repertoire metadata for this clone. x-airr: nullable: true adc-query-support: true sequences: type: array items: type: string description: > List sequence_id strings that act as keys to the Rearrangement records for members of the clone. v_call: type: string description: > V gene with allele of the inferred ancestral of the clone. For example, IGHV4-59*01. example: IGHV4-59*01 d_call: type: string description: > D gene with allele of the inferred ancestor of the clone. For example, IGHD3-10*01. example: IGHD3-10*01 j_call: type: string description: > J gene with allele of the inferred ancestor of the clone. For example, IGHJ4*02. example: IGHJ4*02 junction: type: string description: > Nucleotide sequence for the junction region of the inferred ancestor of the clone, where the junction is defined as the CDR3 plus the two flanking conserved codons. junction_aa: type: string description: > Amino acid translation of the junction. junction_length: type: integer description: Number of nucleotides in the junction. junction_aa_length: type: integer description: Number of amino acids in junction_aa. germline_alignment: type: string description: > Assembled, aligned, full-length inferred ancestor of the clone spanning the same region as the sequence_alignment field of nodes (typically the V(D)J region) and including the same set of corrections and spacers (if any). germline_alignment_aa: type: string description: > Amino acid translation of germline_alignment. v_alignment_start: type: integer description: > Start position in the V gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). v_alignment_end: type: integer description: > End position in the V gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). d_alignment_start: type: integer description: > Start position of the D gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). d_alignment_end: type: integer description: > End position of the D gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). j_alignment_start: type: integer description: > Start position of the J gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). j_alignment_end: type: integer description: > End position of the J gene alignment in both the sequence_alignment and germline_alignment fields (1-based closed interval). junction_start: type: integer description: Junction region start position in the alignment (1-based closed interval). junction_end: type: integer description: Junction region end position in the alignment (1-based closed interval). sequence_count: type: integer description: Number of Rearrangement records (sequences) included in this clone seed_id: type: string description: sequence_id of the seed sequence. Empty string (or null) if there is no seed sequence. # 1-to-n relationship for a clone to its trees. Tree: discriminator: AIRR type: object required: - tree_id - clone_id - newick properties: tree_id: type: string description: Identifier for the tree. clone_id: type: string description: Identifier for the clone. newick: type: string description: Newick string of the tree edges. nodes: type: object description: Dictionary of nodes in the tree, keyed by sequence_id string additionalProperties: $ref: '#/Node' # 1-to-n relationship between a tree and its nodes Node: discriminator: AIRR type: object required: - sequence_id properties: sequence_id: type: string description: > Identifier for this node that matches the identifier in the newick string and, where possible, the sequence_id in the source repertoire. sequence_alignment: type: string description: > Nucleotide sequence of the node, aligned to the germline_alignment for this clone, including including any indel corrections or spacers. junction: type: string description: > Junction region nucleotide sequence for the node, where the junction is defined as the CDR3 plus the two flanking conserved codons. junction_aa: type: string description: > Amino acid translation of the junction. # The cell object acts as point of reference for all data that can be related # to an individual cell, either by direct observation or inference. Cell: discriminator: AIRR type: object required: - cell_id #redefined cell_id > how to centralize it in the yaml - rearrangements - repertoire_id - virtual_pairing properties: cell_id: type: string description: > Identifier defining the cell of origin for the query sequence. title: Cell index example: W06_046_091 x-airr: miairr: defined nullable: false adc-query-support: true name: Cell index rearrangements: type: array description: > Array of sequence identifiers defined for the Rearrangement object title: Cell-associated rearrangements items: type: string example: [id1, id2] #empty vs NULL? x-airr: miairr: defined nullable: true adc-query-support: true name: Cell-associated rearrangements receptors: type: array description: > Array of receptor identifiers defined for the Receptor object title: Cell-associated receptors items: type: string example: [id1, id2] #empty vs NULL? x-airr: miairr: defined nullable: true adc-query-support: true name: Cell-associated receptors repertoire_id: type: string description: Identifier to the associated repertoire in study metadata. title: Parental repertoire of cell x-airr: miairr: defined nullable: true adc-query-support: true name: Parental repertoire of cell data_processing_id: type: string description: Identifier of the data processing object in the repertoire metadata for this clone. title: Data processing for cell x-airr: miairr: defined nullable: true adc-query-support: true name: Data processing for cell expression_study_method: type: string enum: flow cytometry single-cell transcriptome description: > keyword describing the methodology used to assess expression. This values for this field MUST come from a controlled vocabulary x-airr: miairr: defined nullable: true adc-api-optional: true expression_raw_doi: type: string description: > DOI of raw data set containing the current event x-airr: miairr: defined nullable: true adc-api-optional: true expression_index: type: string description: > Index addressing the current event within the raw data set. x-airr: miairr: defined nullable: true adc-api-optional: true expression_tabular: type: array description: > Expression definitions for single-cell items: type: object properties: expression_marker: type: string description: > standardized designation of the transcript or epitope example: CD27 expression_value: type: integer description: > transformed and normalized expression level. example: 14567 virtual_pairing: type: boolean description: > boolean to indicate if pairing was inferred. title: Virtual pairing x-airr: miairr: defined nullable: true # assuming only done for sc experiments, otherwise does not exist adc-query-support: true name: Virtual pairing airr/inst/extdata/rearrangement-example.tsv.gz0000644000176200001440000005404413402556313021267 0ustar liggesuserst[rearrangement-example.tsv[w#5g0> L!եd*2O^eWMݿK܃d%U%%EA2}6?vw[w??O//a?/Oӏkw''_ǿ?GwI?^72CoK?~?һ~'ÿbx 8?8?q?_8|/痿e/"??Ad*GFv?3F 徍~wӘCჴ6}AݷqqwVݣܳc(| NttwuW| roBSౚ^{ݸ3O0޽, 9=t>uߖg/~ˡy8k2|u /\b^-ם'- }f|p Ίjp,zzzOyS_@u֩WtSoO= |x4q장9e" ﳲ˭۲CI?F~Vh+y`bw^ <-aHP= lD6+ˣ U@d @ @9ƁS@brqKA!"  y9}dۧd?|̞Yrx3:fu S|wKQOq"eg/Z` *i0r'/.ˬ r׍8PDӍhPu61(Ut Yw=!O$qgqô9\!@$wm 8Ñ! ^|! ہ#e=s!;D)Ē(k" <HE P3J!wug~{!.灖zz^9#$4+a35QqP-Q $zc"DDv`7Rzv/$g&s$c_+wbsK.>5eRRvˁ%;* ٰˤW6'{Yun渺~ױ 7 4k)w8eE)-@*p(e\1Qڀ{DmÝTJ*Vϸ5w~dre)((86JziՄHKw%8!J^i-򳠺+=z+꫔$N;ɬq.//]f|1]Z;kc "FE6;Hf9S4 E,࿂$jIl3V4e e9'3^۱͉]4͋RUb*/0w'pt`AT\.!]3 " (`"\[?4Up<"p(!70\頋u1m?ۯr?+5+叁PMp=--@C}W6T@ *k/_{x ŒgWgh8y%3??GByG 7* a@Y@W5FI`5΀]BSD{#Jj 9O"y{e"Ywև>~/btSObb11Ә>&˗ b01`Ә;gqs!GN`tRw//o"LRb5%sp,ǠKU iy 영/)@ށٻ3v֧\o;{e)C%1CǚJ\{ bCLOds% ^ փ@ǂ~D0 gB>.ה TɋmD6_hϸ"!B7uGsPieG?$<\RL)΀e1)G+9D+B ^bu 0 1hiWTAJ/HEJ`R\aڳ0@dP}pۙnSPgr,Y_hd|4MW_zdH1 ?4pj_ kS( P :QЊ8SMYY1E &Ba=τeL3`EmJҵEm2܊Ҳ0?d%O2 JUpY3#wԻAo@H5ʖͮhvJJ;f^p#NW^"`m`(jډBXrՋ* e',f=  xlB,{~p=`V;zKK>,e ꓗ }"q'4 :(huDA D JXWT{'2Esg'fUsǃ޻$}Fi5HSJ K!ZX'U& 2h( ex / v` HkCk80eL#R@}: bDkB` g|MA5az'h&6*TІTY9/In+"8Bz?RKR%$V8ڄd4__CGO'E "S5`q'TTa0+zc{!(qW@؊rj~pkR˩x\6f#(G=Rq6ژ/ Ls]>=?ۗ=ǜyFh/~E+HyU$Wv"\u$tAhdKU#ꇣEa* 6- W)B)Ny}ꮌO9M!&H,EE-WHM _Qp%N!9Ejqپ8gfAG\R[C'RU;-IےW+O>HEl=::1>z_""9~z|:⎯%zXx s eig%iPen$w%o MlͶ}&pF٥ 6)]k w}b;~6-k& bLaUX;(^"S-W])u,՝9hst6E e͡1}N`} d 26QIѓ? uKZ'p_|WJ.u_.ri慍]>nsQf#m8{ekd(u@|I,<~ 3F9 z/`B"'A Ăw*YSψWtb5;T7,ޯ2}̖S_ Lw]o WC\&.q>{}`ba{dLQTғ*^dCU/T$"ؒu/S6*lPšF`ȅ3s}MLdT<|9UIx|JLz"ۉDCH#`|$3."b&-- 7 5g,jihYg+EqIϾJ3pG!9o İo{emZS7iC-|뜥 {qk'ͻr?mxBA*M NG\}ծ'{d^Rѷh=BlI 5iwmiJ,qhwxqJWխS?Um=xƬH&<})sW˗<}_zzmTVO SD*X#7U=C~]7xiXCJH3^vQ̝1OhZe:LvS ى7ͮPfP4dM+ܡ{ Tf8[ TL8 E!'_YTMTwYX )/j=`*c} ]a~Ú( $&3k-.ݏ1 8{_ #xh,kgo+%909P;?~:tܼ5m66 +Nu[dԀI}N0q] w7#YQ ٸ{1Y_Bq.f"HS3>3?3<5ùFg $6ىmDO3ó=2QT&YZP3θT]Jf=j3]W5 />lnн++<.}9,Pp ߤy&YQzI$UCZcԉg[ٟ߬zg}_4r^v fM|nҾhs=L^Q3#WP1WP|RM(ae~ji дT&P{KMYV{1S< XCy?p߬*)*qHΠ~DԞ7d|f5i3 i@X6Lِv)W#ny-v؀$s[n Y8 W3 3dz+?E++怰zIR [Ju˨kk" *w3P1Ql'2:8pDZvwl>DYupfTB⒌eQOK2A 0p%ƆJ iq݀/@R1ea\gYr1% "b]D5`ip=e7\"9dSCփh>|a!m(̬^CLBA0U\[ԴEMZ`^t_P2sw;_k[-'ػ%| 0i.+o(Ym<HA/``Q]vFoE_ȊI'0# k\Cfy\[Z5O`@G_"eZ`=`OLƲ[L>-Td'jh b^Gœeii#h,r\dSfM/XW#vr}rdlL,i9W6'/CA 궃"b&oK ՓH,?nRQZɘVoUt8U q7$s#˫dK((Ky}Ò8d*|Y8 ?rAy7P؆D3|O-bN&ln`%3ծs'´Cl6ܾI{ƋzƋzvIS[7ȊMFщ&"3 rU$Ar^0.½3=%R0W1ĔX^_uOkFJ!Rh|7 M%yޮcvO1yH1Nmu|B_:(pJmE=YC)-G=eNnM3,B|S^tSAaڥjbR;B)'MPoYf HI3Z&8`m<\ Ч[pfE3o=tN99o ^*lafg,YBy|]^ l%5v0L:su"  /Lq9c,cTTQ}0!\>j+8Ky%G8>U"~CM&[ZHKׯ/'fX26V C"ʧH O6ۓKA(Jd.qV9Nv4!. ͮԚRO- !\X8b|3QBQ)_)hx !}4Y*\T4s bʠbGOw4Nڨ>LLc`}\}]pԆ?"3k_)6r!Ղj6e"l4!-7U|)/C幪M.ϝoa)򬞠ӽ0UaN6klp`^r|JdhJ\& ;:4?,&.,XP5qq/ [|fI( \Cf`[D~/O|QpGYt< T8P'S%ab\6$ ҉{f1Dc *{FA~Ҙ8OMuo uO0ۦ\x FaaF//O.0gZ?5>HgZKu&+].q;j?<śW\W6>73-bXm{ݧ*ٕQpFޓ#lSr_ 7WUnI7ztJN[Ȗbb qP0>Q\ZKsJi(j1jiJ62j{JFRf=:> f,y-/ xĔxed2Jڪ0hz^;L`ķ1aiLXרaH" ` /w_g 3XGLI91aI_=W9Haʖ6+C #xHw3`aWt ΰt]Jb8S3#Kb7A#@]U5#99]9 ɃqF1/a"HYW0i]#8gߞz4qk^%D] k{2;Pgo C90soxG]mO$|=$Tm7Kٴ᠞߇ yAw\wILgeQƽM 5 u1A"Cަ5P?w;R-"?#ݛ(<G,aP&I=ҽ5JrBȍjG9#ipaD E\bR%W s>r6J>Kհ>uPo)0kC1)Q_̩=DI:/,H4+/!Q2hf\5liAC-AV0u3&(k5~渓D;m?HcBoۘf^[q@knZ>.Xg| q&"܍dY9CDs T﷦ qޓ=? ?->4PB|dp, 7jf1Z t,`uDq` Kao\B9NL/A|;=7щ@Q+9\x `[0j"%DyY_C?WC+eӷ ͦs"(Y_##+֑LiMnd2n[ r^l$?IŌ 2$^׭^rrЦ<W{b8F6@ <?LD<0RX'AVo Kk MŽl?JOe> `CVOj :M~/-7t]:SPe~U@ # oT T0c|c|aF<{O{I_ C˾>H}G H` q+j*Q">i#\j.򖳴[TP-Vps"geQ~P˜ޥAjIMˀ8GU] =Ɨ8@3jLOl}3nh2VZ h^Re]AxA«3)|3t$j;9Ej Im wm]pEBz!ڌMC)O"AI=lD)R"&Dz,${-H~MPTxӷw}į6oA?R_\eq,Cx"]Rhmdptʋ.AVﳷ"QEP]=|燛~STt6w)_rOϒγ 7ys9 eBy* 6o:n5r5Gb?EJg0M0U6T OZ 0ѫ4N\8vo辣 >5ŧ¡4U:xI|.*TzEeSf7;fs#x>$-O!}: aP:'1v )NKTF#Y7ͻvw~]O%w֥n$KVwJ_ uf{(E.׃Lži.ʌc`&¼y%*UDn"Ooևm/qIyVY@rV?\*XMXu!82xRdVApjA4XlW4Ѹ}Lܩi1i*=[Toa+XNlZ|\ ;aY+E7b懫\D;ڼ`;L?MceTsRQYi 4  8r3 Fk#0y%70Li/(x0lF[9Ntxq#e~iY~c YsaʜSǦnűq w5u3ϝ6uh R )Vfp aO^X;x8Ĉ5dHIYpBW!Œ0Q E41oЪak< ,!82@i|AK6P^\҇y8ҷ~YZA(8/&wJ1н>Bʄ~B44CH$3 4ϻԏQcIx'Oh5La m0#Y;ZnDk+{ S<މcSE5;UTGYl 9Zk _: YYJgq \{n(m#b6]%}קsK`.=yY.YZLVk_>z}V]D+h(%̡(8s^ۘmp}iGYGө(݆_"*νx ]f轜hԨr (a1pQP§"HA4p͔H+֗H;_LwDH)=?6VpdL0HW]aUj)^X-9|=}}/fneQ$~!1g.89Gk0GF,נ(7;)r׺&.DUL(䶥@jYDRiZjF&5r! ~ZsJ@x*4Ϗ@&ˋW-@Nt@Vxա.=%ϙ$|^Z Tľel7:x֞3Y{RNֿ<]fA75p92)'pg $KƐCB$h!qR!pv۲4(E{d^hM0k((iag$峗DGjËeˢn Jl+; W(9k ni丵V puY,&Fe1i'*~A5[l)Mpej82\xQN̯l4RɲM(^ďa8CIW>< }L #@.`̮b}-zj%oS[U^h :!g^RuH9vo&jΈ4Z7@V_JY4t0|\\T"!\GMxTXưf!PALyѽWt`XbH%fEyOޓlv<:*a8߳= |w)'J X\H6BMm]s,X$Txݲ{WÔjm3j(&#{H^BVDnY5( #~d t,sd* 2hdg`B;>*#Xv=ZKu߻<~t$ ӎd#Z""1#)4A ]*w*Ȩ(4,zNb. e^D1s] <geX3tf^g>u,_:;Ebr8Øm!{_Y1qWp2볗D͎+ }^AҦ`%d5=mIsE̡M+t\t֊K~oźZ3 )4Aj() u(\2Xu7X=L$73'At¢K2< ћW/Dn}]yb]S]{4_ Wy7oJҽP:@2ϭm8W{>}:$MX]vxw>#;wH oVqdcn8RIм+짛;7zΑnЬ)+l2%8ϼ@z?OǑ(0I9mPԪɐW:EjRHe!دŻ_<G+%G@>P}_לN}`ؓbfpO#ڍˉYR mEq-{!ʑ~EGݲ.%33%2/'lg X0O`IUF&"h,b/((Z[] +)wv{ WcCRzȝQPξ-uD,؅\:5/qu?=i ZD#n1~SM56o ۵liefmY6WWlQ-lFlpjIJ."]8URJg;* 1o#'Ó_9xdMF4sRI+F)V8FE/5T"SVsy#j) 8>M"7!2(A/Ϝ!ח/ XX XPSgQz'BWK/g"R6nY ]vοQ:aW,ǿrrnQdVdΆA ʩ5Yp^yl7TxH*q!<MQco4֝5Z|"À 2Oar7I%dMtx^njwCrh*l|x [mw\BzM:Whs4bjS2^CsI骈@e9qpxoZro2"Z 0Ix{j+e!S^^k9}q_׾fAWƖ}##R$ PO͸e_zkpEFlD34`]اvkICcR|m=EaB_!fۻn2U{:N8ʂF;)$I(>raOZк/n8~wݣʛխ ØS9а7~Y湝L,XߓFP`2lC9C oaj9Zz]H@`+&h4!LepPsqNe 2T@Q g\TytE)Vi&Jϴh]*(:P0/]L Xamh6NOś].vo]D~]M8&IL{RFY c{êT.1,69lG6 lK003L0) HM1Y ,d59<}xRCSY`W5JJR&=PB H8K-}w6 d{XJԒHꦚE*m!$MQ]`ԠqrH鈜[~"& vŤ!v /}KU!WgxC!Wl7c/?<}.𽻭|\KxX8q#,{/<O_I_eC#>^w f Pnm&c!ϛ-qd1ɡ-tWqck'4˪98y"ctPYE'z"^e)#0ȇo~F[W/8wJ`1S kMYGD4 <kxsk>//O_BA7(|ҕ n3gx䝏E7 U!+LrRoԏډnaMd݆4 "M1iߡTuӢ]Ȯ<#)XLy(%Zb)+qsS Jh HZ?Ի$!6AY|nw= ƓNq'}HMBdm<@v+:8wII5t`Ki:yЀ?ť{۲פXsrazƬ[Fw-x9*[d[IF^;罆R @};6]e =fFLpr8ZSXVK3wkfyFsZ8?e%~3qJyL=-]@U1ٵ먌dͰzX4O]C! q[," w^ LT M6VO4k鬄兮E$ 9y_oa_pp:#/>WKD].#˄.k"R^یTsU欦uyY'h<>vt;05EQ QD 61jHȸ*. O~f(^@1ZxQO!(9{7 C74Q^|V%~|5[0N`|E'3`F/M2\wtl#PωTˠck}{JM$iɢnV-9^rnϹZ"{3l%rť겗sYMlܣ|YPl,vj[߿CQH@ȃl[UN߰Y AXͦ{ y h~}kWKj5)}]yI;ގт‹6AOs*lg\gy9n-;6pR|w]:ԋ/DQί]3IΒ*VLͤ\^ľ"'ǚ6Ԯ"j#R%"L77S}\Q3AQ3XQbG+(iZmq:0y4 |r(Pp '^쯯O/azxP$.W6 FX_>}qSlS6 i\Cj t:ށ1}Fh8}[C׮ô#Nv6$ll>%ϊ,˧27MW B) ј]k~EN~ĜE,h0*h {K=9ʦچ p&CxI**EMo 9^19yȈjLN&jmT%PQKnCֿ<Vy 73'nL0$*|;F<r$)E xcX 6GXy,LZ[dVc¤Xbm3fjrtzRmQK~gt]qYXs!nB<%5c*Ͼ3k0r \;kǽwgIm mTXj4`LLt`pJfCwZ`Jr&3 8ĬD~"z+Fr1*[˨g@߇F߬9'A3M%C9=a[Cێo:wi)jnjH>$ߣ_ 3ԕ3ɼvy|VuvowɥKIyB X;S]-t-O@Wk:()[+'۟R Q > 0Sz+tGg'g{A@̾5➫G )͚.eY%\sOgXg8{E+)@e- QXvEr/j _CxgэzE~oF!s$:fq_T='ܾ0}(,||_ 3Eu P|%5KC WDt7.u{?>U] zCDs*z9,pX+|[_[</9<:|HHHvi1+J\TI*>ϙ{?8<[cA`slKcy7 3s6dvFBABCB:B H5H!L? U=}sEfX:ΜE 4C:k3 ɖbߌF@)]n4Y‹%\ʼ u,g-gr-gĎ$g"M%t64(儊~hжxɪ҉KFE-ʖz4Ӡȁgo(͆(ÓKoyEZ&: beRaA5lݘD1OSߗI]ptbfRԗ 7D؞7Ci-<;c T'ͣ h켈('ozIf*o-5jv!){R5ی'S&򊫮yE%Fdv%otJ̬7:Jp_[?d)7wf~_WσJ߽J_y$nQJ>yӬf5 ȭwk%hv{tac&]RS^cjhtQ^Ogl4ՖLij~3HM65?0 ئ|x~qXp/g&o9Rs@@8=C84"6mGs^^ʣBzyqPWg#pXQ⇗AFrKG\J{a*|$ iCyBٷ4b9 AxFfxQk /i7s+-]:ëaDZj0{H,jxXR&}ZX& /,.i4aT^W4d̼a5=<_sXPpe`<~wn'v2,a ^Ґ^?|>|j9(Hǰ7l3ވ~(IDRATl(d #Ϻqn5"E#ZS?<~mBƄo1)c W:fN䇓?&Ň񓯮v$O~QFN8+AE̗34l)V+HVDwMl赙fBp|MYVHgn’bnS )FM!@Ffinh!kfaV¬P(b(>>T"yJ Dg*Qx7b-(p և!E&\Arc+`t8u<}1>-@19y 8}F(~S%lQ2OJyﺇUS[]0g`S M1.ejR0p &:Uxض&^,KF$X1#. M 8uPgr؝?Sj͆Q[b0E>1/9Ȧa KVSi("y?|Lз|`1{\8#퐘 ^_)$!K.$e U 0<$8$^ 1*Nݧ[%Hϼޓx KΘ;Q~b2lwZf4n9wf\2/.gC G