From 4e7bfaa6567498751da851bca7d5b8cfdf2ebca6 Mon Sep 17 00:00:00 2001 From: juanf <juanf> Date: Fri, 28 Aug 2015 13:19:12 +0000 Subject: [PATCH] SSDM-2015 : New version with new master data script that adds just what is missing on current installation SVN: 34539 --- .../petermigration/2/as/definitions.py | 375 ++++++++ .../petermigration/2/as/definitionsVoc.py | 852 ++++++++++++++++++ .../2/as/initialize-master-data.py | 155 ++++ .../drop-boxes/petermigration/definitions.py | 375 ++++++++ .../petermigration/definitionsVoc.py | 852 ++++++++++++++++++ .../petermigration/lib/FileMakerMain.java | 77 ++ .../drop-boxes/petermigration/lib/fmjdbc.jar | Bin 0 -> 126155 bytes .../drop-boxes/petermigration/migration.py | 657 ++++++++++++++ .../petermigration/plugin.properties | 9 + 9 files changed, 3352 insertions(+) create mode 100644 plasmid/source/core-plugins/petermigration/2/as/definitions.py create mode 100644 plasmid/source/core-plugins/petermigration/2/as/definitionsVoc.py create mode 100644 plasmid/source/core-plugins/petermigration/2/as/initialize-master-data.py create mode 100644 plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitions.py create mode 100644 plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitionsVoc.py create mode 100644 plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/lib/FileMakerMain.java create mode 100644 plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/lib/fmjdbc.jar create mode 100644 plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/migration.py create mode 100644 plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/plugin.properties diff --git a/plasmid/source/core-plugins/petermigration/2/as/definitions.py b/plasmid/source/core-plugins/petermigration/2/as/definitions.py new file mode 100644 index 00000000000..6cf0d515317 --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/as/definitions.py @@ -0,0 +1,375 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType + +# +# Helper Methods +# +def getPropertyDefinitionByCode(definition, code): + for property in definition: + if property[0] == code: + return property + return None + +# +# Scripts +# +commentsScriptName = "COMMENTS"; +adenosineScriptName = "ADENOSINE_COUNT" +cytosineScriptName= "CYTOSINE_COUNT" +gcScriptName= "GC" +guanosineScriptName= "GUANOSINE_COUNT" +lengthScriptName= "SEQUENCE_LENGTH" +nucelotideScriptName= "ONUCLEOTIDE_COUNT" +thymidineScriptName= "THYMIDINE_COUNT" +tmScriptName= "TM" + +# +# Storage +# +numberOfStorageGroups = 65 + +def getStorageGroupPropertyCodes(): + propertyCodes = []; + for property in getStorageGroupDefinition(): + propertyCodes.append(property[0]); + return propertyCodes; + +def getStorageGroupDefinition(): + return [ + ["STORAGE_NAME", "Physical Storage", "location", DataType.CONTROLLEDVOCABULARY, "FREEZER", "Storage Name", None, None, False], + ["STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], + ["STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], + ["STORAGE_BOX_NAME", "Physical Storage", "box label", DataType.VARCHAR, None, "Storage Box Name", None, None, False], + ["STORAGE_BOX_SIZE", "Physical Storage", "box size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box size", None, None, False], + ["STORAGE_USER", "Physical Storage", "frozen by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "Storage User Id", None, None, False], + ["STORAGE_BOX_POSITION", "Physical Storage", "position", DataType.VARCHAR, None, "Storage Box Position", None, None, False] +]; + +# +# Experiment Types +# +experimentDefinition = [ + ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], + ["EXPERIMENTAL_GOALS", "General", "Experimental goals", DataType.MULTILINE_VARCHAR, None, "Goal of the experiment", None, None, False], + ["GRANT", "General", "Grant", DataType.VARCHAR, None, "grant name", None, None, False], + ["START_DATE", "General", "Start Date", DataType.TIMESTAMP, None, "Start Date", None, None, False], + ["END_DATE", "General", "End Date", DataType.TIMESTAMP, None, "End Date", None, None, False], + ["EXPERIMENTAL_RESULTS", "General", "Experimental results", DataType.MULTILINE_VARCHAR, None, "Brief summary of the results obtained", None, None, False], + ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False] +]; + +# +# Sample Types +# +antibodyDefinition = [ + ["NAME", "General", "antibody ID", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_ID_NR", "General", "antibody_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["ANTIGEN", "General", "antigen", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_FACS_BLOCK", "General", "block facs", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], + ["ANTIBODY_IF_BLOCK", "General", "block IFF", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], + ["ANTIBODY_WB_BLOCK", "General", "block western", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], + ["CATALOGUE_NUMBER", "General", "catalog id #", DataType.VARCHAR, None, "", None, None, False], + ["CLASS", "General", "class", DataType.CONTROLLEDVOCABULARY, "CLASS", "", None, None, False], + ["CLONE", "General", "clone", DataType.VARCHAR, None, "", None, None, False], + ["COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], + ["ANTIBODY_FACS_CONC", "General", "conc facs", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], + ["ANTIBODY_IF_CONC", "General", "conc IFF", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], + ["ANTIBODY_IP_CONC", "General", "conc ip", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_IP", "", None, None, False], + ["ANTIBODY_WB_CONC", "General", "conc western", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_WESTERN", "", None, None, False], + ["ANTIBODY_CONCENTRATION", "General", "concentration", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_CROSSREACTIVITY", "General", "crossreactivity", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_FACS_FIX", "General", "fix facs", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], + ["ANTIBODY_IF_FIX", "General", "fix IFF", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], + ["ANTIBODY_WB_FIX", "General", "fix western", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["LABEL", "General", "label", DataType.CONTROLLEDVOCABULARY, "LABEL", "", None, None, False], + ["LOTNUMBER", "General", "lotnumber", DataType.VARCHAR, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MONO_POLYCLONAL", "General", "mono/polyclonal", DataType.CONTROLLEDVOCABULARY, "MONO-POLYCLONAL", "", None, None, False], + ["ANTIBODY_FACS_NOTES", "General", "notes FACS", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_IF_NOTES", "General", "notes IFF", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_IP_NOTES", "General", "notes IP", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_WB_NOTES", "General", "notes western", DataType.VARCHAR, None, "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["ANTIGEN_SIZE", "General", "size", DataType.VARCHAR, None, "", None, None, False], + ["SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "SOURCE", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["BOX", "Storage", "box", DataType.VARCHAR, None, "", None, None, False], + ["RACK", "Storage", "rack", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], + ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] +]; + +cellDefinition = [ + ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], + ["ATCC_NUM", "General", "ATCC No.", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["CELL_ID_NR", "General", "cell_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["CELL_ID_NR_COPY", "General", "cell_id_nr Copy", DataType.VARCHAR, None, "", None, None, False], + ["NAME", "General", "cell ID", DataType.VARCHAR, None, "", None, None, False], + ["CELL_ID_COPY", "General", "cell ID Copy", DataType.VARCHAR, None, "", None, None, False], + ["CLONE", "General", "clone #", DataType.INTEGER, None, "", None, None, False], + ["COMPARE_FIELD", "General", "compare field", DataType.VARCHAR, None, "", None, None, False], + ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT1", "General", "concentration unit 1", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC4", "General", "conc.4", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT4", "General", "concentration unit 4", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["DATE", "General", "date", DataType.TIMESTAMP, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["LINE_NAME", "General", "line name", DataType.VARCHAR, None, "", None, None, False], + ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], + ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MYCOPLASM_TESTED", "General", "mycoplasm_tested", DataType.BOOLEAN, None, "", None, None, False], + ["OBTAINED_FROM", "General", "obtained from", DataType.CONTROLLEDVOCABULARY, "CELL_OBTAINED_FROM", "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], + ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], + ["PERS_CELL_NUMBER", "General", "PersCellNumber", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION_PLASMID1", "General", "sel.1", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SELECTION_PLASMID2", "General", "sel.2", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SELECTION_PLASMID3", "General", "sel.3", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SELECTION_PLASMID4", "General", "sel.4", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "CELL_SPECIES", "", None, None, False], + ["VIRUS_ID1", "General", "virus ID 1", DataType.VARCHAR, None, "", None, None, False], + ["VIRUS_ID2", "General", "virus ID 2", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], + ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] +]; + +strainDefinition = [ + ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], + ["BACKGROUND", "General", "background", DataType.CONTROLLEDVOCABULARY, "STRAIN_BACKGROUND", "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["CIR", "General", "cir", DataType.CONTROLLEDVOCABULARY, "CIR", "", None, None, False], + ["CONC_INDUCER1", "General", "conc. inducer 1", DataType.VARCHAR, None, "", None, None, False], + ["CONC_INDUCER2", "General", "conc. inducer 2", DataType.VARCHAR, None, "", None, None, False], + ["CONC_INDUCER3", "General", "conc. inducer 3", DataType.VARCHAR, None, "", None, None, False], + ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT1", "General", "concentration unit 1", DataType.VARCHAR, None, "", None, None, False], + ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], + ["DERIVATION", "General", "derivation", DataType.CONTROLLEDVOCABULARY, "DERIVATION", "", None, None, False], + ["EXPRESSED_PROTEIN1", "General", "expressed protein 1", DataType.VARCHAR, None, "", None, None, False], + ["EXPRESSED_PROTEIN2", "General", "expressed protein 2", DataType.VARCHAR, None, "", None, None, False], + ["EXPRESSED_PROTEIN3", "General", "expressed protein 3", DataType.VARCHAR, None, "", None, None, False], + ["FREE_PLASMID", "General", "freeplasmid", DataType.VARCHAR, None, "", None, None, False], + ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["GAL", "General", "gal", DataType.CONTROLLEDVOCABULARY, "GAL", "", None, None, False], + ["GENE_EXPRESSION1", "General", "gene expression 1", DataType.VARCHAR, None, "", None, None, False], + ["GENE_EXPRESSION2", "General", "gene expression 2", DataType.VARCHAR, None, "", None, None, False], + ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], + ["INDUCER1", "General", "inducer 1", DataType.VARCHAR, None, "", None, None, False], + ["INDUCER2", "General", "inducer 2", DataType.VARCHAR, None, "", None, None, False], + ["INDUCER3", "General", "inducer 3", DataType.VARCHAR, None, "", None, None, False], + ["COMMENTS", "General", "info", DataType.VARCHAR, None, "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MARKERS", "General", "markers", DataType.VARCHAR, None, "", None, None, False], + ["MAT", "General", "mat", DataType.CONTROLLEDVOCABULARY, "MAT", "", None, None, False], + ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], + ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["NUMBER", "General", "number", DataType.VARCHAR, None, "", None, None, False], + ["STRAIN_OBTAINED_FROM", "General", "obtained from", DataType.VARCHAR, None, "", None, None, False], + ["ORF", "General", "orf", DataType.VARCHAR, None, "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], + ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], + ["PERSYEASTNUMBER", "General", "persyeastnumber", DataType.INTEGER, None, "", None, None, False], + ["PETERYEASTNUMBER", "General", "peteryeastnumber", DataType.INTEGER, None, "", None, None, False], + ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID3", "General", "plasmid ID 3", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER1", "General", "promoter 1", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER2", "General", "promoter 2", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER3", "General", "promoter 3", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "General", "reference", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION1", "General", "sel.1", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION2", "General", "sel.2", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION3", "General", "sel.3", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION", "General", "selection", DataType.CONTROLLEDVOCABULARY, "SELECTION_YEAST", "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["STRAIN_SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "STRAIN_SOURCE", "", None, None, False], + ["SPECIES", "General", "species", DataType.VARCHAR, None, "", None, None, False], + ["STRAIN_ID_NR", "General", "strain_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["NAME", "General", "strain ID", DataType.VARCHAR, None, "", None, None, False], + ["STRAIN_NAME", "General", "strain name", DataType.VARCHAR, None, "", None, None, False] +]; + +oligoDefinition = [ + ["AMOUNT", "General", "amount", DataType.REAL, None, "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["OLIGO_COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "OLIGO_COMPANY", "", None, None, False], + ["CONCENTRATION", "General", "concentration", DataType.REAL, None, "", None, None, False], + ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], + ["GRADE", "General", "grade", DataType.CONTROLLEDVOCABULARY, "OLIGO_GRADE", "", None, None, False], + ["COMMENTS", "General", "Info", DataType.VARCHAR, None, "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["OD", "General", "od", DataType.INTEGER, None, "", None, None, False], + ["NAME", "General", "oligo ID", DataType.INTEGER, None, "", None, None, False], + ["OLIGO_ID_NR", "General", "oligo_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["ORDER_DATE", "General", "order date", DataType.VARCHAR, None, "", None, None, False], + ["OLIGO_ORGANISM", "General", "organism", DataType.CONTROLLEDVOCABULARY, "OLIGO_ORGANISM", "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PRIMER_PARTNER", "General", "primer partner", DataType.VARCHAR, None, "", None, None, False], + ["PRIMER_POSITION", "General", "primer position", DataType.CONTROLLEDVOCABULARY, "PRIMER_POSITION", "", None, None, False], + ["PUBLISHED_IN", "General", "PublishedIn", DataType.VARCHAR, None, "", None, None, False], + ["RESTRICTION_SITE", "General", "restriction site", DataType.CONTROLLEDVOCABULARY, "RESTRICTION", "", None, None, False], + ["SEQUENCE", "General", "sequence", DataType.VARCHAR, None, "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.VARCHAR, None, "", None, None, False], + ["USAGE", "General", "usage", DataType.CONTROLLEDVOCABULARY, "OLIGO_USAGE", "", None, None, False], + ["ADENOSINE", "Calculated fields", "adenosine", DataType.INTEGER, None, "", adenosineScriptName, None, False], + ["CYTOSINE", "Calculated fields", "cytosine", DataType.INTEGER, None, "", cytosineScriptName, None, False], + ["GUANOSINE", "Calculated fields", "guanosine", DataType.INTEGER, None, "", guanosineScriptName, None, False], + ["THYMIDINE", "Calculated fields", "thymidine", DataType.INTEGER, None, "", thymidineScriptName, None, False], + ["LENGTH", "Calculated fields", "length", DataType.INTEGER, None, "", lengthScriptName, None, False], + ["GC", "Calculated fields", "gc", DataType.REAL, None, "", gcScriptName, None, False], + ["TM", "Calculated fields", "tm", DataType.REAL, None, "", tmScriptName, None, False], + ["O_NUCLEOTIDE", "Calculated fields", "O nucleotide", DataType.INTEGER, None, "", nucelotideScriptName, None, False] +]; + +plasmidDefinition = [ + ["BACKBONE", "General", "backbone", DataType.CONTROLLEDVOCABULARY, "BACKBONE", "", None, None, False], + ["BACKUP_STORAGE", "General", "backup storage", DataType.VARCHAR, None, "", None, None, False], + ["BACTERIAL_HOST", "General", "bacterial host", DataType.CONTROLLEDVOCABULARY, "BACTERIAL_HOST", "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["BIOSAFETY_LEVEL", "General", "biosafety level", DataType.CONTROLLEDVOCABULARY, "BIOSAFETY_LEVEL", "", None, None, False], + ["BOXNR", "General", "boxNr", DataType.VARCHAR, None, "", None, None, False], + ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONSTRUCTION_METHOD", "General", "construction method", DataType.VARCHAR, None, "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["CTERMTAG", "General", "Ctermtag", DataType.VARCHAR, None, "", None, None, False], + ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], + ["DATE_OF_CONSTRUCTION", "General", "date of construction", DataType.TIMESTAMP, None, "", None, None, False], + ["DERIVATIVE_OF", "General", "Derivative of", DataType.VARCHAR, None, "", None, None, False], + ["ECOLI_STRAIN", "General", "E.coli strain", DataType.VARCHAR, None, "", None, None, False], + ["EXCISE_INSERT", "General", "excise insert", DataType.VARCHAR, None, "", None, None, False], + ["EXCISE_INSERT2", "General", "excise insert 2", DataType.VARCHAR, None, "", None, None, False], + ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["FUNCTIONAL_ELEMENTS_INSERT", "General", "functional elements insert", DataType.VARCHAR, None, "", None, None, False], + ["HYPERCARD_FILE", "General", "hypercard file", DataType.VARCHAR, None, "", None, None, False], + ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], + ["INSERT", "General", "insert", DataType.VARCHAR, None, "", None, None, False], + ["INSERTION_SITE", "General", "insertion site", DataType.VARCHAR, None, "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["LINEARIZE", "General", "linearize", DataType.VARCHAR, None, "", None, None, False], + ["MARKER", "General", "Marker", DataType.VARCHAR, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.VARCHAR, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["NAME_OF_PARENTAL_CLONE", "General", "name of parental clone", DataType.VARCHAR, None, "", None, None, False], + ["NAME_OF_VECTOR", "General", "name of vector", DataType.VARCHAR, None, "", None, None, False], + ["NTERMTAG", "General", "Ntermtag", DataType.VARCHAR, None, "", None, None, False], + ["NUCLEOTIDE_SEQUENCE", "General", "nucleotide sequence", DataType.VARCHAR, None, "", None, None, False], + ["OLIGOS_USED", "General", "oligos used", DataType.VARCHAR, None, "", None, None, False], + ["ORGANISM", "General", "organism", DataType.VARCHAR, None, "", None, None, False], + ["ORIGIN_OF_REPLICATION", "General", "origin of replication", DataType.VARCHAR, None, "", None, None, False], + ["OTHER_MARKER", "General", "other marker", DataType.VARCHAR, None, "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PERSPLASMIDNUM", "General", "persPlasmidnum", DataType.REAL, None, "", None, None, False], + ["PETERPLASMIDNUM", "General", "PeterPlasmidNum", DataType.INTEGER, None, "", None, None, False], + ["NAME", "General", "plasmid ID", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID_NR", "General", "plasmid_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["PLASMIDNAME", "General", "plasmidname", DataType.VARCHAR, None, "", None, None, False], + ["PRIMERS", "General", "primers", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER", "General", "promoter", DataType.CONTROLLEDVOCABULARY, "PROMOTER", "", None, None, False], + ["SELECTION_IN_BACTERIA", "General", "selection in bacteria", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_BACTERIA", "", None, None, False], + ["SELECTION_IN_EUKARYOTES", "General", "selection in eukaryotes", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_EUKARYOTES", "", None, None, False], + ["SEQUENCE_FILE_NAME", "General", "sequence file name", DataType.VARCHAR, None, "", None, None, False], + ["SEQUENCING_DATE", "General", "sequencing date", DataType.TIMESTAMP, None, "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["SHELF", "General", "shelf", DataType.VARCHAR, None, "", None, None, False], + ["SIZE_INSERT", "General", "size insert", DataType.REAL, None, "", None, None, False], + ["SIZE_OF_INSERT", "General", "size of insert", DataType.VARCHAR, None, "", None, None, False], + ["SIZE_VECTOR", "General", "size vector", DataType.REAL, None, "", None, None, False], + ["PLASMID_SOURCE", "General", "source", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "PLASMID_ORGANISM", "", None, None, False], + #["TUBES", "General", "TUBES", DataType.VARCHAR, None, "", None, None, False], + ["URL", "Reference", "url", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "Reference", "published in", DataType.VARCHAR, None, "", None, None, False] +]; + +chemicalDefinition = [ + ["ARTICLE", "General", "Article", DataType.VARCHAR, None, "", None, None, False], + ["COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], + ["ARTICLE_NUM", "General", "Article Number", DataType.VARCHAR, None, "", None, None, False], + ["RECORD_NUMBER", "General", "RecordNumber", DataType.VARCHAR, None, "", None, None, False], + ["LOCATION", "Location", "Location", DataType.VARCHAR, None, "", None, None, False] +]; + +siRNADefinition = [ + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], + ["EXON_OR_THREE_PRIME", "General", "exon or three prime", DataType.CONTROLLEDVOCABULARY, "EXON_OR_THREE_PRIME", "", None, None, False], + ["EXON", "General", "exon #", DataType.INTEGER, None, "", None, None, False], + ["3_PRIME_POSITION", "General", "3' position", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "SIRNA_SPECIES", "", None, None, False], + ["SEQUENCE", "General", "SEQUENCE", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "SIRNA_COMPANY", "", None, None, False], + ["STOCK_CONCENTRATION", "General", "Stock concentration", DataType.REAL, None, "", None, None, False], + ["WORKING_CONCENTRATION", "General", "Working concentration", DataType.REAL, None, "", None, None, False], + ["EFFICIENCY", "General", "Efficiency", DataType.VARCHAR, None, "", None, None, False], + ["EFFICIENCY_QPCR", "General", "Efficiency_qPCR", DataType.VARCHAR, None, "", None, None, False], + ["EFFICIENCY_WESTERN", "General", "Efficiency_Western", DataType.VARCHAR, None, "", None, None, False], + ["EFFICIENCY_OTHER", "General", "Efficiency_other", DataType.VARCHAR, None, "", None, None, False], + ["OFF_TARGET_EFFECTS", "General", "Off target effects", DataType.VARCHAR, None, "", None, None, False], + ["INFO", "General", "Info", DataType.VARCHAR, None, "", None, None, False], + ["SPECIFIC_SPLICE_VARIANT", "General", "Specific splice variant", DataType.VARCHAR, None, "", None, None, False], + ["TRANSFECTION_AGENT", "General", "Transfection agent", DataType.CONTROLLEDVOCABULARY, "TRANSFECTION_AGENT", "", None, None, False], + ["LIBRARY", "General", "Library", DataType.VARCHAR, None, "", None, None, False], + ["CHARACTERIZED_BY_COMPANY", "General", "Characterized by company", DataType.VARCHAR, None, "", None, None, False], + ["NUMBERINPOOL", "General", "NumberINpool", DataType.INTEGER, None, "", None, None, False], + ["TEST", "General", "Test", DataType.VARCHAR, None, "", None, None, False], + ["CHEMICAL_MODIFICATION", "General", "Chemical modification", DataType.VARCHAR, None, "", None, None, False], + ["OLIGO_NAME", "General", "Oligo name", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_OLIGONUMBER", "General", "siRNA_OligoNumber", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_FREEZER_LOCATION", "General", "Freezer Location", DataType.CONTROLLEDVOCABULARY, "SIRNA_FREEZER_LOCATION", "", None, None, False], + ["DRAWER", "General", "Drawer", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED", "Reference", "Published", DataType.VARCHAR, None, "", None, None, False] +]; + +# +# Data Set Types +# +documentDefinition = [ + ["CREATION_DATE", "General", "date created", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "date modified", DataType.TIMESTAMP, None, "", None, None, False], + ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], + ["ID_NR", "General", "id_nr", DataType.VARCHAR, None, "", None, None, False], + ["FILE", "General", "file", DataType.VARCHAR, None, "", None, None, False], + ["SERIAL", "General", "serial", DataType.INTEGER, None, "", None, None, False] + +]; diff --git a/plasmid/source/core-plugins/petermigration/2/as/definitionsVoc.py b/plasmid/source/core-plugins/petermigration/2/as/definitionsVoc.py new file mode 100644 index 00000000000..6c41596dc8d --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/as/definitionsVoc.py @@ -0,0 +1,852 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Helper Methods +# +def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): + vocabulary = vocabularyDefinitions[vocabularyCode] + for term in vocabulary: + if term[1] == termLabel: + #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") + return term[0] + return None + +# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } +createdVocabularyTerms = { } + +def printCreatedTerms(): + print "--- Created Vocabulary Terms Report" + for vocabularyCode in createdVocabularyTerms: + print "Vocabulary [" + vocabularyCode + "]" + for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: + print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" + print "---" + +def getCreatedTerm(vocabularyCode, termCode): + if vocabularyCode in createdVocabularyTerms: + if termCode in createdVocabularyTerms[vocabularyCode]: + return createdVocabularyTerms[vocabularyCode][termCode] + return None + +def addCreatedTerm(vocabularyCode, termCode, object): + if vocabularyCode not in createdVocabularyTerms: + createdVocabularyTerms[vocabularyCode] = {} + createdVocabularyTerms[vocabularyCode][termCode] = object + +def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): + createdTerm = getCreatedTerm(vocabularyCode, termCode) + if createdTerm is None: + vocabulary = tr.getVocabularyForUpdate(vocabularyCode) + + for term in vocabulary.getTerms(): + if term.getCode() == termCode: + createdTerm = term + + if createdTerm is None: + createdTerm = tr.createNewVocabularyTerm() + createdTerm.setCode(termCode) + createdTerm.setLabel(termLabel) + createdTerm.setOrdinal(vocabulary.getTerms().size()) + vocabulary.addTerm(createdTerm) + addCreatedTerm(vocabularyCode, termCode, createdTerm) + return createdTerm + +# +# Vocabularies +# + +vocabularyDefinitions = { + "ALL_LAB_MEMBERS" : [ + ["ANNA_DEPLAZES", "Anna Deplazes"], + ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], + ["BRIAN_LUKE", "Brian Luke"], + ["CAROLINE_ZBINDEN", "Caroline Zbinden"], + ["CELINE_LAFOURCADE", "Celine Lafourcade"], + ["CHRISTINE_RUPP", "Christine Rupp"], + ["CLAUDINE_KRAFT", "Claudine Kraft"], + ["EDYTA_SIERGIEJUK", "Edyta Siergiejuk"], + ["FABIAN_HERZOG", "Fabian Herzog"], + ["FABIAN_RUDOLF", "Fabian Rudolf"], + ["FRANK_VAN_DROGEN", "Frank Van Drogen"], + ["GERDA_JORRITSMA", "Gerda Jorritsma"], + ["GWEN_RABUT", "Gw\xe9nael Rabut"], + ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], + ["IRAM_ZAIDI", "Iram Zaidi"], + ["IZABELA_SUMARA", "Izabela Sumara"], + ["LIONEL_PINTARD", "Lionel Pintard"], + ["MALIKAJAQUENOUD", "MalikaJaquenoud"], + ["MARC_SOHRMANN", "Marc Sohrmann"], + ["MARIE-LYN_HECHT", "Marie-Lyn Hecht"], + ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], + ["MATTHIAS_PETER", "Matthias Peter"], + ["MICHAEL_OLMA", "Michael Olma"], + ["MICHAEL_SCHNEIDER", "Michael Schneider"], + ["MICHELE_KNAUS", "Michele Knaus"], + ["MONIKA_GERSBACH", "Monika Gersbach"], + ["NATHALIE_MEYER-SCHALLER", "Nathalie Meyer-Schaller"], + ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], + ["NICOLAS_DARD", "Nicolas Dard"], + ["NICOLAS_PAGE", "Nicolas Page"], + ["PATRICK_PEDRIOLI", "Patrick Pedrioli"], + ["PHILIPPE_WIGET", "Philippe Wiget"], + ["PIERRE_MAILLARD", "Pierre Maillard"], + ["REINHARD_DECHANT", "Reinhard Dechant"], + ["SANDER_SPRINGER", "Sander Springer"], + ["SARAH_GLASER", "Sarah Glaser"], + ["SARAH_MAERKI", "Sarah M\xe4rki"], + ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], + ["SERGE_PELET", "Serge Pelet"], + ["STEFAN_MUELLER", "Stefan M�ller"], + ["TANIA_ROBERTS", "Tania Roberts"], + ["THIMO_KURZ", "Thimo Kurz"], + ["TOBIAS_BRAUN", "Tobias Braun"], + ["VANESSA_REZGUI", "Vanessa Rezgui"], + ["WOJCIECH_PIWKO", "Wojciech Piwko"], + ["YUKIKO_SHIMADA", "Yukiko Shimada"], + ["YVONNE_GLOOR", "Yvonne Gloor"], + ["JOCHEN_BECK", "Jochen Beck"], + ["MONIKA_KIJANSKA", "Monika Kijanska"], + ["ANGIE_RAGHEB", "Angie Ragheb"], + ["ANNE_PACQUELET", "Anne Pacquelet"], + ["BJORN_HEGEMANN", "Bj\xf6rn Hegemann"], + ["JANNY_TILMA", "Janny Tilma"], + ["THIBAULT_COURTHEOUX", "Thibault Courtheoux"], + ["SAMUEL_GILBERTO", "Samuel Gilberto"], + ["REMY_BUSER", "Remy Buser"], + ["RADOSLAV_ENCHEV", "Radoslav Enchev"], + ["MICHAELA_HUBNER", "Michaela Hubner"], + ["MIA_LI", "Mia Li"], + ["JULIEN_MOUYSSET", "Julien Mouysset"] + ], + "LAB_MEMBERS_INITIALS" : [ + ["AD", "AD"], + ["ACB", "ACB"], + ["BL", "BL"], + ["CZ", "CZ"], + ["CL", "CL"], + ["CR", "CR"], + ["CK", "CK"], + ["ES", "ES"], + ["FH", "FH"], + ["FR", "FR"], + ["FD", "FD"], + ["GJ", "GJ"], + ["GR", "GR"], + ["ISS", "ISS"], + ["IZ", "IZ"], + ["IS", "IS"], + ["LP", "LP"], + ["MJ", "MJ"], + ["MSO", "MSo"], + ["MH", "MH"], + ["MG", "MG"], + ["MP", "MP"], + ["MO", "MO"], + ["MSC", "MSc"], + ["MK", "MK"], + ["MG", "MG"], + ["NS", "NS"], + ["NPE", "NPe"], + ["ND", "ND"], + ["NPA", "NPa"], + ["PP", "PP"], + ["PW", "PW"], + ["PM", "PM"], + ["RD", "RD"], + ["SS", "SS"], + ["SG", "SG"], + ["SMA", "SMa"], + ["SL", "SL"], + ["SP", "SP"], + ["SM", "SM"], + ["TR", "TR"], + ["TK", "TK"], + ["TB", "TB"], + ["VR", "VR"], + ["WP", "WP"], + ["YS", "YS"], + ["YG", "YG"], + ["JB", "JB"], + ["MKI", "MKi"] + ], + "BLOCK" : [ + ["1BSA_01TRITON-X100", "1% BSA; 0.1% Triton-X100"], + ], + "CLASS" : [ + ["IGM", "IgM"], + ["IGG1", "IgG1"], + ["IGG2", "IgG2"] + ], + "COMPANY" : [ + ["ABCAM", "abcam"], + ["CELL_SIGNALING", "cell signaling"], + ["STRATAGEN", "stratagene"], + ["CLONTECH", "clontech"], + ["UBI", "ubi"], + ["SOUTHERN_BIOTECH", "southern biotech"], + ["PIERCE", "pierce"], + ["PHARMIGEN", "pharmingen"], + ["MOLECULAR_PROBES", "molecular probes"], + ["PHARMACIA", "pharmacia"], + ["BIORAD", "biorad"], + ["EUROGENETIC", "eurogentec"], + ["HOMEMADE", "homemade"], + ["BD_BIOSCIENCE", "BD bioscience"], + ["OBTAINED_FROM", "obtained from "], + ["ZYMED", "Zymed"], + ["UNKNOWN", "Unknown"], + ["SANTA_CRUZ", "Santa Cruz"], + ["BIOLEGEND", "Biolegend"], + ["BETHYL", "Bethyl"], + ["UPSTATE", "Upstate"], + ["ROCKLAND", "Rockland"], + ["NOVUS_BIOLOGICALS", "Novus Biologicals"], + ["CHEMICON_INTERNATIONAL", "Chemicon International"], + ["SIGMA", "Sigma"], + ["ALPHA_DIAGNOSTIC_INTERNATIONAL", "Alpha Diagnostic International"], + ["MILLIPORE", "Millipore"], + ["ACTIVE_MOTIF", "Active motif"], + ["NEB", "NEB"], + ["NEOMARKERS", "Neomarkers"], + ["LUBIOSCIENCE", "LubioScience"], + ["EBIOSCIENCE", "eBioscience"], + ["INVITROGEN", "Invitrogen"], + ["STRESSGEN", "Stressgen"], + ["COVANCE", "Covance"], + ["ENZO_LIFE_SCIENCES", "Enzo Life Sciences"], + ["CALBIOCHEM", "Calbiochem"], + ["ROCHE", "Roche"], + ["CYTOSKELETON", "Cytoskeleton"], + ["OPEN_BIOSYSTEMS", "Open Biosystems"], + ["BD_TRANSDUCTION", "BD Transduction"], + ["ATLAS_ANTIBODIES_AB", "Atlas Antibodies AB"], + ["GENENTECH", "Genentech"], + ["TRANSDUCTION_LABS", "Transduction Labs"], + ["ANTIBODIES_INCORPORATED", "Antibodies Incorporated"], + ["BABCO", "BAbCO"], + ["ERICH_NIGG_LAB_BASEL", "Erich Nigg lab (Basel)"], + ["FRANCIS_BARR", "Francis Barr"], + ["AVIVA_SYSTEMS_BIOLOGY", "Aviva Systems Biology"], + ["LUCERNACHEM", "LucernaChem"], + ["LI-COR", "LI-COR"], + ["ABGENT", "Abgent"], + ["CHROMOTEK", "Chromotek"], + ["ABNOVA", "Abnova"], + ["UNKNOWN", "Unknown"], + ["ABSEA", "Absea"], + ["GE_HEALTHCARE", "GE Healthcare"], + ["GRAMSCH_LABORATORIES", "Gramsch Laboratories"], + ["ADIPOGEN", "Adipogen"], + ["COSMO_BIO_CO", "Cosmo bio co."], + ["BECKTON_DICKINSON", "Beckton Dickinson"], + ["BIOTIUM", "Biotium"] + ], + "CONCENTRATION_FACS" : [ + ["1_TO_10", "1 : 10"], + ["1_TO_20", "1 : 20"], + ["1_TO_30", "1 : 30"], + ["1_TO_40", "1 : 40"], + ["1_TO_50", "1 : 50"], + ["1_TO_100", "1 : 100"], + ["1_TO_200", "1 : 200"], + ["1_TO_500", "1 : 500"], + ["1_TO_1000", "1 : 1000"], + ["1_TO_2000", "1 : 2000"], + ["1_TO_3000", "1 : 3000"], + ["NOT_TESTED", "not tested"], + ["NOT_WORKING", "not working"] + ], + "CONCENTRATION_IP" : [ + ["1UL", "1 �l"], + ["5UL", "5 �l"], + ["10UL", "10 �l"], + ["15UL", "15 �l"], + ["20UL", "20 �l"], + ["NOT_TESTED", "not tested"], + ["NOT_WORKING", "not working"] + ], + "CONCENTRATION_WESTERN" : [ + ["1_TO_100", "1 : 100"], + ["1_TO_500", "1 : 500"], + ["1_TO_1000", "1 : 1000"], + ["1_TO_2000", "1 : 2000"], + ["1_TO_3000", "1 : 3000"], + ["1_TO_5000", "1 : 5000"], + ["1_TO_10000", "1 : 10000"], + ["1_TO_20000", "1 : 20000"], + ["1_TO_25000", "1 : 25000"], + ["NOT_TESTED", "not tested"], + ["NOT_WORKING", "not working"] + ], + "CURRENT_LAB_MEMBERS" : [ + ["CAROLINE_ZBINDEN", "Caroline Zbinden"], + ["FRANK_VAN_DROGEN", "Frank Van Drogen"], + ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], + ["MATTHIAS_PETER", "Matthias Peter"], + ["REINHARD_DECHANT", "Reinhard Dechant"], + ["WOJCIECH_PIWKO", "Wojciech Piwko"], + ["JOCHEN_BECK", "Jochen Beck"] + ], + "FIX" : [ + ["1H-RT", "1h, RT"], + ["PTEMF", "PTEMF"], + ["PFA", "PFA"], + ["MEOH", "MeOH"] + ], + "LABEL" : [ + ["HRP", "hrp"], + ["AP", "ap"], + ["FITC", "fitc"], + ["CY3", "Cy3"], + ["ALEXA647", "Alexa 647"] + ], + "ANTIBODY_LOCATION" : [ + ["SMALL_PETER_LAB", "Small Peter Lab"], + ["BIG_PETER_LAB", "Big Peter Lab"], + ["NEW_PETER_LAB", "New Peter Lab"], + ["MINUS20_C-FLOOR", "-20C C-Floor"] + ], + "MONO-POLYCLONAL" : [ + ["MONOCLONAL", "Monoclonal"], + ["POLYCLONAL", "Polyclonal"], + ["UNKNOWN", "Unknown"] + ], + "SOURCE" : [ + ["MOUSE", "Mouse"], + ["RABBIT", "Rabbit"], + ["HAMSTER", "Hamster"], + ["GOAT", "Goat"], + ["RAT", "Rat"], + ["CHICKEN", "Chicken"], + ["SHEEP", "Sheep"], + ["HUMAN", "Human"], + ["GUINEA_PIG", "Guinea pig"], + ["DONEKY", "Donkey"], + ["UNKNOWN", "Unknown"] + ], + "CELL_LOCATION" : [ + ["FRIDGE", "fridge"], + ["FREEZER", "freezer"], + ["REFCO", "refco"], + ["TANK", "tank"] + ], + "SELECTION" : [ + ["NEOMYCIN_G418", "Neomycin/G418"], + ["HYGROMYCIN", "Hygromycin"], + ["MPA", "MPA"], + ["G418", "G418"], + ["PUROMYCIN", "puromycin"], + ["BLASTICIDIN", "Blasticidin"], + ["ZEOCIN", "Zeocin"] + ], + "CO2" : [ + ["5", "5"], + ["7.5", "7.5"] + ], + "GROWTH_TEMPERATURE" : [ + ["37", "37"], + ["28", "28"], + ["34", "34"] + ], + "MEDIUM" : [ + ["RPMI1640", "RPMI 1640"], + ["ISCOVES", "Iscoves"], + ["DMEM", "DMEM"], + ["LB", "LB"], + ["DMEM_NUTRIENT", "DMEM nutrient mixture F-12 HAM [D8437]"] + ], + "CELL_OBTAINED_FROM" : [ + ["FREIBURG", "Freiburg"], + ["ATCC", "ATCC"], + ["DANIEL_GERLICH", "Daniel Gerlich"], + ["ERICH_NIGG", "Erich Nigg"], + ["KREK", "Krek"], + ["TONY_HEYMAN", "Tony Heyman"], + ["THOMAS-WILD_ULRIKE-KUTAY", "Thomas Wild/Ulrike Kutay"], + ["JAN_MICHAEL_PETERS", "Jan-Michael Peters"], + ["M_BRANDEIS", "M Brandeis"], + ["ARI_HELENIUS", "Ari Helenius"], + ["ROMEO_RICCI", "Romeo Ricci"] + ], + "CELL_SPECIES" : [ + ["HUMAN", "human"], + ["MOUSE", "mouse"], + ["RAT", "rat"], + ["CHINESE_HAMSTER", "chines hamster"], + ["HYBRIDOMA", "hybridoma (human & mouse)"] + ], + "CONC_UNITS" : [ + ["MICROG_MICROL", "�g/�l"], + ["MG_ML", "mgl/ml"], + ["UG_ML", "ug/ml"] + ], + "STRAIN_SOURCE" : [ + ["F_CHANG", "F. Chang"], + ["J_CHANT", "J. Chant"], + ["R_DESHAIES", "R. Deshaies"], + ["E_ELION", "E. Elion"], + ["P_HIETER", "P. Hieter"], + ["I_HERSKOWITZ", "I. Herskowitz"], + ["A_NEIMAN", "A. Neiman"], + ["P_SORGER", "P. Sorger"], + ["T_STEARNS", "T. Stearns"], + ["MARC_BONDEL", "Marc Bondel"], + ["G_SUMARA", "G. Sumara"], + ["MICHAEL_ALTMANN", "Michael Altmann"], + ["HETEROZYGOUS_DIPLOID_COLLECTION", "Heterozygous diploid collection"], + ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], + ["ANNE_PAQUELET", "Anne Paquelet"], + ["YAGMUR-TURGAY_KUTAY-GROUP", "Yagmur Turgay - Kutay group"], + ["BARBAR_CATARIN", "Barbar Catarin"], + ["FRANK_VAN-DROGEN", "Frank van Drogen"], + ["HEMMO_MEYER", "Hemmo Meyer"], + ["JEAN-MARC_GALLAND", "Jean-Marc Galland"], + ["JEFF_PARVIN", "Jeff Parvin"], + ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], + ["MIKIKO_TAKAHASHI", "Mikiko Takahashi"], + ["SANDRA_HENCHOZ", "Sandra Henchoz"], + ["MALIKA_JAQUENOUD", "Malika Jaquenoud"], + ["GERDA_JORRITSMA", "Gerda Jorritsma"], + ["CELINE_LAFOURCADE", "Céline Lafourcade"], + ["CELINE_LONGARETTI", "Céline Longaretti"], + ["BRIAN_LUKE", "Brian Luke"], + ["GUY_NIEDERHAUSER", "Guy Niederhäuser"], + ["NICOLAS_PAGE", "Nicolas Pag�"], + ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], + ["MATTHIAS_PETER", "Matthias Peter"], + ["AUDREY_PETIT", "Audrey Petit"], + ["LIONEL_PINTARD", "Lionel Pintard"], + ["YUKIKO_SHIMADA", "Yukiko Shimada"], + ["PHILIPPE_WIGET", "Philippe Wiget"], + ["VOLKER_STUCKE", "Volker Stucke"], + ["KATRIN_PETER", "Katrin Peter"], + ["MARC_BLONDEL", "marc blondel"], + ["M_FUNK", "M. Funk"], + ["ATTILA_BECSKEI", "Attila Becskei"], + ["GWENAEL_RABUT", "Gwenael Rabut"], + ["PHILIP_JERMANN", "Philip Jermann"], + ["P_PRYCIAK", "P.Pryciak"], + ["LINDA_HICKE", "Linda Hicke"], + ["RZPD", "RZPD"], + ["OPENBIO", "OpenBio"], + ["F_POSAS", "F. Posas"], + ["HAPLOID_COLLECTION", "Haploid collection"], + ["MIRIAM_BORTFELD", "Miriam Bortfeld"], + ["EUROSCARF", "Euroscarf"], + ["TS_COLLECTION", "ts collection"], + ["CONZELMANN_LAB", "Conzelmann lab"], + ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], + ["ANNA_DEPLAZES", "Anna Deplazes"], + ["BIBOU", "Bibou"], + ["MARC_SOHRMANN", "Marc sohrmann"] + ], + "SELECTION_YEAST" : [ + ["NONE", "None"], + ["URA", "Ura"], + ["LEU", "Leu"], + ["TRP", "Trp"], + ["HIS", "His"], + ["VIABILITY", "Viability"], + ["NAT", "nat"], + ["KAN", "kan"], + ["KAN_NAT", "kan + nat"], + ["HIS_KAN", "HIS + kan"], + ["HIS_KAN_NAT", "HIS + kan + nat"], + ["HIS", "HIS"], + ["LEU_NAT", "leu + nat"], + ["ADE2", "ade2"] + ], + "DERIVATION" : [ + ["GAMMA_INTEG", "gamma integ"], + ["DELTA_INTEG", "� integ"], + ["5FAO_LOOPOUT", "5-FAO loopout"], + ["PLASMID_SHUFFLE", "plasmid shuffle"], + ["TETRAD", "tetrad"], + ["LOOP-IN_LOOP-OUT", "loop-in/loop-out"], + ["GALPHO", "GalpHO mating type switch"], + ["DELETION", "Deletion"], + ["INTEGRATION", "Integration"] + ], + "STRAIN_BACKGROUND" : [ + ["W303", "W303"], + ["K699", "K699"], + ["K700", "K700"], + ["S288C", "S288C"], + ["1278", "*1278*"], + ["EG123", "EG123"], + ["DF5", "DF5"], + ["SIGMA", "Sigma"], + ["UNKNOWN", "Don't know"], + ["BY7092", "BY7092"], + ["BY5565", "BY5565"], + ["BY4741", "BY4741"] + ], + "CIR" : [ + ["CIR_PLUS", "cir+"], + ["CIR_DEG", "cir�"], + ], + "GAL" : [ + ["PLUS", "Plus"], + ["PLUS_PLUS", "Plus/Plus"], + ["GAL1", "gal1"], + ["GAL1_GAL1", "gal1/gal1"], + ["GAL2", "gal2"], + ["GAL2_GAL2", "gal2/gal2"], + ], + "MAT" : [ + ["AT", "@"], + ["A", "a"], + ["ALPHA", "alpha"], + ["DIPLOID", "diploid"], + ["UNKNOWN", "unknown"] + ], + "OLIGO_ORGANISM" : [ + ["BMV", "BMV"], + ["HUMAN", "human"], + ["MOUSE", "mouse"], + ["RAT", "rat"], + ["XENOPUS", "xenopus"], + ["DROSOPHILA", "drosophila"], + ["YEAST", "yeast"], + ["ECOLI", "E.coli"], + ["SYNTHETIC", "synthetic"], + ["HIV1", "HIV-1"], + ["CELEGANS", "C.elegans"], + ["MYCOPLASMA", "mycoplasma"] + ], + "OLIGO_GRADE" : [ + ["DESALTED", "desalted"], + ["HPLC", "hplc"], + ["PURITY", "purity"], + ["UNKNOWN", "?"] + ], + "PRIMER_POSITION" : [ + ["FORWARD", "forward"], + ["REVERSE", "reverse"] + ], + "OLIGO_COMPANY" : [ + ["MWG", "MWG"], + ["BIG", "BIG"], + ["PHARMACIA", "Pharmacia"], + ["IGLOI", "Igloi"], + ["INVITROGEN", "invitrogen"], + ["MICROSYNTH", "microsynth"] + ], + "OLIGO_USAGE" : [ + ["PCR", "pcr"], + ["SEQUENCING", "sequencing"], + ["HYBRIDIZE", "hybridize"], + ["MUTAGENESIS", "mutagenesis"], + ["RT-PCR", "Real-Time PCR"] + ], + "RESTRICTION" : [ + ["AATII", "AatII"], + ["ACCI", "AccI"], + ["ACII", "AciI"], + ["AFLII", "AflII"], + ["AFLIII", "AflIII"], + ["AGEI", "AgeI"], + ["ALUI", "AluI"], + ["ALWI", "AlwI"], + ["ALWNI", "AlwNI"], + ["APAI", "ApaI"], + ["APALI", "ApaLI"], + ["APOI", "ApoI"], + ["ASCI", "AscI"], + ["ASEI", "AseI"], + ["AVAI", "AvaI"], + ["AVAII", "AvaII"], + ["AVRII", "AvrII"], + ["BAMHI", "BamHI"], + ["BANI", "BanI"], + ["BANII", "BanII"], + ["BBSI", "BbsI"], + ["BBVI", "BbvI"], + ["BCGI-1", "BcgI-1"], + ["BCGI-2", "BcgI-2"], + ["BCLI", "BclI"], + ["BFAI", "BfaI"], + ["BGLI", "BglI"], + ["BGLII", "BglII"], + ["BLPI", "BlpI"], + ["BPMI", "BpmI"], + ["BSAAI", "BsaAI"], + ["BSABI", "BsaBI"], + ["BSAHI", "BsaHI"], + ["BSAI", "BsaI"], + ["BSAJI", "BsaJI"], + ["BSAWI", "BsaWI"], + ["BSERI", "BseRI"], + ["BSGI", "BsgI"], + ["BSIEI", "BsiEI"], + ["BSIHKAI", "BsiHKAI"], + ["BSIWI", "BsiWI"], + ["BSLI", "BslI"], + ["BSMAI", "BsmAI"], + ["BSMBI", "BsmBI"], + ["BSMFI", "BsmFI"], + ["BSMI", "BsmI"], + ["BSOFI", "BsoFI"], + ["BSP1286I", "Bsp1286I"], + ["BSPEI", "BspEI"], + ["BSPHI", "BspHI"], + ["BSPMI", "BspMI"], + ["BSRBI", "BsrBI"], + ["BSRDI", "BsrDI"], + ["BSRFI", "BsrFI"], + ["BSRGI", "BsrGI"], + ["BSRI", "BsrI"], + ["BSSHII", "BssHII"], + ["BST1107I", "Bst1107I"], + ["BSTBI", "BstBI"], + ["BSTEII", "BstEII"], + ["BSTNI", "BstNI"], + ["BSTUI", "BstUI"], + ["BSTXI", "BstXI"], + ["BSTYI", "BstYI"], + ["BSU36I", "Bsu36I"], + ["CAC8I", "Cac8I"], + ["CLAI", "ClaI"], + ["CVIJI", "CviJI"], + ["DDEI", "DdeI"], + ["DPNI", "DpnI"], + ["DRAI", "DraI"], + ["DRAIII", "DraIII"], + ["DRDI", "DrdI"], + ["DSAI", "DsaI"], + ["EAEI", "EaeI"], + ["EAGI", "EagI"], + ["EAM1105I", "Eam1105I"], + ["EARI", "EarI"], + ["ECO47III", "Eco47III"], + ["ECO57I", "Eco57I"], + ["ECONI", "EcoNI"], + ["ECOO109I", "EcoO109I"], + ["ECORI", "EcoRI"], + ["ECORV", "EcoRV"], + ["FOKI", "FokI"], + ["FSEI", "FseI"], + ["FSPI", "FspI"], + ["HAEII", "HaeII"], + ["HAEIII", "HaeIII"], + ["HGAI", "HgaI"], + ["HHAI", "HhaI"], + ["HINCII", "HincII"], + ["HINDIII", "HindIII"], + ["HINFI", "HinfI"], + ["HPAI", "HpaI"], + ["HPAII", "HpaII"], + ["HPHI", "HphI"], + ["KPNI", "KpnI"], + ["MAEII", "MaeII"], + ["MAEIII", "MaeIII"], + ["MBOI", "MboI"], + ["MBOII", "MboII"], + ["MLUI", "MluI"], + ["MNLI", "MnlI"], + ["MSCI", "MscI"], + ["MSEI", "MseI"], + ["MSLI", "MslI"], + ["MSPA1I", "MspA1I"], + ["MUNI", "MunI"], + ["MWOI", "MwoI"], + ["NAEI", "NaeI"], + ["NARI", "NarI"], + ["NCII", "NciI"], + ["NCOI", "NcoI"], + ["NDEI", "NdeI"], + ["NHEI", "NheI"], + ["NLAIII", "NlaIII"], + ["NLAIV", "NlaIV"], + ["NOTI", "NotI"], + ["NRUI", "NruI"], + ["NSII", "NsiI"], + ["NSPI", "NspI"], + ["PACI", "PacI"], + ["PFLMI", "PflMI"], + ["PLEI", "PleI"], + ["PMEI", "PmeI"], + ["PMLI", "PmlI"], + ["PPUMI", "PpuMI"], + ["PSHAI", "PshAI"], + ["PSP1406I", "Psp1406I"], + ["PSTI", "PstI"], + ["PVUI", "PvuI"], + ["PVUII", "PvuII"], + ["RSAI", "RsaI"], + ["RSRII", "RsrII"], + ["SACI", "SacI"], + ["SACII", "SacII"], + ["SALI", "SalI"], + ["SAPI", "SapI"], + ["SAU96I", "Sau96I"], + ["SCAI", "ScaI"], + ["SCRFI", "ScrFI"], + ["SEXAI", "SexAI"], + ["SFANI", "SfaNI"], + ["SFCI", "SfcI"], + ["SFII", "SfiI"], + ["SGFI", "SgfI"], + ["SGRAI", "SgrAI"], + ["SMAI", "SmaI"], + ["SNABI", "SnaBI"], + ["SPEI", "SpeI"], + ["SPHI", "SphI"], + ["SRFI", "SrfI"], + ["SSE8387I", "Sse8387I"], + ["SSPI", "SspI"], + ["STUI", "StuI"], + ["STYI", "StyI"], + ["SWAI", "SwaI"], + ["TAQI", "TaqI"], + ["TFII", "TfiI"], + ["TSP45I", "Tsp45I"], + ["TSP509I", "Tsp509I"], + ["TTH111I", "Tth111I"], + ["XBAI", "XbaI"], + ["XCMI", "XcmI"], + ["XHOI", "XhoI"], + ["XMNI", "XmnI"], + ["SACI_NHEI", "sacI NheI"], + ["XMAI", "XmaI"], + ["BAMHI", "BamHI"], + ["CLAI", "ClaI"], + ["PACI", "PacI"], + ["NOTI", "NotI"], + ["SALI", "SalI"], + ["XHOI", "XhoI"], + ["NONE", "none"] + ], + "BACKBONE" : [ + ["PCDNA3", "pCDNA3"], + ["PABES-NEO2000", "pABES-neo 2000"], + ["PUC19", "pUC 19"], + ["PMX-1", "pMX-1"], + ["PRMHA-3", "pRmHa-3"] + ], + "BACTERIAL_HOST" : [ + ["DH10B", "DH10B"], + ["JM110", "JM110"], + ["BL21", "BL21"], + ["DH5A", "DH5a"], + ["PB3", "PB3"], + ["DB31", "DB3.1"], + ["CCDB_SURVIVAL", "ccdB survival"] + ], + "BIOSAFETY_LEVEL" : [ + ["S1", "S1"], + ["S2", "S2"], + ["S3", "S3"] + ], + "SELECTION_IN_BACTERIA" : [ + ["AMPICILLIN", "Ampicillin"], + ["KANAMYCIN", "Kanamycin"], + ["SPECTINOMCIN", "Spectinomcin"], + ["UNKNOWN", "Unknown"] + ], + "SELECTION_IN_EUKARYOTES" : [ + ["G418_NEO", "G418/neo"], + ["MPA", "MPA"], + ["HYGROMYCIN", "Hygromycin"] + ], + "SOURCE_OF_REPLICON" : [ + ["CMV", "CMV"] + ], + "PLASMID_ORGANISM" : [ + ["HUMAN", "human"], + ["MOUSE", "mouse"], + ["RAT", "rat"], + ["XENOPUS", "xenopus"], + ["DROSOPHILA", "drosophila"], + ["YEAST", "yeast"], + ["ECOLI", "E.coli"], + ["SYNTHETIC", "synthetic"] + ], + "PROMOTER" : [ + ["ENDOGENOUS", "endogenous"], + ["GAL1", "gal1"], + ["GALL", "galL"], + ["GALS", "galS"], + ["TET", "tet"], + ["ADH", "adh"], + ["CYC", "cyc"], + ["GPD", "gpd"], + ["DASH", "\"-\""], + ["CMV", "cmv"], + ["SV40", "SV40"], + ["TET_ON", "tet on"], + ["TET_OFF", "tet off"], + ["RIM1", "rim1"] + ], + "EXON_OR_THREE_PRIME" : [ + ["EXON", "exon"], + ["3P", "3'"], + ["5P", "5'"] + ], + "SIRNA_SPECIES" : [ + ["HUMAN", "Human"], + ["MOUSE", "Mouse'"], + ], + "SIRNA_COMPANY" : [ + ["AMBION", "Ambion"], + ["DHARMACON", "Dharmacon'"], + ["INVITORGEN", "Invitrogen'"], + ["MICROSYNTH", "Microsynth'"], + ["QIAGEN", "Qiagen'"], + ["GIFT", "Gift'"] + ], + "SIRNA_FREEZER_LOCATION" : [ + ["BIGLABFREEZER", "BigLab freezer"], + ["SMALLLAB_BIGFREEZER", "SmallLab Big freezer'"], + ["FREEZER_G17", "Freezer G17'"], + ["G93-FRANK", "G9.3--Frank'"], + ["FREEZER-G17_BOX_NATHALIE", "Freezer G17 Box Nathalie'"], + ["BOX-THIBAULT-BIGFREEZER-SMALLLAB", "Box thibault Big freezer small lab'"], + ["BOX-NATHALIE", "Box Nathalie'"] + ], + "TRANSFECTION_AGENT" : [ + ["FUGENE", "Fugene"], + ["LIPOFECTAMINE", "Lipofectamine'"], + ["OLIGOFECTAMINE", "Oligofectamine'"], + ["RNAIMAX", "RNAimax'"] + ], + "FREEZER" : [ + ["G9_FRIDGE-1", "G9 Fridge 1"], + ["G9_FRIDGE-2", "G9 Fridge 2"], + ["G9_FREEZER-A", "-20C Small Peter Lab"], + ["G9_FREEZER-B", "G9 Freezer B"], + ["G9_FREEZER-C", "G9 Freezer C"], + ["G10_FREEZER-D", "G10 Freezer D"], + ["G10_FREEZER-E", "G10 Freezer E"], + ["G10_FREEZER-F", "G10 Freezer F"], + ["G10_FREEZER-G", "G10 Freezer G"], + ["G10_FREEZER-H", "G10 Freezer H"], + ["G10_FREEZER-I", "G10 Freezer I"], + ["G10_FRIDGE-3", "+4C Big Peter Lab"], + ["G10_FRIDGE-4", "G10 Fridge 4"], + ["G10_FRIDGE-5", "G10 Fridge 5"], + ["G10_FRIDGE-6", "G10 Fridge 6"], + ["G10_FRIDGE-7", "G10 Fridge 7"], + ["G11_FRIDGE-8", "G10 Fridge 8"], + ["G14_FREEZER-J", "G14 Freezer J"], + ["G14_FREEZER-K", "G14 Freezer K"], + ["G14_FREEZER-L", "G14 Freezer L"], + ["G14_FREEZER-M", "G14 Freezer M"], + ["G14_FRIDGE-9", "G14 Fridge 9"], + ["G14_FRIDGE-10", "G14 Fridge 10"], + ["G17_FRIDGE-11", "G17 Fridge 11"], + ["G17_FRIDGE-12", "G17 Fridge 12"], + ["G17_FREEZER-N", "G17 Freezer N"], + ["USER_BENCH-20", "Bench -20�C"], + ["USER_BENCH-80", "Bench -80�C"], + ["USER_BENCH-RT", "Bench RT"], + ["USER_BENCH", "Bench"] + ], + "STORAGE_BOX_SIZE" : [ + ["9X9", "9 x 9 box"], + ["5X5", "5 x 5 box"], + ["10X10", "10 x 10 box"], + ["10X12", "10 x 12 box"] + ], + } \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/2/as/initialize-master-data.py b/plasmid/source/core-plugins/petermigration/2/as/initialize-master-data.py new file mode 100644 index 00000000000..ddb26f48fbf --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/as/initialize-master-data.py @@ -0,0 +1,155 @@ +# +# Copyright 2014 ETH Zuerich, Scientific IT Services +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# MasterDataRegistrationTransaction Class +import definitions +import definitionsVoc +import os +import copy +import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType + +## +## Globals +## +vocabulariesCache = {}; +propertiesCache = {}; +samplesCache = {}; +tr = service.transaction() + +## +## API Facade +## +def createVocabularyWithTerms(vocabularyCode, terms): + vocabulary = tr.createNewVocabulary(vocabularyCode); + vocabulary.setChosenFromList(True); + addTerms(vocabulary, terms); + vocabulariesCache[vocabularyCode] = vocabulary; + +def addTerms(vocabulary, terms): + for term in terms: + addTermWithLabel(vocabulary, term[0], term[1]) + +def addTermWithLabel(vocabulary, termCode, termLabel): + newTerm = tr.createNewVocabularyTerm(termCode); + newTerm.setLabel(termLabel); + vocabulary.addTerm(newTerm); + +def createSampleTypeWithProperties(sampleTypeCode, description, properties): + newSampleType = tr.getOrCreateNewSampleType(sampleTypeCode); + newSampleType.setDescription(description); + newSampleType.setShowParents(True); + newSampleType.setAutoGeneratedCode(True); + newSampleType.setGeneratedCodePrefix(sampleTypeCode[:3]); + addProperties(newSampleType, properties); + samplesCache[sampleTypeCode] = newSampleType; + +def createDataSetTypeWithProperties(dataSetCode, kind, description, properties): + newDataSet = tr.getOrCreateNewDataSetType(dataSetCode); + newDataSet.setDataSetKind(kind); + newDataSet.setDescription(description); + addProperties(newDataSet, properties); + +def createExperimentTypeWithProperties(experimentTypeCode, description, properties): + newExperiment = tr.getOrCreateNewExperimentType(experimentTypeCode); + newExperiment.setDescription(description); + addProperties(newExperiment, properties); + +def addPropertiesToSamples(sampleTypeCodes, properties): + for sampleTypeCode in sampleTypeCodes: + sampleType = samplesCache[sampleTypeCode]; + if sampleType is None: + sampleType = tr.getSampleType(sampleType) + addProperties(sampleType, properties); + +def addProperties(entity, properties): + for property in properties: + addProperty(entity, property[0], property[1], property[2], property[3], property[4], property[5], property[6], property[7], property[8]); + +def addProperty(entity, propertyCode, section, propertyLabel, dataType, vocabularyCode, propertyDescription, managedScript, dynamicScript, isMandatory): + property = None; + + if propertyCode in propertiesCache: + property = propertiesCache[propertyCode]; + else: + property = createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode); + + propertyAssignment = tr.assignPropertyType(entity, property); + propertyAssignment.setSection(section); + propertyAssignment.setMandatory(isMandatory); + if managedScript != None: + propertyAssignment.setManaged(True); + propertyAssignment.setShownEdit(True); + propertyAssignment.setScriptName(managedScript); + if dynamicScript != None: + propertyAssignment.setDynamic(True); + propertyAssignment.setShownEdit(True); + propertyAssignment.setScriptName(dynamicScript); + +def createProperty(propertyCode, dataType, propertyLabel, propertyDescription, vocabularyCode): + property = tr.getOrCreateNewPropertyType(propertyCode, dataType); + property.setDescription(propertyDescription); + property.setLabel(propertyLabel); + propertiesCache[propertyCode] = property; + if dataType == DataType.CONTROLLEDVOCABULARY: + property.setVocabulary(vocabulariesCache[vocabularyCode]); + return property; + +def addStorageGroups(numGroups, sampleType): + for storageIdx in range(1,(numGroups + 1)): + storageGroup = definitions.getStorageGroupDefinition(); + for property in storageGroup: + property[0] = property[0] + "_" + str(storageIdx); + property[1] = property[1] + "_" + str(storageIdx); + property[5] = property[5] + "_" + str(storageIdx); + addPropertiesToSamples([sampleType], storageGroup); + +def addBoxSizeProperty(numGroups, sampleType): + for storageIdx in range(1,(numGroups + 1)): + property = ["STORAGE_BOX_SIZE", "Physical Storage", "box size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box size", None, None, False]; + property[0] = property[0] + "_" + str(storageIdx); + property[1] = property[1] + "_" + str(storageIdx); + property[5] = property[5] + "_" + str(storageIdx); + addPropertiesToSamples([sampleType], storageGroup); + +#Valid Script Types: DYNAMIC_PROPERTY, MANAGED_PROPERTY, ENTITY_VALIDATION +def createScript(path, name, description, scriptType, entityType): + scriptAsString = open(path, 'r').read(); + script = tr.getOrCreateNewScript(name); + script.setName(name); + script.setDescription(description); + script.setScript(scriptAsString); + script.setScriptType(scriptType); + script.setEntityForScript(entityType); + return script; + +## +## Vocabulary Types +## +createVocabularyWithTerms("STORAGE_BOX_SIZE", [ + ["9X9", "9 x 9 box"], + ["5X5", "5 x 5 box"], + ["10X10", "10 x 10 box"], + ["10X12", "10 x 12 box"] + ]); + +## +## New Position Property +## +addBoxSizeProperty(definitions.numberOfStorageGroups, "ANTIBODY"); +addBoxSizeProperty(definitions.numberOfStorageGroups, "CELL"); +addBoxSizeProperty(definitions.numberOfStorageGroups, "STRAIN"); +addBoxSizeProperty(definitions.numberOfStorageGroups, "PLASMID"); +addBoxSizeProperty(definitions.numberOfStorageGroups, "OLIGO"); diff --git a/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitions.py b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitions.py new file mode 100644 index 00000000000..6cf0d515317 --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitions.py @@ -0,0 +1,375 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType + +# +# Helper Methods +# +def getPropertyDefinitionByCode(definition, code): + for property in definition: + if property[0] == code: + return property + return None + +# +# Scripts +# +commentsScriptName = "COMMENTS"; +adenosineScriptName = "ADENOSINE_COUNT" +cytosineScriptName= "CYTOSINE_COUNT" +gcScriptName= "GC" +guanosineScriptName= "GUANOSINE_COUNT" +lengthScriptName= "SEQUENCE_LENGTH" +nucelotideScriptName= "ONUCLEOTIDE_COUNT" +thymidineScriptName= "THYMIDINE_COUNT" +tmScriptName= "TM" + +# +# Storage +# +numberOfStorageGroups = 65 + +def getStorageGroupPropertyCodes(): + propertyCodes = []; + for property in getStorageGroupDefinition(): + propertyCodes.append(property[0]); + return propertyCodes; + +def getStorageGroupDefinition(): + return [ + ["STORAGE_NAME", "Physical Storage", "location", DataType.CONTROLLEDVOCABULARY, "FREEZER", "Storage Name", None, None, False], + ["STORAGE_ROW", "Physical Storage", "Storage Row", DataType.INTEGER, None, "Storage Row", None, None, False], + ["STORAGE_COLUMN", "Physical Storage", "Storage Column", DataType.INTEGER, None, "Storage Column", None, None, False], + ["STORAGE_BOX_NAME", "Physical Storage", "box label", DataType.VARCHAR, None, "Storage Box Name", None, None, False], + ["STORAGE_BOX_SIZE", "Physical Storage", "box size", DataType.CONTROLLEDVOCABULARY, "STORAGE_BOX_SIZE", "Storage Box size", None, None, False], + ["STORAGE_USER", "Physical Storage", "frozen by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "Storage User Id", None, None, False], + ["STORAGE_BOX_POSITION", "Physical Storage", "position", DataType.VARCHAR, None, "Storage Box Position", None, None, False] +]; + +# +# Experiment Types +# +experimentDefinition = [ + ["NAME", "General", "Name", DataType.VARCHAR, None, "Name", None, None, False], + ["EXPERIMENTAL_GOALS", "General", "Experimental goals", DataType.MULTILINE_VARCHAR, None, "Goal of the experiment", None, None, False], + ["GRANT", "General", "Grant", DataType.VARCHAR, None, "grant name", None, None, False], + ["START_DATE", "General", "Start Date", DataType.TIMESTAMP, None, "Start Date", None, None, False], + ["END_DATE", "General", "End Date", DataType.TIMESTAMP, None, "End Date", None, None, False], + ["EXPERIMENTAL_RESULTS", "General", "Experimental results", DataType.MULTILINE_VARCHAR, None, "Brief summary of the results obtained", None, None, False], + ["XMLCOMMENTS", "Comments","Comments List", DataType.XML, None, "Several comments can be added by different users", commentsScriptName, None, False] +]; + +# +# Sample Types +# +antibodyDefinition = [ + ["NAME", "General", "antibody ID", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_ID_NR", "General", "antibody_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["ANTIGEN", "General", "antigen", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_FACS_BLOCK", "General", "block facs", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], + ["ANTIBODY_IF_BLOCK", "General", "block IFF", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], + ["ANTIBODY_WB_BLOCK", "General", "block western", DataType.CONTROLLEDVOCABULARY, "BLOCK", "", None, None, False], + ["CATALOGUE_NUMBER", "General", "catalog id #", DataType.VARCHAR, None, "", None, None, False], + ["CLASS", "General", "class", DataType.CONTROLLEDVOCABULARY, "CLASS", "", None, None, False], + ["CLONE", "General", "clone", DataType.VARCHAR, None, "", None, None, False], + ["COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], + ["ANTIBODY_FACS_CONC", "General", "conc facs", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], + ["ANTIBODY_IF_CONC", "General", "conc IFF", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_FACS", "", None, None, False], + ["ANTIBODY_IP_CONC", "General", "conc ip", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_IP", "", None, None, False], + ["ANTIBODY_WB_CONC", "General", "conc western", DataType.CONTROLLEDVOCABULARY, "CONCENTRATION_WESTERN", "", None, None, False], + ["ANTIBODY_CONCENTRATION", "General", "concentration", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_CROSSREACTIVITY", "General", "crossreactivity", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_FACS_FIX", "General", "fix facs", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], + ["ANTIBODY_IF_FIX", "General", "fix IFF", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], + ["ANTIBODY_WB_FIX", "General", "fix western", DataType.CONTROLLEDVOCABULARY, "FIX", "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["LABEL", "General", "label", DataType.CONTROLLEDVOCABULARY, "LABEL", "", None, None, False], + ["LOTNUMBER", "General", "lotnumber", DataType.VARCHAR, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MONO_POLYCLONAL", "General", "mono/polyclonal", DataType.CONTROLLEDVOCABULARY, "MONO-POLYCLONAL", "", None, None, False], + ["ANTIBODY_FACS_NOTES", "General", "notes FACS", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_IF_NOTES", "General", "notes IFF", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_IP_NOTES", "General", "notes IP", DataType.VARCHAR, None, "", None, None, False], + ["ANTIBODY_WB_NOTES", "General", "notes western", DataType.VARCHAR, None, "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["ANTIGEN_SIZE", "General", "size", DataType.VARCHAR, None, "", None, None, False], + ["SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "SOURCE", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["BOX", "Storage", "box", DataType.VARCHAR, None, "", None, None, False], + ["RACK", "Storage", "rack", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], + ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] +]; + +cellDefinition = [ + ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], + ["ATCC_NUM", "General", "ATCC No.", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["CELL_ID_NR", "General", "cell_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["CELL_ID_NR_COPY", "General", "cell_id_nr Copy", DataType.VARCHAR, None, "", None, None, False], + ["NAME", "General", "cell ID", DataType.VARCHAR, None, "", None, None, False], + ["CELL_ID_COPY", "General", "cell ID Copy", DataType.VARCHAR, None, "", None, None, False], + ["CLONE", "General", "clone #", DataType.INTEGER, None, "", None, None, False], + ["COMPARE_FIELD", "General", "compare field", DataType.VARCHAR, None, "", None, None, False], + ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT1", "General", "concentration unit 1", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC4", "General", "conc.4", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT4", "General", "concentration unit 4", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["DATE", "General", "date", DataType.TIMESTAMP, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["LINE_NAME", "General", "line name", DataType.VARCHAR, None, "", None, None, False], + ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], + ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MYCOPLASM_TESTED", "General", "mycoplasm_tested", DataType.BOOLEAN, None, "", None, None, False], + ["OBTAINED_FROM", "General", "obtained from", DataType.CONTROLLEDVOCABULARY, "CELL_OBTAINED_FROM", "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], + ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], + ["PERS_CELL_NUMBER", "General", "PersCellNumber", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION_PLASMID1", "General", "sel.1", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SELECTION_PLASMID2", "General", "sel.2", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SELECTION_PLASMID3", "General", "sel.3", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SELECTION_PLASMID4", "General", "sel.4", DataType.CONTROLLEDVOCABULARY, "SELECTION", "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "CELL_SPECIES", "", None, None, False], + ["VIRUS_ID1", "General", "virus ID 1", DataType.VARCHAR, None, "", None, None, False], + ["VIRUS_ID2", "General", "virus ID 2", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "Reference", "reference", DataType.VARCHAR, None, "", None, None, False], + ["COMMENTS", "Comments", "info", DataType.VARCHAR, None, "", None, None, False] +]; + +strainDefinition = [ + ["CO2", "General", "%CO2", DataType.CONTROLLEDVOCABULARY, "CO2", "", None, None, False], + ["BACKGROUND", "General", "background", DataType.CONTROLLEDVOCABULARY, "STRAIN_BACKGROUND", "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["CIR", "General", "cir", DataType.CONTROLLEDVOCABULARY, "CIR", "", None, None, False], + ["CONC_INDUCER1", "General", "conc. inducer 1", DataType.VARCHAR, None, "", None, None, False], + ["CONC_INDUCER2", "General", "conc. inducer 2", DataType.VARCHAR, None, "", None, None, False], + ["CONC_INDUCER3", "General", "conc. inducer 3", DataType.VARCHAR, None, "", None, None, False], + ["CONC1", "General", "conc.1", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT1", "General", "concentration unit 1", DataType.VARCHAR, None, "", None, None, False], + ["CONC2", "General", "conc.2", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT2", "General", "concentration unit 2", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONC3", "General", "conc.3", DataType.REAL, None, "", None, None, False], + ["CONC_UNIT3", "General", "concentration unit 3", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], + ["DERIVATION", "General", "derivation", DataType.CONTROLLEDVOCABULARY, "DERIVATION", "", None, None, False], + ["EXPRESSED_PROTEIN1", "General", "expressed protein 1", DataType.VARCHAR, None, "", None, None, False], + ["EXPRESSED_PROTEIN2", "General", "expressed protein 2", DataType.VARCHAR, None, "", None, None, False], + ["EXPRESSED_PROTEIN3", "General", "expressed protein 3", DataType.VARCHAR, None, "", None, None, False], + ["FREE_PLASMID", "General", "freeplasmid", DataType.VARCHAR, None, "", None, None, False], + ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["GAL", "General", "gal", DataType.CONTROLLEDVOCABULARY, "GAL", "", None, None, False], + ["GENE_EXPRESSION1", "General", "gene expression 1", DataType.VARCHAR, None, "", None, None, False], + ["GENE_EXPRESSION2", "General", "gene expression 2", DataType.VARCHAR, None, "", None, None, False], + ["GROWTH_TEMPERATURE", "General", "growth temperature", DataType.CONTROLLEDVOCABULARY, "GROWTH_TEMPERATURE", "", None, None, False], + ["INDUCER1", "General", "inducer 1", DataType.VARCHAR, None, "", None, None, False], + ["INDUCER2", "General", "inducer 2", DataType.VARCHAR, None, "", None, None, False], + ["INDUCER3", "General", "inducer 3", DataType.VARCHAR, None, "", None, None, False], + ["COMMENTS", "General", "info", DataType.VARCHAR, None, "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MARKERS", "General", "markers", DataType.VARCHAR, None, "", None, None, False], + ["MAT", "General", "mat", DataType.CONTROLLEDVOCABULARY, "MAT", "", None, None, False], + ["MEDIUM", "General", "medium", DataType.CONTROLLEDVOCABULARY, "MEDIUM", "", None, None, False], + ["MEDIUM_SPECIALS", "General", "medium specials", DataType.VARCHAR, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["NUMBER", "General", "number", DataType.VARCHAR, None, "", None, None, False], + ["STRAIN_OBTAINED_FROM", "General", "obtained from", DataType.VARCHAR, None, "", None, None, False], + ["ORF", "General", "orf", DataType.VARCHAR, None, "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PARENTAL_CELL", "General", "parental cell", DataType.VARCHAR, None, "", None, None, False], + ["PASSAGE", "General", "passage", DataType.VARCHAR, None, "", None, None, False], + ["PERSYEASTNUMBER", "General", "persyeastnumber", DataType.INTEGER, None, "", None, None, False], + ["PETERYEASTNUMBER", "General", "peteryeastnumber", DataType.INTEGER, None, "", None, None, False], + ["PLASMID_ID1", "General", "plasmid ID 1", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID2", "General", "plasmid ID 2", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID3", "General", "plasmid ID 3", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER1", "General", "promoter 1", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER2", "General", "promoter 2", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER3", "General", "promoter 3", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "General", "reference", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION1", "General", "sel.1", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION2", "General", "sel.2", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION3", "General", "sel.3", DataType.VARCHAR, None, "", None, None, False], + ["SELECTION", "General", "selection", DataType.CONTROLLEDVOCABULARY, "SELECTION_YEAST", "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["STRAIN_SOURCE", "General", "source", DataType.CONTROLLEDVOCABULARY, "STRAIN_SOURCE", "", None, None, False], + ["SPECIES", "General", "species", DataType.VARCHAR, None, "", None, None, False], + ["STRAIN_ID_NR", "General", "strain_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["NAME", "General", "strain ID", DataType.VARCHAR, None, "", None, None, False], + ["STRAIN_NAME", "General", "strain name", DataType.VARCHAR, None, "", None, None, False] +]; + +oligoDefinition = [ + ["AMOUNT", "General", "amount", DataType.REAL, None, "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["OLIGO_COMPANY", "General", "company", DataType.CONTROLLEDVOCABULARY, "OLIGO_COMPANY", "", None, None, False], + ["CONCENTRATION", "General", "concentration", DataType.REAL, None, "", None, None, False], + ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], + ["GRADE", "General", "grade", DataType.CONTROLLEDVOCABULARY, "OLIGO_GRADE", "", None, None, False], + ["COMMENTS", "General", "Info", DataType.VARCHAR, None, "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["OD", "General", "od", DataType.INTEGER, None, "", None, None, False], + ["NAME", "General", "oligo ID", DataType.INTEGER, None, "", None, None, False], + ["OLIGO_ID_NR", "General", "oligo_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["ORDER_DATE", "General", "order date", DataType.VARCHAR, None, "", None, None, False], + ["OLIGO_ORGANISM", "General", "organism", DataType.CONTROLLEDVOCABULARY, "OLIGO_ORGANISM", "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PRIMER_PARTNER", "General", "primer partner", DataType.VARCHAR, None, "", None, None, False], + ["PRIMER_POSITION", "General", "primer position", DataType.CONTROLLEDVOCABULARY, "PRIMER_POSITION", "", None, None, False], + ["PUBLISHED_IN", "General", "PublishedIn", DataType.VARCHAR, None, "", None, None, False], + ["RESTRICTION_SITE", "General", "restriction site", DataType.CONTROLLEDVOCABULARY, "RESTRICTION", "", None, None, False], + ["SEQUENCE", "General", "sequence", DataType.VARCHAR, None, "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.VARCHAR, None, "", None, None, False], + ["USAGE", "General", "usage", DataType.CONTROLLEDVOCABULARY, "OLIGO_USAGE", "", None, None, False], + ["ADENOSINE", "Calculated fields", "adenosine", DataType.INTEGER, None, "", adenosineScriptName, None, False], + ["CYTOSINE", "Calculated fields", "cytosine", DataType.INTEGER, None, "", cytosineScriptName, None, False], + ["GUANOSINE", "Calculated fields", "guanosine", DataType.INTEGER, None, "", guanosineScriptName, None, False], + ["THYMIDINE", "Calculated fields", "thymidine", DataType.INTEGER, None, "", thymidineScriptName, None, False], + ["LENGTH", "Calculated fields", "length", DataType.INTEGER, None, "", lengthScriptName, None, False], + ["GC", "Calculated fields", "gc", DataType.REAL, None, "", gcScriptName, None, False], + ["TM", "Calculated fields", "tm", DataType.REAL, None, "", tmScriptName, None, False], + ["O_NUCLEOTIDE", "Calculated fields", "O nucleotide", DataType.INTEGER, None, "", nucelotideScriptName, None, False] +]; + +plasmidDefinition = [ + ["BACKBONE", "General", "backbone", DataType.CONTROLLEDVOCABULARY, "BACKBONE", "", None, None, False], + ["BACKUP_STORAGE", "General", "backup storage", DataType.VARCHAR, None, "", None, None, False], + ["BACTERIAL_HOST", "General", "bacterial host", DataType.CONTROLLEDVOCABULARY, "BACTERIAL_HOST", "", None, None, False], + ["BARCODE", "General", "barcode", DataType.VARCHAR, None, "", None, None, False], + ["BARCODE_LABEL", "General", "barcode label", DataType.VARCHAR, None, "", None, None, False], + ["BIOSAFETY_LEVEL", "General", "biosafety level", DataType.CONTROLLEDVOCABULARY, "BIOSAFETY_LEVEL", "", None, None, False], + ["BOXNR", "General", "boxNr", DataType.VARCHAR, None, "", None, None, False], + ["CONCENTRATION_UNIT", "General", "concentration unit", DataType.CONTROLLEDVOCABULARY, "CONC_UNITS", "", None, None, False], + ["CONSTRUCTION_METHOD", "General", "construction method", DataType.VARCHAR, None, "", None, None, False], + ["CREATION_DATE", "General", "creation date", DataType.TIMESTAMP, None, "", None, None, False], + ["CTERMTAG", "General", "Ctermtag", DataType.VARCHAR, None, "", None, None, False], + ["DATE", "General", "date", DataType.VARCHAR, None, "", None, None, False], + ["DATE_OF_CONSTRUCTION", "General", "date of construction", DataType.TIMESTAMP, None, "", None, None, False], + ["DERIVATIVE_OF", "General", "Derivative of", DataType.VARCHAR, None, "", None, None, False], + ["ECOLI_STRAIN", "General", "E.coli strain", DataType.VARCHAR, None, "", None, None, False], + ["EXCISE_INSERT", "General", "excise insert", DataType.VARCHAR, None, "", None, None, False], + ["EXCISE_INSERT2", "General", "excise insert 2", DataType.VARCHAR, None, "", None, None, False], + ["FREEZEDATE", "General", "freezedate", DataType.VARCHAR, None, "", None, None, False], + ["FROZEN", "General", "frozen", DataType.TIMESTAMP, None, "", None, None, False], + ["FUNCTIONAL_ELEMENTS_INSERT", "General", "functional elements insert", DataType.VARCHAR, None, "", None, None, False], + ["HYPERCARD_FILE", "General", "hypercard file", DataType.VARCHAR, None, "", None, None, False], + ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], + ["INSERT", "General", "insert", DataType.VARCHAR, None, "", None, None, False], + ["INSERTION_SITE", "General", "insertion site", DataType.VARCHAR, None, "", None, None, False], + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["LINEARIZE", "General", "linearize", DataType.VARCHAR, None, "", None, None, False], + ["MARKER", "General", "Marker", DataType.VARCHAR, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "modification date", DataType.VARCHAR, None, "", None, None, False], + ["MODIFIED_BY", "General", "modified by", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["NAME_OF_PARENTAL_CLONE", "General", "name of parental clone", DataType.VARCHAR, None, "", None, None, False], + ["NAME_OF_VECTOR", "General", "name of vector", DataType.VARCHAR, None, "", None, None, False], + ["NTERMTAG", "General", "Ntermtag", DataType.VARCHAR, None, "", None, None, False], + ["NUCLEOTIDE_SEQUENCE", "General", "nucleotide sequence", DataType.VARCHAR, None, "", None, None, False], + ["OLIGOS_USED", "General", "oligos used", DataType.VARCHAR, None, "", None, None, False], + ["ORGANISM", "General", "organism", DataType.VARCHAR, None, "", None, None, False], + ["ORIGIN_OF_REPLICATION", "General", "origin of replication", DataType.VARCHAR, None, "", None, None, False], + ["OTHER_MARKER", "General", "other marker", DataType.VARCHAR, None, "", None, None, False], + ["PAGE_NUMBER", "General", "page number", DataType.VARCHAR, None, "", None, None, False], + ["PERSPLASMIDNUM", "General", "persPlasmidnum", DataType.REAL, None, "", None, None, False], + ["PETERPLASMIDNUM", "General", "PeterPlasmidNum", DataType.INTEGER, None, "", None, None, False], + ["NAME", "General", "plasmid ID", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_ID_NR", "General", "plasmid_id_nr", DataType.VARCHAR, None, "", None, None, False], + ["PLASMIDNAME", "General", "plasmidname", DataType.VARCHAR, None, "", None, None, False], + ["PRIMERS", "General", "primers", DataType.VARCHAR, None, "", None, None, False], + ["PROMOTER", "General", "promoter", DataType.CONTROLLEDVOCABULARY, "PROMOTER", "", None, None, False], + ["SELECTION_IN_BACTERIA", "General", "selection in bacteria", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_BACTERIA", "", None, None, False], + ["SELECTION_IN_EUKARYOTES", "General", "selection in eukaryotes", DataType.CONTROLLEDVOCABULARY, "SELECTION_IN_EUKARYOTES", "", None, None, False], + ["SEQUENCE_FILE_NAME", "General", "sequence file name", DataType.VARCHAR, None, "", None, None, False], + ["SEQUENCING_DATE", "General", "sequencing date", DataType.TIMESTAMP, None, "", None, None, False], + ["SERIAL_NUMBER", "General", "serial number", DataType.INTEGER, None, "", None, None, False], + ["SHELF", "General", "shelf", DataType.VARCHAR, None, "", None, None, False], + ["SIZE_INSERT", "General", "size insert", DataType.REAL, None, "", None, None, False], + ["SIZE_OF_INSERT", "General", "size of insert", DataType.VARCHAR, None, "", None, None, False], + ["SIZE_VECTOR", "General", "size vector", DataType.REAL, None, "", None, None, False], + ["PLASMID_SOURCE", "General", "source", DataType.VARCHAR, None, "", None, None, False], + ["PLASMID_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "PLASMID_ORGANISM", "", None, None, False], + #["TUBES", "General", "TUBES", DataType.VARCHAR, None, "", None, None, False], + ["URL", "Reference", "url", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED_IN", "Reference", "published in", DataType.VARCHAR, None, "", None, None, False] +]; + +chemicalDefinition = [ + ["ARTICLE", "General", "Article", DataType.VARCHAR, None, "", None, None, False], + ["COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "COMPANY", "", None, None, False], + ["ARTICLE_NUM", "General", "Article Number", DataType.VARCHAR, None, "", None, None, False], + ["RECORD_NUMBER", "General", "RecordNumber", DataType.VARCHAR, None, "", None, None, False], + ["LOCATION", "Location", "Location", DataType.VARCHAR, None, "", None, None, False] +]; + +siRNADefinition = [ + ["INVESTIGATOR", "General", "investigator", DataType.CONTROLLEDVOCABULARY, "ALL_LAB_MEMBERS", "", None, None, False], + ["GENE_LOCUS", "General", "gene locus", DataType.VARCHAR, None, "", None, None, False], + ["EXON_OR_THREE_PRIME", "General", "exon or three prime", DataType.CONTROLLEDVOCABULARY, "EXON_OR_THREE_PRIME", "", None, None, False], + ["EXON", "General", "exon #", DataType.INTEGER, None, "", None, None, False], + ["3_PRIME_POSITION", "General", "3' position", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_SPECIES", "General", "species", DataType.CONTROLLEDVOCABULARY, "SIRNA_SPECIES", "", None, None, False], + ["SEQUENCE", "General", "SEQUENCE", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_COMPANY", "General", "Company", DataType.CONTROLLEDVOCABULARY, "SIRNA_COMPANY", "", None, None, False], + ["STOCK_CONCENTRATION", "General", "Stock concentration", DataType.REAL, None, "", None, None, False], + ["WORKING_CONCENTRATION", "General", "Working concentration", DataType.REAL, None, "", None, None, False], + ["EFFICIENCY", "General", "Efficiency", DataType.VARCHAR, None, "", None, None, False], + ["EFFICIENCY_QPCR", "General", "Efficiency_qPCR", DataType.VARCHAR, None, "", None, None, False], + ["EFFICIENCY_WESTERN", "General", "Efficiency_Western", DataType.VARCHAR, None, "", None, None, False], + ["EFFICIENCY_OTHER", "General", "Efficiency_other", DataType.VARCHAR, None, "", None, None, False], + ["OFF_TARGET_EFFECTS", "General", "Off target effects", DataType.VARCHAR, None, "", None, None, False], + ["INFO", "General", "Info", DataType.VARCHAR, None, "", None, None, False], + ["SPECIFIC_SPLICE_VARIANT", "General", "Specific splice variant", DataType.VARCHAR, None, "", None, None, False], + ["TRANSFECTION_AGENT", "General", "Transfection agent", DataType.CONTROLLEDVOCABULARY, "TRANSFECTION_AGENT", "", None, None, False], + ["LIBRARY", "General", "Library", DataType.VARCHAR, None, "", None, None, False], + ["CHARACTERIZED_BY_COMPANY", "General", "Characterized by company", DataType.VARCHAR, None, "", None, None, False], + ["NUMBERINPOOL", "General", "NumberINpool", DataType.INTEGER, None, "", None, None, False], + ["TEST", "General", "Test", DataType.VARCHAR, None, "", None, None, False], + ["CHEMICAL_MODIFICATION", "General", "Chemical modification", DataType.VARCHAR, None, "", None, None, False], + ["OLIGO_NAME", "General", "Oligo name", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_OLIGONUMBER", "General", "siRNA_OligoNumber", DataType.VARCHAR, None, "", None, None, False], + ["SIRNA_FREEZER_LOCATION", "General", "Freezer Location", DataType.CONTROLLEDVOCABULARY, "SIRNA_FREEZER_LOCATION", "", None, None, False], + ["DRAWER", "General", "Drawer", DataType.VARCHAR, None, "", None, None, False], + ["PUBLISHED", "Reference", "Published", DataType.VARCHAR, None, "", None, None, False] +]; + +# +# Data Set Types +# +documentDefinition = [ + ["CREATION_DATE", "General", "date created", DataType.TIMESTAMP, None, "", None, None, False], + ["MODIFICATION_DATE", "General", "date modified", DataType.TIMESTAMP, None, "", None, None, False], + ["INFO", "General", "info", DataType.VARCHAR, None, "", None, None, False], + ["ID_NR", "General", "id_nr", DataType.VARCHAR, None, "", None, None, False], + ["FILE", "General", "file", DataType.VARCHAR, None, "", None, None, False], + ["SERIAL", "General", "serial", DataType.INTEGER, None, "", None, None, False] + +]; diff --git a/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitionsVoc.py b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitionsVoc.py new file mode 100644 index 00000000000..6c41596dc8d --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/definitionsVoc.py @@ -0,0 +1,852 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Helper Methods +# +def getVocabularyTermCodeForVocabularyAndTermLabel(vocabularyCode, termLabel): + vocabulary = vocabularyDefinitions[vocabularyCode] + for term in vocabulary: + if term[1] == termLabel: + #print repr("TERM NOT FOUND IN VOCABULARY LIST: " + unicode(vocabularyCode) + " : '" + unicode(termLabel) + "'") + return term[0] + return None + +# "VOCABULARY_CODE" : { "TERM_CODE" : "OBJECT" } +createdVocabularyTerms = { } + +def printCreatedTerms(): + print "--- Created Vocabulary Terms Report" + for vocabularyCode in createdVocabularyTerms: + print "Vocabulary [" + vocabularyCode + "]" + for vocabularyTermCode in createdVocabularyTerms[vocabularyCode]: + print "Term [" + vocabularyTermCode + "] Label: [" + repr(createdVocabularyTerms[vocabularyCode][vocabularyTermCode].getLabel()) + "]" + print "---" + +def getCreatedTerm(vocabularyCode, termCode): + if vocabularyCode in createdVocabularyTerms: + if termCode in createdVocabularyTerms[vocabularyCode]: + return createdVocabularyTerms[vocabularyCode][termCode] + return None + +def addCreatedTerm(vocabularyCode, termCode, object): + if vocabularyCode not in createdVocabularyTerms: + createdVocabularyTerms[vocabularyCode] = {} + createdVocabularyTerms[vocabularyCode][termCode] = object + +def createVocabularyTerm(tr, vocabularyCode, termCode, termLabel): + createdTerm = getCreatedTerm(vocabularyCode, termCode) + if createdTerm is None: + vocabulary = tr.getVocabularyForUpdate(vocabularyCode) + + for term in vocabulary.getTerms(): + if term.getCode() == termCode: + createdTerm = term + + if createdTerm is None: + createdTerm = tr.createNewVocabularyTerm() + createdTerm.setCode(termCode) + createdTerm.setLabel(termLabel) + createdTerm.setOrdinal(vocabulary.getTerms().size()) + vocabulary.addTerm(createdTerm) + addCreatedTerm(vocabularyCode, termCode, createdTerm) + return createdTerm + +# +# Vocabularies +# + +vocabularyDefinitions = { + "ALL_LAB_MEMBERS" : [ + ["ANNA_DEPLAZES", "Anna Deplazes"], + ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], + ["BRIAN_LUKE", "Brian Luke"], + ["CAROLINE_ZBINDEN", "Caroline Zbinden"], + ["CELINE_LAFOURCADE", "Celine Lafourcade"], + ["CHRISTINE_RUPP", "Christine Rupp"], + ["CLAUDINE_KRAFT", "Claudine Kraft"], + ["EDYTA_SIERGIEJUK", "Edyta Siergiejuk"], + ["FABIAN_HERZOG", "Fabian Herzog"], + ["FABIAN_RUDOLF", "Fabian Rudolf"], + ["FRANK_VAN_DROGEN", "Frank Van Drogen"], + ["GERDA_JORRITSMA", "Gerda Jorritsma"], + ["GWEN_RABUT", "Gw\xe9nael Rabut"], + ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], + ["IRAM_ZAIDI", "Iram Zaidi"], + ["IZABELA_SUMARA", "Izabela Sumara"], + ["LIONEL_PINTARD", "Lionel Pintard"], + ["MALIKAJAQUENOUD", "MalikaJaquenoud"], + ["MARC_SOHRMANN", "Marc Sohrmann"], + ["MARIE-LYN_HECHT", "Marie-Lyn Hecht"], + ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], + ["MATTHIAS_PETER", "Matthias Peter"], + ["MICHAEL_OLMA", "Michael Olma"], + ["MICHAEL_SCHNEIDER", "Michael Schneider"], + ["MICHELE_KNAUS", "Michele Knaus"], + ["MONIKA_GERSBACH", "Monika Gersbach"], + ["NATHALIE_MEYER-SCHALLER", "Nathalie Meyer-Schaller"], + ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], + ["NICOLAS_DARD", "Nicolas Dard"], + ["NICOLAS_PAGE", "Nicolas Page"], + ["PATRICK_PEDRIOLI", "Patrick Pedrioli"], + ["PHILIPPE_WIGET", "Philippe Wiget"], + ["PIERRE_MAILLARD", "Pierre Maillard"], + ["REINHARD_DECHANT", "Reinhard Dechant"], + ["SANDER_SPRINGER", "Sander Springer"], + ["SARAH_GLASER", "Sarah Glaser"], + ["SARAH_MAERKI", "Sarah M\xe4rki"], + ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], + ["SERGE_PELET", "Serge Pelet"], + ["STEFAN_MUELLER", "Stefan M�ller"], + ["TANIA_ROBERTS", "Tania Roberts"], + ["THIMO_KURZ", "Thimo Kurz"], + ["TOBIAS_BRAUN", "Tobias Braun"], + ["VANESSA_REZGUI", "Vanessa Rezgui"], + ["WOJCIECH_PIWKO", "Wojciech Piwko"], + ["YUKIKO_SHIMADA", "Yukiko Shimada"], + ["YVONNE_GLOOR", "Yvonne Gloor"], + ["JOCHEN_BECK", "Jochen Beck"], + ["MONIKA_KIJANSKA", "Monika Kijanska"], + ["ANGIE_RAGHEB", "Angie Ragheb"], + ["ANNE_PACQUELET", "Anne Pacquelet"], + ["BJORN_HEGEMANN", "Bj\xf6rn Hegemann"], + ["JANNY_TILMA", "Janny Tilma"], + ["THIBAULT_COURTHEOUX", "Thibault Courtheoux"], + ["SAMUEL_GILBERTO", "Samuel Gilberto"], + ["REMY_BUSER", "Remy Buser"], + ["RADOSLAV_ENCHEV", "Radoslav Enchev"], + ["MICHAELA_HUBNER", "Michaela Hubner"], + ["MIA_LI", "Mia Li"], + ["JULIEN_MOUYSSET", "Julien Mouysset"] + ], + "LAB_MEMBERS_INITIALS" : [ + ["AD", "AD"], + ["ACB", "ACB"], + ["BL", "BL"], + ["CZ", "CZ"], + ["CL", "CL"], + ["CR", "CR"], + ["CK", "CK"], + ["ES", "ES"], + ["FH", "FH"], + ["FR", "FR"], + ["FD", "FD"], + ["GJ", "GJ"], + ["GR", "GR"], + ["ISS", "ISS"], + ["IZ", "IZ"], + ["IS", "IS"], + ["LP", "LP"], + ["MJ", "MJ"], + ["MSO", "MSo"], + ["MH", "MH"], + ["MG", "MG"], + ["MP", "MP"], + ["MO", "MO"], + ["MSC", "MSc"], + ["MK", "MK"], + ["MG", "MG"], + ["NS", "NS"], + ["NPE", "NPe"], + ["ND", "ND"], + ["NPA", "NPa"], + ["PP", "PP"], + ["PW", "PW"], + ["PM", "PM"], + ["RD", "RD"], + ["SS", "SS"], + ["SG", "SG"], + ["SMA", "SMa"], + ["SL", "SL"], + ["SP", "SP"], + ["SM", "SM"], + ["TR", "TR"], + ["TK", "TK"], + ["TB", "TB"], + ["VR", "VR"], + ["WP", "WP"], + ["YS", "YS"], + ["YG", "YG"], + ["JB", "JB"], + ["MKI", "MKi"] + ], + "BLOCK" : [ + ["1BSA_01TRITON-X100", "1% BSA; 0.1% Triton-X100"], + ], + "CLASS" : [ + ["IGM", "IgM"], + ["IGG1", "IgG1"], + ["IGG2", "IgG2"] + ], + "COMPANY" : [ + ["ABCAM", "abcam"], + ["CELL_SIGNALING", "cell signaling"], + ["STRATAGEN", "stratagene"], + ["CLONTECH", "clontech"], + ["UBI", "ubi"], + ["SOUTHERN_BIOTECH", "southern biotech"], + ["PIERCE", "pierce"], + ["PHARMIGEN", "pharmingen"], + ["MOLECULAR_PROBES", "molecular probes"], + ["PHARMACIA", "pharmacia"], + ["BIORAD", "biorad"], + ["EUROGENETIC", "eurogentec"], + ["HOMEMADE", "homemade"], + ["BD_BIOSCIENCE", "BD bioscience"], + ["OBTAINED_FROM", "obtained from "], + ["ZYMED", "Zymed"], + ["UNKNOWN", "Unknown"], + ["SANTA_CRUZ", "Santa Cruz"], + ["BIOLEGEND", "Biolegend"], + ["BETHYL", "Bethyl"], + ["UPSTATE", "Upstate"], + ["ROCKLAND", "Rockland"], + ["NOVUS_BIOLOGICALS", "Novus Biologicals"], + ["CHEMICON_INTERNATIONAL", "Chemicon International"], + ["SIGMA", "Sigma"], + ["ALPHA_DIAGNOSTIC_INTERNATIONAL", "Alpha Diagnostic International"], + ["MILLIPORE", "Millipore"], + ["ACTIVE_MOTIF", "Active motif"], + ["NEB", "NEB"], + ["NEOMARKERS", "Neomarkers"], + ["LUBIOSCIENCE", "LubioScience"], + ["EBIOSCIENCE", "eBioscience"], + ["INVITROGEN", "Invitrogen"], + ["STRESSGEN", "Stressgen"], + ["COVANCE", "Covance"], + ["ENZO_LIFE_SCIENCES", "Enzo Life Sciences"], + ["CALBIOCHEM", "Calbiochem"], + ["ROCHE", "Roche"], + ["CYTOSKELETON", "Cytoskeleton"], + ["OPEN_BIOSYSTEMS", "Open Biosystems"], + ["BD_TRANSDUCTION", "BD Transduction"], + ["ATLAS_ANTIBODIES_AB", "Atlas Antibodies AB"], + ["GENENTECH", "Genentech"], + ["TRANSDUCTION_LABS", "Transduction Labs"], + ["ANTIBODIES_INCORPORATED", "Antibodies Incorporated"], + ["BABCO", "BAbCO"], + ["ERICH_NIGG_LAB_BASEL", "Erich Nigg lab (Basel)"], + ["FRANCIS_BARR", "Francis Barr"], + ["AVIVA_SYSTEMS_BIOLOGY", "Aviva Systems Biology"], + ["LUCERNACHEM", "LucernaChem"], + ["LI-COR", "LI-COR"], + ["ABGENT", "Abgent"], + ["CHROMOTEK", "Chromotek"], + ["ABNOVA", "Abnova"], + ["UNKNOWN", "Unknown"], + ["ABSEA", "Absea"], + ["GE_HEALTHCARE", "GE Healthcare"], + ["GRAMSCH_LABORATORIES", "Gramsch Laboratories"], + ["ADIPOGEN", "Adipogen"], + ["COSMO_BIO_CO", "Cosmo bio co."], + ["BECKTON_DICKINSON", "Beckton Dickinson"], + ["BIOTIUM", "Biotium"] + ], + "CONCENTRATION_FACS" : [ + ["1_TO_10", "1 : 10"], + ["1_TO_20", "1 : 20"], + ["1_TO_30", "1 : 30"], + ["1_TO_40", "1 : 40"], + ["1_TO_50", "1 : 50"], + ["1_TO_100", "1 : 100"], + ["1_TO_200", "1 : 200"], + ["1_TO_500", "1 : 500"], + ["1_TO_1000", "1 : 1000"], + ["1_TO_2000", "1 : 2000"], + ["1_TO_3000", "1 : 3000"], + ["NOT_TESTED", "not tested"], + ["NOT_WORKING", "not working"] + ], + "CONCENTRATION_IP" : [ + ["1UL", "1 �l"], + ["5UL", "5 �l"], + ["10UL", "10 �l"], + ["15UL", "15 �l"], + ["20UL", "20 �l"], + ["NOT_TESTED", "not tested"], + ["NOT_WORKING", "not working"] + ], + "CONCENTRATION_WESTERN" : [ + ["1_TO_100", "1 : 100"], + ["1_TO_500", "1 : 500"], + ["1_TO_1000", "1 : 1000"], + ["1_TO_2000", "1 : 2000"], + ["1_TO_3000", "1 : 3000"], + ["1_TO_5000", "1 : 5000"], + ["1_TO_10000", "1 : 10000"], + ["1_TO_20000", "1 : 20000"], + ["1_TO_25000", "1 : 25000"], + ["NOT_TESTED", "not tested"], + ["NOT_WORKING", "not working"] + ], + "CURRENT_LAB_MEMBERS" : [ + ["CAROLINE_ZBINDEN", "Caroline Zbinden"], + ["FRANK_VAN_DROGEN", "Frank Van Drogen"], + ["INGRID_STOFFEL-STUDER", "Ingrid Stoffel-Studer"], + ["MATTHIAS_PETER", "Matthias Peter"], + ["REINHARD_DECHANT", "Reinhard Dechant"], + ["WOJCIECH_PIWKO", "Wojciech Piwko"], + ["JOCHEN_BECK", "Jochen Beck"] + ], + "FIX" : [ + ["1H-RT", "1h, RT"], + ["PTEMF", "PTEMF"], + ["PFA", "PFA"], + ["MEOH", "MeOH"] + ], + "LABEL" : [ + ["HRP", "hrp"], + ["AP", "ap"], + ["FITC", "fitc"], + ["CY3", "Cy3"], + ["ALEXA647", "Alexa 647"] + ], + "ANTIBODY_LOCATION" : [ + ["SMALL_PETER_LAB", "Small Peter Lab"], + ["BIG_PETER_LAB", "Big Peter Lab"], + ["NEW_PETER_LAB", "New Peter Lab"], + ["MINUS20_C-FLOOR", "-20C C-Floor"] + ], + "MONO-POLYCLONAL" : [ + ["MONOCLONAL", "Monoclonal"], + ["POLYCLONAL", "Polyclonal"], + ["UNKNOWN", "Unknown"] + ], + "SOURCE" : [ + ["MOUSE", "Mouse"], + ["RABBIT", "Rabbit"], + ["HAMSTER", "Hamster"], + ["GOAT", "Goat"], + ["RAT", "Rat"], + ["CHICKEN", "Chicken"], + ["SHEEP", "Sheep"], + ["HUMAN", "Human"], + ["GUINEA_PIG", "Guinea pig"], + ["DONEKY", "Donkey"], + ["UNKNOWN", "Unknown"] + ], + "CELL_LOCATION" : [ + ["FRIDGE", "fridge"], + ["FREEZER", "freezer"], + ["REFCO", "refco"], + ["TANK", "tank"] + ], + "SELECTION" : [ + ["NEOMYCIN_G418", "Neomycin/G418"], + ["HYGROMYCIN", "Hygromycin"], + ["MPA", "MPA"], + ["G418", "G418"], + ["PUROMYCIN", "puromycin"], + ["BLASTICIDIN", "Blasticidin"], + ["ZEOCIN", "Zeocin"] + ], + "CO2" : [ + ["5", "5"], + ["7.5", "7.5"] + ], + "GROWTH_TEMPERATURE" : [ + ["37", "37"], + ["28", "28"], + ["34", "34"] + ], + "MEDIUM" : [ + ["RPMI1640", "RPMI 1640"], + ["ISCOVES", "Iscoves"], + ["DMEM", "DMEM"], + ["LB", "LB"], + ["DMEM_NUTRIENT", "DMEM nutrient mixture F-12 HAM [D8437]"] + ], + "CELL_OBTAINED_FROM" : [ + ["FREIBURG", "Freiburg"], + ["ATCC", "ATCC"], + ["DANIEL_GERLICH", "Daniel Gerlich"], + ["ERICH_NIGG", "Erich Nigg"], + ["KREK", "Krek"], + ["TONY_HEYMAN", "Tony Heyman"], + ["THOMAS-WILD_ULRIKE-KUTAY", "Thomas Wild/Ulrike Kutay"], + ["JAN_MICHAEL_PETERS", "Jan-Michael Peters"], + ["M_BRANDEIS", "M Brandeis"], + ["ARI_HELENIUS", "Ari Helenius"], + ["ROMEO_RICCI", "Romeo Ricci"] + ], + "CELL_SPECIES" : [ + ["HUMAN", "human"], + ["MOUSE", "mouse"], + ["RAT", "rat"], + ["CHINESE_HAMSTER", "chines hamster"], + ["HYBRIDOMA", "hybridoma (human & mouse)"] + ], + "CONC_UNITS" : [ + ["MICROG_MICROL", "�g/�l"], + ["MG_ML", "mgl/ml"], + ["UG_ML", "ug/ml"] + ], + "STRAIN_SOURCE" : [ + ["F_CHANG", "F. Chang"], + ["J_CHANT", "J. Chant"], + ["R_DESHAIES", "R. Deshaies"], + ["E_ELION", "E. Elion"], + ["P_HIETER", "P. Hieter"], + ["I_HERSKOWITZ", "I. Herskowitz"], + ["A_NEIMAN", "A. Neiman"], + ["P_SORGER", "P. Sorger"], + ["T_STEARNS", "T. Stearns"], + ["MARC_BONDEL", "Marc Bondel"], + ["G_SUMARA", "G. Sumara"], + ["MICHAEL_ALTMANN", "Michael Altmann"], + ["HETEROZYGOUS_DIPLOID_COLLECTION", "Heterozygous diploid collection"], + ["ANNE-CHRISTINE_BUTTY", "Anne-Christine Butty"], + ["ANNE_PAQUELET", "Anne Paquelet"], + ["YAGMUR-TURGAY_KUTAY-GROUP", "Yagmur Turgay - Kutay group"], + ["BARBAR_CATARIN", "Barbar Catarin"], + ["FRANK_VAN-DROGEN", "Frank van Drogen"], + ["HEMMO_MEYER", "Hemmo Meyer"], + ["JEAN-MARC_GALLAND", "Jean-Marc Galland"], + ["JEFF_PARVIN", "Jeff Parvin"], + ["MARIE-PIERRE_GULLI", "Marie-Pierre Gulli"], + ["MIKIKO_TAKAHASHI", "Mikiko Takahashi"], + ["SANDRA_HENCHOZ", "Sandra Henchoz"], + ["MALIKA_JAQUENOUD", "Malika Jaquenoud"], + ["GERDA_JORRITSMA", "Gerda Jorritsma"], + ["CELINE_LAFOURCADE", "Céline Lafourcade"], + ["CELINE_LONGARETTI", "Céline Longaretti"], + ["BRIAN_LUKE", "Brian Luke"], + ["GUY_NIEDERHAUSER", "Guy Niederhäuser"], + ["NICOLAS_PAGE", "Nicolas Pag�"], + ["NATHALIE_PERRINJAQUET", "Nathalie Perrinjaquet"], + ["MATTHIAS_PETER", "Matthias Peter"], + ["AUDREY_PETIT", "Audrey Petit"], + ["LIONEL_PINTARD", "Lionel Pintard"], + ["YUKIKO_SHIMADA", "Yukiko Shimada"], + ["PHILIPPE_WIGET", "Philippe Wiget"], + ["VOLKER_STUCKE", "Volker Stucke"], + ["KATRIN_PETER", "Katrin Peter"], + ["MARC_BLONDEL", "marc blondel"], + ["M_FUNK", "M. Funk"], + ["ATTILA_BECSKEI", "Attila Becskei"], + ["GWENAEL_RABUT", "Gwenael Rabut"], + ["PHILIP_JERMANN", "Philip Jermann"], + ["P_PRYCIAK", "P.Pryciak"], + ["LINDA_HICKE", "Linda Hicke"], + ["RZPD", "RZPD"], + ["OPENBIO", "OpenBio"], + ["F_POSAS", "F. Posas"], + ["HAPLOID_COLLECTION", "Haploid collection"], + ["MIRIAM_BORTFELD", "Miriam Bortfeld"], + ["EUROSCARF", "Euroscarf"], + ["TS_COLLECTION", "ts collection"], + ["CONZELMANN_LAB", "Conzelmann lab"], + ["SEBASTIAN_LEIDEL", "Sebastian Leidel"], + ["ANNA_DEPLAZES", "Anna Deplazes"], + ["BIBOU", "Bibou"], + ["MARC_SOHRMANN", "Marc sohrmann"] + ], + "SELECTION_YEAST" : [ + ["NONE", "None"], + ["URA", "Ura"], + ["LEU", "Leu"], + ["TRP", "Trp"], + ["HIS", "His"], + ["VIABILITY", "Viability"], + ["NAT", "nat"], + ["KAN", "kan"], + ["KAN_NAT", "kan + nat"], + ["HIS_KAN", "HIS + kan"], + ["HIS_KAN_NAT", "HIS + kan + nat"], + ["HIS", "HIS"], + ["LEU_NAT", "leu + nat"], + ["ADE2", "ade2"] + ], + "DERIVATION" : [ + ["GAMMA_INTEG", "gamma integ"], + ["DELTA_INTEG", "� integ"], + ["5FAO_LOOPOUT", "5-FAO loopout"], + ["PLASMID_SHUFFLE", "plasmid shuffle"], + ["TETRAD", "tetrad"], + ["LOOP-IN_LOOP-OUT", "loop-in/loop-out"], + ["GALPHO", "GalpHO mating type switch"], + ["DELETION", "Deletion"], + ["INTEGRATION", "Integration"] + ], + "STRAIN_BACKGROUND" : [ + ["W303", "W303"], + ["K699", "K699"], + ["K700", "K700"], + ["S288C", "S288C"], + ["1278", "*1278*"], + ["EG123", "EG123"], + ["DF5", "DF5"], + ["SIGMA", "Sigma"], + ["UNKNOWN", "Don't know"], + ["BY7092", "BY7092"], + ["BY5565", "BY5565"], + ["BY4741", "BY4741"] + ], + "CIR" : [ + ["CIR_PLUS", "cir+"], + ["CIR_DEG", "cir�"], + ], + "GAL" : [ + ["PLUS", "Plus"], + ["PLUS_PLUS", "Plus/Plus"], + ["GAL1", "gal1"], + ["GAL1_GAL1", "gal1/gal1"], + ["GAL2", "gal2"], + ["GAL2_GAL2", "gal2/gal2"], + ], + "MAT" : [ + ["AT", "@"], + ["A", "a"], + ["ALPHA", "alpha"], + ["DIPLOID", "diploid"], + ["UNKNOWN", "unknown"] + ], + "OLIGO_ORGANISM" : [ + ["BMV", "BMV"], + ["HUMAN", "human"], + ["MOUSE", "mouse"], + ["RAT", "rat"], + ["XENOPUS", "xenopus"], + ["DROSOPHILA", "drosophila"], + ["YEAST", "yeast"], + ["ECOLI", "E.coli"], + ["SYNTHETIC", "synthetic"], + ["HIV1", "HIV-1"], + ["CELEGANS", "C.elegans"], + ["MYCOPLASMA", "mycoplasma"] + ], + "OLIGO_GRADE" : [ + ["DESALTED", "desalted"], + ["HPLC", "hplc"], + ["PURITY", "purity"], + ["UNKNOWN", "?"] + ], + "PRIMER_POSITION" : [ + ["FORWARD", "forward"], + ["REVERSE", "reverse"] + ], + "OLIGO_COMPANY" : [ + ["MWG", "MWG"], + ["BIG", "BIG"], + ["PHARMACIA", "Pharmacia"], + ["IGLOI", "Igloi"], + ["INVITROGEN", "invitrogen"], + ["MICROSYNTH", "microsynth"] + ], + "OLIGO_USAGE" : [ + ["PCR", "pcr"], + ["SEQUENCING", "sequencing"], + ["HYBRIDIZE", "hybridize"], + ["MUTAGENESIS", "mutagenesis"], + ["RT-PCR", "Real-Time PCR"] + ], + "RESTRICTION" : [ + ["AATII", "AatII"], + ["ACCI", "AccI"], + ["ACII", "AciI"], + ["AFLII", "AflII"], + ["AFLIII", "AflIII"], + ["AGEI", "AgeI"], + ["ALUI", "AluI"], + ["ALWI", "AlwI"], + ["ALWNI", "AlwNI"], + ["APAI", "ApaI"], + ["APALI", "ApaLI"], + ["APOI", "ApoI"], + ["ASCI", "AscI"], + ["ASEI", "AseI"], + ["AVAI", "AvaI"], + ["AVAII", "AvaII"], + ["AVRII", "AvrII"], + ["BAMHI", "BamHI"], + ["BANI", "BanI"], + ["BANII", "BanII"], + ["BBSI", "BbsI"], + ["BBVI", "BbvI"], + ["BCGI-1", "BcgI-1"], + ["BCGI-2", "BcgI-2"], + ["BCLI", "BclI"], + ["BFAI", "BfaI"], + ["BGLI", "BglI"], + ["BGLII", "BglII"], + ["BLPI", "BlpI"], + ["BPMI", "BpmI"], + ["BSAAI", "BsaAI"], + ["BSABI", "BsaBI"], + ["BSAHI", "BsaHI"], + ["BSAI", "BsaI"], + ["BSAJI", "BsaJI"], + ["BSAWI", "BsaWI"], + ["BSERI", "BseRI"], + ["BSGI", "BsgI"], + ["BSIEI", "BsiEI"], + ["BSIHKAI", "BsiHKAI"], + ["BSIWI", "BsiWI"], + ["BSLI", "BslI"], + ["BSMAI", "BsmAI"], + ["BSMBI", "BsmBI"], + ["BSMFI", "BsmFI"], + ["BSMI", "BsmI"], + ["BSOFI", "BsoFI"], + ["BSP1286I", "Bsp1286I"], + ["BSPEI", "BspEI"], + ["BSPHI", "BspHI"], + ["BSPMI", "BspMI"], + ["BSRBI", "BsrBI"], + ["BSRDI", "BsrDI"], + ["BSRFI", "BsrFI"], + ["BSRGI", "BsrGI"], + ["BSRI", "BsrI"], + ["BSSHII", "BssHII"], + ["BST1107I", "Bst1107I"], + ["BSTBI", "BstBI"], + ["BSTEII", "BstEII"], + ["BSTNI", "BstNI"], + ["BSTUI", "BstUI"], + ["BSTXI", "BstXI"], + ["BSTYI", "BstYI"], + ["BSU36I", "Bsu36I"], + ["CAC8I", "Cac8I"], + ["CLAI", "ClaI"], + ["CVIJI", "CviJI"], + ["DDEI", "DdeI"], + ["DPNI", "DpnI"], + ["DRAI", "DraI"], + ["DRAIII", "DraIII"], + ["DRDI", "DrdI"], + ["DSAI", "DsaI"], + ["EAEI", "EaeI"], + ["EAGI", "EagI"], + ["EAM1105I", "Eam1105I"], + ["EARI", "EarI"], + ["ECO47III", "Eco47III"], + ["ECO57I", "Eco57I"], + ["ECONI", "EcoNI"], + ["ECOO109I", "EcoO109I"], + ["ECORI", "EcoRI"], + ["ECORV", "EcoRV"], + ["FOKI", "FokI"], + ["FSEI", "FseI"], + ["FSPI", "FspI"], + ["HAEII", "HaeII"], + ["HAEIII", "HaeIII"], + ["HGAI", "HgaI"], + ["HHAI", "HhaI"], + ["HINCII", "HincII"], + ["HINDIII", "HindIII"], + ["HINFI", "HinfI"], + ["HPAI", "HpaI"], + ["HPAII", "HpaII"], + ["HPHI", "HphI"], + ["KPNI", "KpnI"], + ["MAEII", "MaeII"], + ["MAEIII", "MaeIII"], + ["MBOI", "MboI"], + ["MBOII", "MboII"], + ["MLUI", "MluI"], + ["MNLI", "MnlI"], + ["MSCI", "MscI"], + ["MSEI", "MseI"], + ["MSLI", "MslI"], + ["MSPA1I", "MspA1I"], + ["MUNI", "MunI"], + ["MWOI", "MwoI"], + ["NAEI", "NaeI"], + ["NARI", "NarI"], + ["NCII", "NciI"], + ["NCOI", "NcoI"], + ["NDEI", "NdeI"], + ["NHEI", "NheI"], + ["NLAIII", "NlaIII"], + ["NLAIV", "NlaIV"], + ["NOTI", "NotI"], + ["NRUI", "NruI"], + ["NSII", "NsiI"], + ["NSPI", "NspI"], + ["PACI", "PacI"], + ["PFLMI", "PflMI"], + ["PLEI", "PleI"], + ["PMEI", "PmeI"], + ["PMLI", "PmlI"], + ["PPUMI", "PpuMI"], + ["PSHAI", "PshAI"], + ["PSP1406I", "Psp1406I"], + ["PSTI", "PstI"], + ["PVUI", "PvuI"], + ["PVUII", "PvuII"], + ["RSAI", "RsaI"], + ["RSRII", "RsrII"], + ["SACI", "SacI"], + ["SACII", "SacII"], + ["SALI", "SalI"], + ["SAPI", "SapI"], + ["SAU96I", "Sau96I"], + ["SCAI", "ScaI"], + ["SCRFI", "ScrFI"], + ["SEXAI", "SexAI"], + ["SFANI", "SfaNI"], + ["SFCI", "SfcI"], + ["SFII", "SfiI"], + ["SGFI", "SgfI"], + ["SGRAI", "SgrAI"], + ["SMAI", "SmaI"], + ["SNABI", "SnaBI"], + ["SPEI", "SpeI"], + ["SPHI", "SphI"], + ["SRFI", "SrfI"], + ["SSE8387I", "Sse8387I"], + ["SSPI", "SspI"], + ["STUI", "StuI"], + ["STYI", "StyI"], + ["SWAI", "SwaI"], + ["TAQI", "TaqI"], + ["TFII", "TfiI"], + ["TSP45I", "Tsp45I"], + ["TSP509I", "Tsp509I"], + ["TTH111I", "Tth111I"], + ["XBAI", "XbaI"], + ["XCMI", "XcmI"], + ["XHOI", "XhoI"], + ["XMNI", "XmnI"], + ["SACI_NHEI", "sacI NheI"], + ["XMAI", "XmaI"], + ["BAMHI", "BamHI"], + ["CLAI", "ClaI"], + ["PACI", "PacI"], + ["NOTI", "NotI"], + ["SALI", "SalI"], + ["XHOI", "XhoI"], + ["NONE", "none"] + ], + "BACKBONE" : [ + ["PCDNA3", "pCDNA3"], + ["PABES-NEO2000", "pABES-neo 2000"], + ["PUC19", "pUC 19"], + ["PMX-1", "pMX-1"], + ["PRMHA-3", "pRmHa-3"] + ], + "BACTERIAL_HOST" : [ + ["DH10B", "DH10B"], + ["JM110", "JM110"], + ["BL21", "BL21"], + ["DH5A", "DH5a"], + ["PB3", "PB3"], + ["DB31", "DB3.1"], + ["CCDB_SURVIVAL", "ccdB survival"] + ], + "BIOSAFETY_LEVEL" : [ + ["S1", "S1"], + ["S2", "S2"], + ["S3", "S3"] + ], + "SELECTION_IN_BACTERIA" : [ + ["AMPICILLIN", "Ampicillin"], + ["KANAMYCIN", "Kanamycin"], + ["SPECTINOMCIN", "Spectinomcin"], + ["UNKNOWN", "Unknown"] + ], + "SELECTION_IN_EUKARYOTES" : [ + ["G418_NEO", "G418/neo"], + ["MPA", "MPA"], + ["HYGROMYCIN", "Hygromycin"] + ], + "SOURCE_OF_REPLICON" : [ + ["CMV", "CMV"] + ], + "PLASMID_ORGANISM" : [ + ["HUMAN", "human"], + ["MOUSE", "mouse"], + ["RAT", "rat"], + ["XENOPUS", "xenopus"], + ["DROSOPHILA", "drosophila"], + ["YEAST", "yeast"], + ["ECOLI", "E.coli"], + ["SYNTHETIC", "synthetic"] + ], + "PROMOTER" : [ + ["ENDOGENOUS", "endogenous"], + ["GAL1", "gal1"], + ["GALL", "galL"], + ["GALS", "galS"], + ["TET", "tet"], + ["ADH", "adh"], + ["CYC", "cyc"], + ["GPD", "gpd"], + ["DASH", "\"-\""], + ["CMV", "cmv"], + ["SV40", "SV40"], + ["TET_ON", "tet on"], + ["TET_OFF", "tet off"], + ["RIM1", "rim1"] + ], + "EXON_OR_THREE_PRIME" : [ + ["EXON", "exon"], + ["3P", "3'"], + ["5P", "5'"] + ], + "SIRNA_SPECIES" : [ + ["HUMAN", "Human"], + ["MOUSE", "Mouse'"], + ], + "SIRNA_COMPANY" : [ + ["AMBION", "Ambion"], + ["DHARMACON", "Dharmacon'"], + ["INVITORGEN", "Invitrogen'"], + ["MICROSYNTH", "Microsynth'"], + ["QIAGEN", "Qiagen'"], + ["GIFT", "Gift'"] + ], + "SIRNA_FREEZER_LOCATION" : [ + ["BIGLABFREEZER", "BigLab freezer"], + ["SMALLLAB_BIGFREEZER", "SmallLab Big freezer'"], + ["FREEZER_G17", "Freezer G17'"], + ["G93-FRANK", "G9.3--Frank'"], + ["FREEZER-G17_BOX_NATHALIE", "Freezer G17 Box Nathalie'"], + ["BOX-THIBAULT-BIGFREEZER-SMALLLAB", "Box thibault Big freezer small lab'"], + ["BOX-NATHALIE", "Box Nathalie'"] + ], + "TRANSFECTION_AGENT" : [ + ["FUGENE", "Fugene"], + ["LIPOFECTAMINE", "Lipofectamine'"], + ["OLIGOFECTAMINE", "Oligofectamine'"], + ["RNAIMAX", "RNAimax'"] + ], + "FREEZER" : [ + ["G9_FRIDGE-1", "G9 Fridge 1"], + ["G9_FRIDGE-2", "G9 Fridge 2"], + ["G9_FREEZER-A", "-20C Small Peter Lab"], + ["G9_FREEZER-B", "G9 Freezer B"], + ["G9_FREEZER-C", "G9 Freezer C"], + ["G10_FREEZER-D", "G10 Freezer D"], + ["G10_FREEZER-E", "G10 Freezer E"], + ["G10_FREEZER-F", "G10 Freezer F"], + ["G10_FREEZER-G", "G10 Freezer G"], + ["G10_FREEZER-H", "G10 Freezer H"], + ["G10_FREEZER-I", "G10 Freezer I"], + ["G10_FRIDGE-3", "+4C Big Peter Lab"], + ["G10_FRIDGE-4", "G10 Fridge 4"], + ["G10_FRIDGE-5", "G10 Fridge 5"], + ["G10_FRIDGE-6", "G10 Fridge 6"], + ["G10_FRIDGE-7", "G10 Fridge 7"], + ["G11_FRIDGE-8", "G10 Fridge 8"], + ["G14_FREEZER-J", "G14 Freezer J"], + ["G14_FREEZER-K", "G14 Freezer K"], + ["G14_FREEZER-L", "G14 Freezer L"], + ["G14_FREEZER-M", "G14 Freezer M"], + ["G14_FRIDGE-9", "G14 Fridge 9"], + ["G14_FRIDGE-10", "G14 Fridge 10"], + ["G17_FRIDGE-11", "G17 Fridge 11"], + ["G17_FRIDGE-12", "G17 Fridge 12"], + ["G17_FREEZER-N", "G17 Freezer N"], + ["USER_BENCH-20", "Bench -20�C"], + ["USER_BENCH-80", "Bench -80�C"], + ["USER_BENCH-RT", "Bench RT"], + ["USER_BENCH", "Bench"] + ], + "STORAGE_BOX_SIZE" : [ + ["9X9", "9 x 9 box"], + ["5X5", "5 x 5 box"], + ["10X10", "10 x 10 box"], + ["10X12", "10 x 12 box"] + ], + } \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/lib/FileMakerMain.java b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/lib/FileMakerMain.java new file mode 100644 index 00000000000..a2206338c1c --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/lib/FileMakerMain.java @@ -0,0 +1,77 @@ +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + + +// STEP By Step: +// 1. Open the file maker file with file maker pro +// 2. Go to "File -> Sharing -> ODBC/JDBC" and turn sharing on +// 3. You can go to see the names of the tables and field to "File -> Manage -> Database" +// Without closing file maker pro you can run this script, modify it as needed +// More info at http://www.filemaker.com/support/product/docs/fmp/fm11_odbc_jdbc_guide_en.pdf + +public class FileMakerMain +{ + // NOTE: FileMaker is so dump that you can't get the fileName and the fileData on the same query, the file data will return null, so we make a second call for this + public static final String GET_DOCUMENTS = "SELECT CAST(file AS VARCHAR(1000)) AS fileName, info, serial FROM documents"; + public static final String GET_DOCUMENT_DATA = "SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"; + + static class Document { + String fileName; + String info; + String serial; + + public String toString() + { + return fileName + " " + info; + } + } + + public static List<Document> getDocuments(Connection connection) throws SQLException { + List<Document> documents = new ArrayList<Document>(); + PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENTS); + ResultSet result = preparedStatement.executeQuery(); + + while(result.next()) { + Document document = new Document(); + document.fileName = result.getString("fileName"); + document.info = result.getString("info"); + document.serial = result.getString("serial"); + documents.add(document); + } + result.close(); + preparedStatement.close(); + return documents; + } + + public static byte[] getFile(Connection connection, Document document) throws SQLException { + byte[] bytes = {}; + PreparedStatement preparedStatement = connection.prepareStatement(GET_DOCUMENT_DATA); + preparedStatement.setString(1, document.serial); + ResultSet result = preparedStatement.executeQuery(); + if(result.next()) { + byte[] value = result.getBytes("fileData"); + if(value != null) { + bytes = value; + } + } + result.close(); + preparedStatement.close(); + return bytes; + } + + public static void main(String[] args) throws Exception { + Class.forName("com.filemaker.jdbc.Driver").newInstance(); + Connection connection = DriverManager.getConnection("jdbc:filemaker://127.0.0.1/BOXIT_documents_Peter.fmp12","designer", "seattle"); + + for(Document document: getDocuments(connection)) { + byte[] bytes = getFile(connection, document); + System.out.println(document + " " + bytes.length); + } + connection.close(); + } +} diff --git a/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/lib/fmjdbc.jar b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/lib/fmjdbc.jar new file mode 100644 index 0000000000000000000000000000000000000000..34cae1d60b916205b9039fe765c971229cef1a32 GIT binary patch literal 126155 zcmaI718`*B_CB16olI=owr$($*mfqiZQI7g&cwDS6Wf^N%f<iJo%j2_x2sOqsjl7K zyUz2hwVs8oAPoWv4fKx}bYcYWKX3m11_cBPBrB>SNGmBPM*sc;2uR`IOCf=vK9@=b z?$juLF4h0MP(H8!ER_|MlN1wGR-uy>yOo_7myxEWn}w66rJ9<UZd77eVBR@!oDfEG zpplT7l28ST_(D1<I5#C)9!^?L*&&xqa9`pHel2F&5mI6bjTHk1##s)X<1yx$(W%p^ z^PepM0YUy{x1gU}Ft)Ry|9_hV`sXG;Km5-N{`2l1D@-k{0XBwK0LTAY``2GX{{OAD zG%+&%&le#7`S(HRkS$4HfPlO~fPl#V?=J`$Ist_3Y;6I?&K7pIbjH?(PEIZf<8u81 zC?OxSmZ+lFzCCs)6%PBu$pvI&Wr9&;7a_Y6y{;AK26u}(Pe6Q0*G-UnVY<#4cJH^j z+WdUmTVKu$M}|rwY5lXR7Ht7l*d25XhshZ?nlJtfE<Hv@ArRl$fsLgsMFrbMuPb}= zQX4kLA`8Ul!<_ewv<;MoNZ?dqdxYl147S#7)=B04w+|qI>AK=7lB9uOe<P)+pu9Xr ze-nBZsNb$qP4*)}?kFfiO@l5*d*(_XNC}Tn#9)(Ao7c@m({?}_LT4iJUzG#vdf$K_ zmurf!)SSoG+m6ERYkkj(;z<#MuDWkYE}&XoYJXSD&2eH%*zLK%{c<YK{QLftxEO}x zRNG;DC<{u)#aMoy!kRtXczD1Do6CB%!~4cdC&n%Hf?=rZcJ0ONW=O(H>9__Anm<@a zEmNkwBbPQ+dUM-IL%;y&SlQlP*dB;4lwo26aB{`jZ-T-Z8D+RZ<RN1+n@FL-uAJ5~ z3TsNs6#7i#`6Y5`5;%pX;Vrbv;2xo#)k>pvRP14qv={yVvF2aER^-9>ynF&n`AI6W zzXw(c;N)WMtPF7e7p}odvUc+Vh}pp`CAk*TN_hg5O<)jlG*jKpEJ_tkkT~~<a@uA{ zoK^f+HHxpx99JMuieZ|y=VD~2-4mW$nX4XlhmX0rJwQ7kovnFRecIsI$|_w>@(#g- zViA4$o48L7M>4?vgdZX0%-H(RQ;ew^^*Z3PIV2d-m^iC$vpsneK{pERo6_LY-C?9m zZFZ+U$@5nD$f$$yO*`3``y^<Z7}<mAc!B0V;HO;K#Y}Sa?h->bShmA{_TpFOC+<{m z1?5)e_!cdCSs_^wk5U=^RtN5aX^@>m<p#;n;5rq%vPNQD%<WDpSz+Ea!Eba~Qj+1y zFp)>-3pssLLR5+=;Wx*YA$;*%u71AGiLTN1%F2*-ibB}glEl+Zl+(>@$spAcPFb>K zX-q4+2FZP4-LiLvhy^M<GE&QHw`03yGFDEZn4B80D`Ad{CTn3Avhgqu%H<_P67~3C z&K%7>bZb$1-;B;OW|>eS4-=xolppm~e>cYKC9_(<Qa;>X_<Yxu*KPUesWz$8^h3C5 z^^~~0&0Cu#0|9>&@XH353<U=oA~pXt8vqeRkGz)GCX}wKF&^)-QbtI-G7(R^GPN&k zzKnspG8Qj>)fU1-*>Rzyj+@)xh_%mob}$;bm-3san}$liPq2C~jtPr1VA;bPq$TC~ zFYGy1RML<9WDnY>TlgRBQFb<T2G{^>|IHp3#WA@721Hz8^rIhhO0I1L#ie0Rb|_R} z%{0*}MUG4{l$7Dh*67f=!~O_6g@}oCNhLeuM_rgbkHhb8o*zKpj5#FwZIK=zf2RLb zxg}HgkzdzAZezDSrMa5)THfdL`8jvS<u*~(zTrf5Pv=u&s{cJ_bx#Jual&22Sw>r0 z-I;31<NI4`Ka{F+F0}u`>bL70SCIUKx>!Xnon@>=0Z0|Gl-~I3+8JjWm4X;2;bH+d zU{PZ}rFKz*sZIe0;7GABrhLrhvp&~tu_9KfnY_T=3SvH1ql~^tA_bwVMj&tlAIf%v z+9OUy;YLgS3IRO@{91H-|8@q@IS#%l>>qL=3yEfH%l8fthc{Fi<fa;lcZ<D`<@Qy| zL6+dA^;YH7V_qtbW^Fo|y}SJM7FKV5xiD`p$relF-|6`1Z6CN-r$b305jDPD{WLNM zVjOf3F_a}p3?c;uO(8@*E+RxWY>302`c*&Ws`e{wk<%1zDYO+vA<CI855<seL{57J z>Xhv)h}s+EPiHXy=ms1I1q9TO1O$Zte>(#aM+;Yg<G;K>vbu*i$|CNEoGTkM_r%5U zY`85$heSM10+=zeHA);#LmY?%DDi!obx55_W8;(@;=<CBlGVAP9gNMFWH#OzaC7$Z za&eo*B{glY?a;1spAWOw*GZWKQksQdiJk1XUOn57KHHZWsb>1VKN*3juk66O+LZe| zI~hd=_@L~R2=?SK-LBtE@h*NHw2rok4{M`#!r2|};v!uDp1D2T(Gf1y5c|AHI@O0? zpML*Fx=6hKg87Q7vi~gzLFy?kAo!^+Di8^NjAKH3Yg(I!U|$eQ9EE0B+{9Z&5PjI= z2?GH?^%^RNpK`w}DwKqWW?vaP#V{b$m<K1-AwZRHGAuV<(WFQcQ<;g6djBif{8Ltx zxJS44u(7qH!0>+6eNfbN<C`R=e%!SvxVu!}yn9Ib7VWOIcM7-W4FHVQU9Df;#9MXP z2`MM_iuFt1LyXI^4y}L$6lAMrdw}uJtZFgW3D~$uYS6IqoGCqDG|*8^tF}!X9Bi`R zr=Svd89&bJK!a{t4m2#NwGr(f9%^)lZHePq9S6esMy7s-XhV734foZ{xR#k&JI^$M zsp!Rz0kRf>fnDykEmGO6Mo9*nlE>36#CtP3loff#(h|qW*jClHnzExb&8r^=gEJe$ z*`~RS56s1jjpf%SZeik;qF8!RYF6h+1?U5H<qyN*Gh+}sm${c;)TfMIaiU$h8`qnp z<F$CNY>iU^cC6>X@s9F2HwWoD;W~t4XXBhM_khiID|3cT)97D~m=URwq7ZSnA-W8k z%r(FLezWV#Fs@plLU!a|M7fgRBHgCQvenP8&iEe?4lsg80|#>_G-jb>_u;TQ#c&R~ zlFpv3Z?Iwu1?VX-WYbx-jc?ePS`>Dm9Lm~{N{=)UZgPpgtFX5vaC);tG26}*D;f`; zof4A|pLWbGnH!0RU?fb))h#1uZ-Sa&6`Bz5o}$zW5w6EGgEx8uKSww(O<JQa?}MXq zYEZT8YJEAJB5#N}^|ul{ud^ACF>}0T<gVNU^A;XrXDl$Hw<Q(nA=?`aU16DQurOkq zl*P_CoYU)XRq@8&R=n2ro}SMg>E=|ds3nTcR9&Gcvwu2%efp9<$!If<6)Y5c;H+ib zp08;azb#ub0c(d`SJs&*)lY6<{2|BOZJe~6;fm>+wYV>wq8X+Pk2sxWJoAjJB&FRl zIkGv^T|=Am>$ju@#Pi5%I^`g{^|@`qxpvAt!uO|8l-CAK;pj4%EY&wiVw0W-KTsMT z;YsMWx<m=r+w?tZH5OKO-L1U@%b4Z%YMPoo)|LM27smSm&x%Dy&S?@qA|NW?h}`lg zPQ9PI=qB~qqCG{Sr<9}VZx?8_TSiV4dO3I6#HMsk)MiqmOnvS>O4n9V6;E)vq7oHP zw7#W#T-M}yvcBYM*GRtdl~4&TuC2AF?G@hx*KExmU$(k^q5KrC#oxwItxq=R<Rj3P zv8S~xh{st}-Z1_0Bifog7O7DE02z_5s~?3Wjq_L$W}R*4tl93SHQzXy#%mpknZH?) zzR3=4a|Rm&kOrOFBK&r8sosOJK~*N{5!Z56!<VbhCAGQ&zi-%yI_sgB3FX!!m2V{k zm9gA-FpG<JROz&Gi2htAZ^m1#H^mS=Tm)~1`7w!SoV2!@@bTpo%bt8Zy|rkA-exUp zd$)@@UMUEPf?d5FSnNk$>5tY`=7&zqF$?3phyG$S+bmMr6n^zh(|iNidBdsF7H@Fz zoQLlM97<&DCKtz>yZ5dy3PI4ufneL`i!S9%z115}^5pabDFUZ@v+Xs;Lc7^w`Rfg` zt?v{w`C08F4*C?y6PY8h-RD_NvG_diC=fTsN$J$%RVlOd=pT*0Oeia=4Ik%NOiDJr zl-iGy3ZBritVrE5JiO)b7aig6FVHBvtyQKgTWyKW+TMzIC_kN!{2*H>GuTLz8P!cz z$MYjG`;p>u!8GF>@$Z&+w)(J($}Yq@sN^t1=9U>J{B4n0`OD>`PCL;s{;E5iJzL?% ze%hJra{BqIL^_`!i_ZA1se<$uh5)!k#29}+&<)VQJojfX3COuO1>t>CQ5D!bo<Px& zuPd=DEQ9`%pv^ysio{;1g>r->(l|U+IW1JR8Niyuu8_lK?3ALy;l?AvZWNlMMjElO zBW8^DM3kHzP|mZ`IKX_c7D3k9*E|x#c&AKbQ#E75MYC!b8=!&94!OanTo1jDVy17q zoL?cpkL8PmmuB>_gx>{?O_T+l+VU0i0{H?BcFNor?#0Xf!*RR&JWP5&fXZ^rTEOsz zz>rIi5R6MNkIF8O1Qr7dyEB;^Bft997tCqH7@~{4H5b#-8|+5O)06n&iFbyHu8HPY zk$d;jh#i7}^9ZzE*r%&+h<>duSgq0EjUEC?mDy93tY^erNFkxdu3SQKaEL6DMh#Wi z#F&BdwP0E)lirgRT_B}47Od_L3qecA!+ItpAwkt8J7@KjNR2fB(3Fku$$Eytq2@Z# zV9WrJ5Ot$FN#o^4!S0^O1Lrl^1j1zZNRY<B{Lxrj^1=>YgAH@kNd`K!o(X7l;eHJb zltlzLOGlb-#r|+Ggo8maXsp5eMiL_o+av-^tH|q#lgj%5gjCPKd!#7uM@WeuQX`Il z6js*7g+^BZ$Xr2MMMoX}xb4K_{FcYS7?T<VwRR1ux1f5=Kx(4#eWN)Qq;ljsi<&3% zOx^QAl|Io~N&R4;tcF*if^M!~(2Y>#ROr-FmGo<wi#(xaCC@j9vtlqm^4M}5l6e-% zF;@rL_-+EU93du5!pbF$qA+Tnf#$KWNGjX_A>|{6sajM7LDNJeBGjOgWi|KjQ?py8 z(EIe;=*l@_D}chfjcCzg*8>tY@<jn@juJ<Tnc-V#BE<5J1g9XKv)v)0HKbS>xE|0u z3Q;b!*+SnS?Ur+xM7PrNs^jg0&|vc5QaMVI4*S>i%GY2F%LO%yq$n%1gv^@#?jIiA z5o=}5mg@08P?jbal9b`iNs;gTg)jy#Gzn&t%WeHE=GV$SCd@YjcuB!Vo15y$+<S73 z$PvrF9_n$$Jd54chTA#U=zoLR;3H*~$#;@FX45|=%1AeAt}Loo+Mib_tEr)z?difX zAK{r<ANP07!n<pB&)y#Gui0jp|7}*_2tnE9+mfsD%pK{!gf+d$w8ilH)xwST+rb&e z!wAcg@@i>GogvPR*vT<=U~GXEL7vMaT$q;pHk1xoj=&p+=GY8{3M=fh{-0t_4AZL? z9TEtL8xaVI@c$NbqPE6%CKk44|B`djYEU{T%a|Vs%;S71iU#{wie={Wpc-&>qtKRB zbu<liG~we?@hu!@F?FV^q-O>7q0QB@8F-SJYXdn@HkJtMNYMs`ie5u(U9~IUEzW(m zk1=1n(p&e-tZ4Zke70Zx4qv<7CXlCjJfQ^=i`p1MUZr+=v7fHQ(BU4rugT;Pu68HA z-C<I@7K4-BvGL)#u3gd5c5%JkOOY=f_crO0c6nhD+7x0SveR}89&dJiHu{9+I=6#K zIR--!?CtPPo)FRfR>B8h@pnxjF!)XeN8E#6F-$S>OgZ|^#4+&<IffZV7^dyBcK2ap znX(Kx#;!01C`0C9%`o`-t|UX`8ND-hnPFp@vj9&t1BVzn22VT#=osCjSEM2I%-+Gf zm9YB8Ph11+7~Nx6Bm<lwc8uPcyWFtbfG50xM@-+|E8&n*4Bx>k<B(fee#0lqfoTli zsVkTeeWtgF-DTJw!zbE-OAO!XD~J$&rnj+herbwJSl8x}eh}h5iM$?WlvSF1E}Ur@ zmNSWxJE(J4p9(`WBbF^hnGxo26Hn`|ASB%@O{knJIh)iahHU8)td8b0cR6g?<D!8Z zE~JeTDJkh#RuL!VlGwem3ES;3{Q#7NI)XS!Gbb&sR#j=)Q>J^rM9|Xw*`I|LoFp83 zP_(6z6j<<a_aP=+>FW}^R<+K0t*QY?qa@By#m1g==A=jzc{;ssSe5!I`kLyd6^Tk% ziw!SB7_z}g9U<bR)v^i=k(Q^>YCponZ-#<(5Zol}!7igt6Wd8pXTy8qM1|OCQx@Re zf`q`j=*ScW1;LW5l-Zru3#_1gr21uv9GT`3rR3!fB{Y}GmX<Zk$|aTnP(Gn-*$t>Z z9_P&|`WX`~mvae}-A*-gvo=i<PKx#ZHEL_R*n5=qAV1eSs;OLe^-wuwDkThshODl% zEEhf?$7x+F-B~XbuZ=oIhU7MC_G+IpBTBE`pqAnE(}Vw^54=~%cSGKO7$2YA{WLM9 zDkZ<^uC|rXP$USh={~YClolWAsY`WjonBs98Et%F#~m9Nc6#IYb{89>uGbd=_`9a@ z?r5Q#$K@H}NZxE<o}Oawg^7%J9IfU6D7vJjNs(Ev9c-i`5AVvce3vX;tyVK|(~q6^ zOdW-T^*1vf?T;NwvHeq6=J4Qxju^N>0rRViT5LHo6-x0W^BysxLe2xA7Co7=H1Mqm zK}519xDgMnEiFyaEC+(QaCZlNrr0Z45X&n9d%A<M7>Q_^c|&wp>!7~h4XS19mgvlz zp{hF1-`8*Q7?{zG4<z=OU~DjtPhdqQQKG=aJZ({B2#C_QXjS@h-Y*{D<(T)^$`D~; zm39kwHx_2mZLCTfC~)&9X|qU1v}Br!<IN4`@@{^`=;cd~CmC;kacU`<T-a?|$s<t! z2i7JY?i^bdvT}x3GV`W==lR*1H_S7L8KAXX!}ylL!eF704(h>cS+RkK#}Mr6SakOg z>W;~Y8GevXI}CpueTR^65YVl`!GRP33)(8OHt@{#atkXzv%wRcnw9cCo9)RX?iTh1 za4EsM5{tFTaxKGEN;<!)=Q9mpkG8PfU}4()hGa`a(uGvuBX@%9<;cYwB312yk33gu z*0`4DdwtP4TqtapGT&JpUdhtduO(gMh@M#1U3XM53v9}gu0q;`rg8b9`lTu_wuI5M zF|s~MpL3A*V3|^py(c=_0}Io0fIOVOAD1P!VY2bAurkv<nWH0B(vf^JN3@aXqSzNt z$*29YXdffuq-%tLANE~6fY&{KraI92NX-j><bG>k0bYpr%SfCX-caMnZdNrvJeyTo z`%^IeglFD2KU-^_fP@#$Hu!?opHkBT#UFLv(#ektu<g}1m~!Y?a+Tg2=kG+vGr_kT z?Yrvz()H?3)dW;uT^9I(Iq7{d9~5JBHpC54-;>9O%oI<u3vvA*D^jNq>+0+lH8~Cv ztz8$be}eu9Rh!Q5KhGI)DUBATE2W=iT2R>K1k;n_4+icG@V(;+Blv0=7Fae7E0j)O zFj0B9n~q9@K4E-)#uW@vu0j{BB=|mF7R(CX#q*<51O>rR=X=o>wU_+luBTJ8>%n*X zR)q_+13f^A2(DH?w+g2fgDID^*{eHSC7o;u?BX4@c(UO6yYv$=-48umlx!05I+|_k z7Zk)ftomFPH&hq*-8@GQ8hkby43Aws^*tB0=bVx~S_03UIV!DE6{^w-v)&4Mt|dxU z-_SGqnwqr>H%}bALs+~UPn=2Awz}nMo+{v1)4DdLYm`g+l(wDs6<>(+BqyD_g+R!! zCD!bV(qV3pTYyny)B}viq_{+p=aTDlJoLksSLtAWdCEsJ{0{rrO_)}mfqU73@x@4Z z-IZZ&z4FnVJr9*yWop$~=f@k5g)Fv+E0U?%_{P+f-TSs>8ogPNrpzY`-d==nUSQ`R zg&MBF)S<tw&k8B>mG`^*t}(#kH>bnlDKD@Ko!Tto2AYBO`gXZsYSd*`tOzSX8`gwu z(If(cS)hx?guH<*TH;uNE$R__1eUZUDh1YPOtJ-*v`4}HH;f3e!ESV5R!QPy(dOvl zTw#t8B|?KiLFX(81^q#3i=>lmnCZ1s!Q9X@?ZXCmX9+{UFDC>COQwy#&~OmRyl{F` zv$szs*nD*;L}Ma|OAEF}9nA~okq5=v!)w*Ns#Eap4(=2npl^!%YS@vTX^F-|g`AZ; zc%B&KQ?O3XeS>_<+3WY^PgP++5f~isS@FXI1_Gk_zg2~pte}gtov@vajfJxkz`+IJ z^zXW#P29h`0lR9wYF}%^*sqYvVD_eh8E2uxBgH@$M9@w03I!>n0TSM5xqZ>$LVNuX zSNTz9O(b+#MTc*PS+(gO6Nk&M5Z`pIN#lEkJ{v1k$%>Ygf`pa*4OHqZRhAmY8VzUr zrbD)PIqY(oOXW7XEE&x=s~+uJ1_mzR12>*NV_r7_ZV*H===R{UckY$cI3X*(rOWXU zu<=4&?t)`CIDLq;I{4*E$gy*WHe-l%D76>~twJdyA4-)q#?X|wr=yg~OYtL}F_JPz zE4?K#m=jFat-P(y^T*Js+b})OhfQn65k4GoIS1{w;!A@A0(Zv=Z~O*}k44K59W6(X z&$J%QZTl+i)4GJgJ&&hZRhTB{cHCbz)a6!D9q%lm*7$;86ViYJ-<2`%;&tb~p3E|# zl$QTc;1^kCQ1%8jH4TN-?H0fdE(W2&HDGiy3%YWb(}uXEk;OcqoW~)$2`Q5#MDu{} z<(z=nfd+udW!8rA63Vr?N^-qK?qUClW!DqZ()K5o+n-p{{vDRW)^?wL9T!I@JI6o3 z3|7>&LKZ~fO|(w1%^LKzsIsWGStL_tRTF$6;A@j5G%%lB13wYQXfzHtb+dN^en;~Q zqz{nngYf&tFV&f7%NVfJzvVUEemFJ7`+B?lh!5m?T?84^OjNUz0(XkG)v_2OZ8)!{ z-O^z^pbK+}TBj=zoqy8&=ml|}^LR63_t3c?<F|6`l2IFz`ECXNi#dr0msCvbmk7K# zl{EeWtgU`%epJ8`U$_>mj;Oy~kz#%Xtnm9P0an@}Y`fNYZ7u^x4t!Fuot}n<Laq$W zYth8gNhynONz~(^2+{FGr3jl@%z=hjwy;6yJ|CWj#;$u9)d(;eCzktQeGn75IG)o+ zFZ2N0X5+OjgG&Be-rn%*j!lol%tHv5;ueLR^M)e6I8}b6^}DbKidEsO=Zcyn(e%-~ zoK1(UCU{?b6re0B!Yx;;8?a0<dE<rdSTNo+s(&*_Q_sGc8s)02tRj$;V-)C%Oy1h4 zAqWMCBMf3nD@}dKUTUH}z`0Lxh~9G%Ivrf^X(IV`&zV*x7k3=72-UDzTNjI}u5?Wl z&YW~>bcizr$gPro)m{K3Q47h$VJF5o8b)#MM(uLx&-rJTm4H|!o%aSjfj=@IlTo;q zPw7jke^6(CkK1GalPOdi<LnKeOv(9V3f<o_#m?Hr##Y$Q#rD(eo$T#wodEyt7AcI& ztt%k%vePH-lt_L9CPjgyKWqqFaSqm4_-0ZL|J6dEAo7T<ThxC=EQa`+)*A%72#o~o z_cvdZ6B&l4WU9qE-diqaK4yM=d|#lIVYM${G$?W6$z7rkTL(}n7%7-)9O}$<mIktU zmfyWLL0YZweb3rtnX-SCUd;M_cUiH%gb8curRIhWsfXS(X2m#W`CUpJcNyGW3p~9_ zoIuR53IjpRUpJtL2=mkRMUa0BbyO=xnICO*CBKyO?ag0USbr$~<SVnyqCD6HGwym1 zgi?YS+Q?XHIT@7(d%eHxgQ<*08v8XCDKa30t0<g34Yf`}d*8}0&&MUdaJc=kc$vfg z1H+{#G_?sCs^WLxT0}obk&6y5P6aa&po%S$j%wPfT;iE)Y4*Wuikl|K<vn?teBC0} z)+qwD!_B`YWtfM|Fn~@<5n9xf#P2M1giX2`x&*S6QmcSR-%Bcm>k-j$7rq=>6VM6f zCzB&Nib_;E`s?Qs@7%Ntm$;ICaRmW4^#Lx^cD$^$91=!)W|3hG3m+>@!a+#G8~8pJ zvPdomA^)q4&#S)WMR>$tGD(4g$8+w_4$nF`5D?4%MqdQrWb9~R|BnvvpB%_m@l(cD zMd5|<7jUQSQLI`Nst*cgD?sfdQe_*YOTY&_&k9+2Ptv7VXTl}Y$eoH`Gq0p`8P8#U z96=m~I(E9<8U-*+$}l$`Zg_34dg)Jjjjj8=`+^u?GKC=6vxiVtF?)~K_1VXwckds) z3I@o=z{V)SYQtKD;JfegiIWYmmGV0_4a6CaI?|$x@<l*knMTW0#7&_@ZA|%+X-n8> z4%eh_Gdr#JU!){Y1FC7^GKvXpRo=7+e(wl)n#s}IuooNFX;7vX+hw9ym4F+L3-Beg zl2ebzgw$u7-KeME73oW92`=7CyB*^yxl18Zt93Ru)Gj1fXgm5GW8#VyuXs5~Np6Re zOS4)!>~ZDTwD%~=u9tMJ%FWVB(~Dk0G;Q@<yx7*|6Xr6|+wT6RN@=&D!!ZxTK+SAT z;Mn@fa>9d9(STuoBuj%64?;@LuvVfFZ;e@Ebdtr493DL0x!d}<_AoeLYQs!MIjw7? zq`iC>UNRRBr@*?&67^cLo-@nU&es3^ghh_PU-t`)7w{_wBFCVxzc|NUu&BQ=2^iln ztN(}w+7oClw2oPtVH&_a0M#Em4K2-hQ(go436>q~7boqGnLp{qoP8#p+|A&9R>Rv+ zIa%(ieB_vO$!A4cu3E!I9;9{elB-#{!?o#PRa$RUomw#XLVUP<(Ii|XK4{3yQFP5! zPi-utx16rleiL@Oq*2b6j1KS1_+ECyqUmzshl_6e!2Nlh99vE%85hjtz_GQP+_Vq) zBC4Zx$E3K)FO=U){um|KguGaM1yvC0$Aq^7X;lc%9ebEVjS<J7LOIHwTmf;113C)R zplFaTKOB#S5bN_}i}Zx&YuRR;%IH~Vyvnwr9k}L-y5q=RvBMBWg*O)jKzx#hI9`$8 zc7H`yJY&F}6J9K%>lgMk%c%=g<Imeiv*(|}iJW2>;8hWqxJ%S4;FxtQjnvJ>GQ=)1 zmfSe-DvgNzL|{E)OR$__HNs=5_y`W)wvYo!3`Id`D$1STzWiQXuP*f>s(!2>{Q^)g zH<!G0P9D~ttF4<8<=S}B(sy$)C?eGzTJxLBkuEl-Prl2n(H+Uuz5dH2MrZ<g%<QKt zzW;Q^O#j;$6+U})p93If0H?o1?sePG<~?s_CicEiB3lxgl$`)>X~Gb57=%m&)ez~R z4OMceIW~Ptq%n*a@;}@$0)Zg)buYw~V%X|1SdmzN!t}<}ikYeJ`^!5>uW^&}QCnqU zgx3#k<*naTeH{UCV3|~{#fI7gAR%xgK8!0)5L1;?@m>r^4-c=e*$?9_>_^S|_|09y z;J+9rxFxeB@y7XLhYKV=G8j}y`J)HF;6sIY9!ANx;a+pp@ur73Tm=c@lg+xL$YUm# z8shvggXR9^a&a%yIIZA_l*={#EAx<QVGttyCf|f2V-gvh81d$+Hi)#5Q+kl6K8v3V zcHw%am-vjL*06Ul!e3j1K|y&Y2(ZJJg6SGMHtLHlW;D1RzQA`YANr8P{acA0j$8#w zWC{6lgos#DoB3#yB_8U$7gci@Bte6Tmo==<r)OL_fmrm%Oj><h<@0;K>g{!~JUeF} zS+-)SFiL#{HiJN-l1i_vr$vr*kE_MFN~LkUeRzS(k4g|aEto_YhDw*1{`%(1E0~4C z(daB4az}sbAxqsnch%D0KkscSm>R}YTw><flbp2cA)Dq(J9pvLZbDcaD)LQzf*-y* ziR5yV^}KPG*1V@`r7K<kMb-6MUIF!f5@hd_Ae8@`Ab;h>_$Mzu6<sPeb1<2WmKKFi zP|FnPm=T<jzlFLBr3=22riijvm=ccm3i4p<6&#H~fSOU?KWM=n4I>dfD8cvWa`Cj$ z&hO{*@nwgxgUx!QQE|j)pBDR4Fxz0Lx5A$_QM+}f<tol_>sJ5H^)2Vo@o{t;#uH+_ zHl`&|7#xj3#>*nXD*eb9Ggc-29g%6FnJ02F2Zt);*G0QG{iX()5Btn2!7;yK-2e+7 zTq0xPgL5409diinA=#s8iPMC_^;{TN<<#jRS<?bU_Lu^5QuY)j$R)MUlX`#Fd^(9y zhQ<~?E{?3Vy|vM}J1sm!B#s-yz%0Xz|4!NnurRkw=tZVrRme^CkB!?S8fUk+YuRUi zPj)3vO3mEfwP~g7xufnMPOIbqRC0!w_NW4%^myoMrjVr|w>G>}e66lDEzzb3<*L~! zYtIj+6nhvP76MVyjgr{mwi|5q7O7@3Q>a4<t^Cf_^{O-|`aY3I;9}(K(H-<O<I(DX z4HCz2YguP{#qOH<MwELtRm@c|LOO-#5KBX=fZhu4{-=#0quDx{B^H)Jbq#z*(Ytcw zo6206lR3Zg=75*K&>;JF4lVB|1$I6I_uq^A|IBOs8LfkrY~<$^FnH0SjrU`0Ac^Ra z(+G4!m!1PC!iKpLNNtH1>OlG9#$9zIw7)kcKWV?g`OXYR4<ft+`6XSqGfW^NW!!o2 z9v(YQpI`Fx`+XVRSA~V58DR+d{-cVbuu@A+R4hqGPPCG$qqN|aiYeJ6Z_XPOf!KYJ z!8myf$2t|hN~&F_ZVQ$AAaFCFOPO*V4BV7?kaikQXg9>G;8_xW?vOS_Wc^X7_8048 z5k5zbbe+J<$lOP2Y!5HeNWV37tKnMyWm_~HxE`{N!x2mNO#GK<dL~#qt{P-pMw#OW zfE45RkvvU3T_)J$OZ`d~BL2|svS8RiPuJY;g}B|Rk5h$6S9zuJ?zZKioG!~oP{L}M z@!24v5f(fro<6J*<tith0VmbW{gqze5l|(Z%u#!pJ+cuP8V8wOv=KBt$0CPJ!{T4f z69{t3Era66nd0{Y8ST16vbvfu7KOT)O_By&`oExmKDSFTL5c(lWY|)}?G@;4f9*CO zQ+PQw10)1Irec!akBh6;)%$Ar%Faes;HgVJ$R7OWoPALijeM{bS~{kCte5yu4R}Y0 zMv)={>%jT}ZXc+pbizWGEyr6f;+w`WpGL?ny~?!6dNVIJ$MuET^gBiwR;4biTC_8| z);;$^A%zp~4-Q4}1p;EXfc#rNsO{6kvhmSrY%%l!T#+RFV}c6rsz62I({EP#UV|Pq zcVQMc5ot`m-~9R@`}S2Mh!1B(O=|qbdhYYw>YU-6@2sibf&WY$S`=vtr$61%{{KoH zL=2q`jXviGWh|WjEExpHZ_0gUnIj+bwKn4wO$uK@zap;6$+GEL$w+A<C9suS`-9SF z<a4t`uIp~5S4{6QyXSw_4T2GNgfXWV7O^wh#@?sXIeQXs8UN*#D6s%Z4n0vwOVO={ zoe-o6vcw3{*6H7EV7Srn7^_-6&vymwR&3!jUS(^U&+t40cNGs097eDi7-DzTsAH1Q z;`zSrs+g9`jVh#3rQ@_<R%}XN%eCc)4cC+=5@7KgQ*?io>WW3q?L8DkIYNi^nv%Ww zCHp&wa5=(fEY3~uJhPCL|41Z?MR=(^moaHr3BPnPHT$LW1t#cj9?e>%-fExmAxgb* z*I;oNmu9UDqdaiEEfN*n3`Kq;k{}8BT8r$W*pJT<!P6#xs9m7}o5F`=Tduf3uH`WA zH_6g91-zFMC1c4K#~8Dh*5J!WQ6e&>@t}M*GXzr_uccf5sw6pDi_kMz?K^XTmJgbh z#y2=mG%kRBrf&w|m%1sNd_7f)MCx&q<m0cglqVy1xM6Jd(X1PCv7TOU@S0-#<Q>>m zU^^Y+S9ZDYlKb2!026hN9-#~Dn{rxvB<e>>*|yL{7Q?_Q$+D~3I=%u4_v@s$w?h=& zS9-0dz`tgd)edq9FrV&82Mh>^{_i5ypVav8w9-XoT?ttbkyls<ZO^`^JWNMqmBxG! zrl3z+LO>l^Ab{XWfObp*ETO9TyT(bQ{%#?C_fwuKQbp5`n^pR2>V=Cs^O?Ac^YmlR z%~G=$neLCbH`HE^C6=gQLVLa_Je?UtIO4F#=%ZndOld==RF6yO>6)7h&`hh&EEA_} z2X=R~{Z$nVb_eN!a|SN^P~v^85>^t>7o_8#FV>#CnEDa&Bh1XFl+2Ay-5iOUX}RMQ zkYP~*%KdchIjT1))%`Kh3el8~zi6h{>U5Ip+@$cn$odb1<WkS%tTp6l&*IYShtXA5 znQ=4v&!}`KJ=#Kn-i<a0Fc=;t33R=iWTcK%>ChdUAs)>=GNV+@nX>G2KF^ub2rZhQ z1RrW>)+U(93fNN7Kc}`T$1WJbcT^-HW6UUPe#h|1pf4+EuFg7Avn9sPmR0rzpc-e{ zm4Opf>nyLSly{z{=TJ$(5{!k=mEG$zJs?PBiS-Op-bqgE(Y;PdYy?s|;3JSINk~uB zr;h{-3e!ks4TOn+OJm_l(in^8eH<y3z__|<?=h;8!bU-hSmvDW7`5Gq9`F^4Rji5Y z*jrCet%33LZ>Ht!mcTA|)}K%r!CIAU(Q3q~s^mBhlXGlTIhU^ai6}#%k*&ZoQl!ig z&b$qy=~@L7AN|rVms*#!np}7g4r*9aEDp4!N+_$v6E#8<*-)wCf*LEWl;Uw1sn@%i zRMZiNV^0>!(y7IK?lGzuRYh%oqA${8p9~8Z^o--Z3jyZv-@k*(DpJMuJSOf^`9*?< zCEO&gMZ_&qIeym<7EL^i9=5o&fOqnMm?vuQf^h#G64PJTJmeZm3lokSzmH$eepr4+ zJjsQn1+&o0yb7A<8~lD10xlteuvhdfQ$KYQvq++G7LQ5@Nlvd9f0)WCgsc+e2WJ$f z7^ZAg`pJRiRzW7tqy;=)Ax&+t`{QZo*9}qWD}u<F(OfFggESjZJC8tcXq#%3tG>{L zHJ>s$XBqd1mUUo2lb^7-XO-axIG6fUn(iy;6WpIJ_d0Y;=JL~?C_dfp-_~eFES!x0 z75)E64s7HY<pu;0vzl?Sg@6eqP@EMAxKYr2MEq??pdrEnu_H#a5KQd7iQGIiDkLb~ zfntTMfk}s^%w5gQ9#6e~L+v2_X2Wr2ue;ps6^^yXDZXauo-Fu2OA$^s?{IUKW`Yb1 z2(m50vWXb}DcTjsW|jo%roo!rPPF11hnyvmoG^2fTNBtBsEcEpC(MCviPo*soP~Pn zh}WGwP1Gs5F9oy6qLfzurXgViY4(9}dH91O|3t-7x6`qE-%Kz@dF72qfI|?5u5si? zKRo*ND%(DuTTBbq6?m5;m=^Fl>HF#Qj9K8&89bd@o$uk(Uy9qIyK>i2pAU`sf5j?M zTa*9Hv;O($;>M%~6h4RD*Jl@+)J|1Sd0HG4I~+&@TE2FKm6bzxP%QtVS|scHiT2O( z_6`u8HxRxQk2*0C#waHL#q+eshr17m!hjYy78x^!fTE}}6_tfaNpia4u{D;H#RRj= za<!P(vSp@Mbj#+NZF)-kvL${7gm}rOkpY`<%Y|3|&m5j#UEN{xVR3?|Pc`GbrK<#G zV{vO|p1SQraTM&-BR@~Ni7^rm8gY|LhN@xR#hC`jla;}LD~-Nf!l+oEj2a7$5T&T7 z%+yCg;c~(rYxGsbC`K_RSy<l}tRvI)pb6gp;Jj3Eqn&rM9xJvFCPx^O)emAZzs7gw zzbf9o_DX>i_N7eH(jFUk7+F31;uee|XtVDHlaNlF?suZq6l!mNu1qsS$;u@GD{8_3 zsdYv@J}3W!Qci(3*06y%3AG%LIG6Qi7bZ>7Q|#>LmlI_T!hSI#8bDPK!TWqEh{$gw z7tCkE0e7)ID9Jz>DhGW3{j{)N%o}JNHoW+b0ifMu<cP#=3ckPKx)<Ux_VW{0tj}OW z@ppkn)Y0)DCGP)@FrPJUd1OUI-qy{QCOs+?XbOGcf_0dVf?@P%ge6i7qvBOr^8kd& zVlSJB^O|<u=$@hNoj|e{622#pH^t$0=|~KT4HL6pS)7fH%(thHvAIAGS8YHs_rNu~ zDU8_Qwi)Ks^1oWbTV$O_(!PVQajG~X!X8-u23YlMIr3iiT6xrLbGV;>hn+A>s}b8J zNHO%L@WNNg&{8C-ZHjSbg+>XtgyrdTVZ|7QS1eX1zbSO~WIE&Ut@>_wNGbfF$$mCG zjfr-)cHn&w*T?m0FzkEV-<$P<VznBBIp=y1mf@^&_I@r+;?m7WIGs7Yo;;p=NMRgm zjQ+@RF~DdazW+sy!&Gsvshc&1bHa&dkT?drZLDrJ=4EQ#R{s8gyEr>>r|tY~Ingu+ ztFyGZtWp#XcSw=@B>N))@M@Y@02>gp&`@hs{FsB$odW9`Uuw0YUKMI0iglms=o`-< z&bgineMBL?k_Y3&rJhleF7~yFT8MIDMw*$NQC5aexSa`YlnzOYd@IXCZlbN!z{n#= zMfofy&ek{3Bg)-^hAy5%l#kj~&QSKIsoTLfvLWiN0Fl@vq=+~d+ek`7_-8f!egL2< z3Px=#GeGki_j$SqJAbB#gFC*)=$wD9yfz%g??1<E{&gH;hcdLp>60bfpOWNnlV?$P zfU%1+;7{XMu~A+ZL-d_OOL0Kxmll?W@+V<w22&v|P6{Ehu@<3PwgocI63{LfRbL)V zDRaJv!=K@w<)5KH4xIuuE5T>_y@9_tmQzJSW<2fgX6JU<e(3smxBc<a30fB*j_Lhv zI)pJ8mDHBv+9PDJ0@^#jij}lm#fUe$mZ>cq4!3pTr3J}tA*D9?KDyz;G)`P_#1uTS z4rMeY#*3>PkVcin9^3Lmd<mpdVY4yDwK}^(b=BAaH6%XZGI;L#XZQR`7)d-bY$3Va zPSdB+_FcLsFxi9{F59)@*4o-7Y`V%x_gjtXQ>d9pY+8ECdW0HMSfM+;!fN%^!Zh<t zR35Y`*V^?AN68UIRq2+aP|DGi5Px?*d;66}J7SfFipkP791?N7rve@$O_Q*?@dd;V zQqx^JILmcf(|0^PYfuU%SlujbIwh>**{P9qZ3_8o+Q|J#O}lCdbI|<OD6YMZ|D*#{ zBTi~^+5nIE*X{CNU~wow%%wxFF*dhz`N`JOO-GDw40Kr(%-8c0JGHJlC&xVqr3KpQ z`%`C-(*;!WhGQ=rRT{@L<MhH12pr9y9C&*IBZMOePw|GfK;sRN!li^awA()Y*T^v( ze8FS(HapQ(%Db*bE2urLA`)QVxd^PduZk~Usxi_llB&zlq90n#0kY3Fsu%ITAD;BT zce3xARS)RJHjf`iKm;!8-L%K!N>UDTrM}JunL;$ZGsu@JOmQk5;+(APx^scDW>9vV zcSn4^8^UuGXVd<*NnoFol99h*kcP8U(oX2UCd__G?EG<EZ@-9#2W=re8-ouv*^%97 zAyRVG`~{1zKQs-T7><NN*bl3Gv>V3?i)PN^M|(geN$uxRE6Ft&lW4|k;0cKwLc@tH zLW_x9LFTAK30FoHWicU4KjGgf{X$U;f}>D#l*ZR!N?jaRj5Q<IE?k1-T_zJE5~&?C zR>RgLrA>5mtj1i6L-v#I5@zPHVFEX+*h%t6Nw`9iiQT+F04~<}<Grrbo)LptDZ=;g z{LB|l4Ke3bg8=c=JaxnYdL$lVUNa2csIt>XXQ5+7Rj6}V^d__GbGWscbq;AQ8=O*L z-6s$WDg4UviY__b{+rB&!CsZ~T8`u`wJguTqq5pv7wA}J5VH3n6AufSOPAf>Ww>2) zij(xii=JSAik`TV+U0+oP&4_A-G6gJO-xqO)&$`Ghuylw>C%G;qJ(T)v{qNss^0(B z%w2b>caYU7lOmy_Ak|?h<jw$m$6hD&jojV|7!=>@N4P2+#MC70BlDW_`o+V1JLTc! z=K)q1_RQi8TQciUSR9g!HA@*)!BFz!8ih<L&15u{%If}J%E#EM+FN6r_VO&X(hIig zM;s-XuePK9Qkxs)o^#W9p0w{?IPDe^Z2Kg$?~qOGtL%3w;bl8IMv_$B?PO|LpI?`* z^}~6|z@cp96Z@*FC4<ed9>Pq6lY3tSXHgt4Ut>Bo-+ZF{X`sPN7^+oj{V`!Nj)YqM zH777f3uE(VAhjOKPs7pp(er(NWwD&y{|LDZJJoe?pj>l4Siqlf#Td=|>W(^VdrPJ{ zGf}~0X+N_1i?BU`=<U!W{sTV^k5`_9Wq}yQ{DDiBDa5d77HW^b6887c+$J$A%{zq& zMOKkh#vho}r+k5$F!Euz8^S)&r_psfL8R5eW`jL1EFoq5Lb_t@>kT=1yhMhI5|*u> zlfnLwIE7Wcc&A^+u$>WexCpY_UPZ3|61-dUJ4}9lf{OduefnEqW$er>K08kTHEfWr zy!x3PqVU4`(>V9X5D{b=G39+l7ZF71N0VLYR|-Z@NsMwJ7#mCvzoGRFM9?BtI0(ew z5!c+xl!>dRQk7fGa(cZxUf(pc^!<2#hUw*C13BtV1X{aJG7Q+ov`W<BeMIiuv5cs+ z2ubD1+C4!XunN%(;S9kT;L%3w)VMQ}%p*?8+SZo2AXQ7<qxQmvIn{<Km;Dlt1UWnr za9$SBSnWvKl_QsgYEGwBVq7x0(PFzAqKO!1p{nvKHf0aHS(5DFub_uJc`$KjC`50P zjnE{88p%mqjiXgxaMK~6y(i$KG@C_bQb;+%1ieaWnXDMIrrx4=&5~lh88Hp>6!D{l zKT}PNAWtd=llj(TfN-Emks%Ayf6<-_uV?N0BT2<XyBC?6**PfW>N_W%=RNU=lEqph zAI@s=zL|^Jxg!#bXg%w^%9#*JkupVf5jp)qzl|xq`25!x9d!7|?4G#T+$37|0y4fC zO)0?(FSMjVh7{60cj9X_sBjWB4eWT0V6xe0x^UJg$qk`c5&8kH0wkX{+SzG_UWQSI z!C!DiBo~A<3~6k)vyWnO)0M)T5qKsK^Rq)H{S#QhaKDWuTPYjzt#}r%5;|-uX>^B? z=??K!(kC(+j(lTmWz|f6a69Ya<r?r#b@0@}IEU1djkFkWX8Y+1AC7Fu<)Bk&K02Ky z6|WRWw$95#JW=M!IScN9N1xay>Ot4)C_4i#T+$n;oqEPW=ny)1RP>fbx<VX6ujryv zBp;FGt!P)3A*&BTUAVO_p-$YIx|v+P<aP)x%M^@*I{_zm^}o5Fc58@jm)TCV#5c;K za|-gg<n^bs<!7r1^yZq7S?~tN&$vUj4}hHJ8H>gRQ-$f+zn^NcOfzcn>Tkjk&1}HE zgn0z2okM8#^ol>U;8t|0o>B~3YW!9`{hhHSu=oNri>3BF+00jE0jE~I&sv>dajz(A z<+S+HW~xD(Y_<EB&X7)w)j{s32Xy{4mcLcG|2CBWR=F<m|E&9md`M<d!^=7m1}T^; zQN%RXX#{GpkbG6z5Nl470DP6*FF#<bkLS(flg`bLBod^q-}&NBvA`T39|uf4**@{? zZ2HdJ<NNUhwZp21s@S_vbYos|6ds`k#w4G-s(9RplXF-%u5h`2c_{3~$A{&^k%f<t zH8z{iY+wK{T#gT3|I<I~=D;kzWQ#cDCcOuRtp{;dMWh}d95(ry^P|6-6oF?vJ|5rQ z4x_>DcW>(D5x8;VMmCfA?-^8B%>8|TDW^RpF>gZ5IkCr}{1Yh7jkXF?XZG*M6ou7= zfxM`yE}a6xBf{3l?%_VTtP7Z2k@kS{)>;+e(+yr-4Ph@FPhWeQJ^3P)H|z|Nd|33| zIW&g}-T;;XMTDjHQ#toRb)kqOekRFKIj;A9=x~|cxhVOWk{*f~17-7qFbD$Q>}2yq zpa@njYU51n;0Chn($Un3n<My%vrQt_SLkLGHQ73;0KnuH?wsEVOK8zn0Tpo%Aft7r zo7gyE%yJp(2{IaVgRr*O<`%m_eH1w-Q!%Suv#<@~&oDOt|E|*h3Gngfd0nc%OJ(E$ z?#@bfZhvX-DBCC_DWdq&(G#`BX{FZ|n?h9v+odOK{*V?Tf+UIYF;Ht;BdeRgF#4V1 zE9_%VW?zEvIf9|$dJ)jZImH2cn044b&3U-xb@BfEddmLI!^G!kr~!ffN+k`|FbC?Q zJxtGitSaKDIBZGePD-RUSQFh;*#0X*0p1`6IB~f-V-A(=$ivN$bw?bvsWJDZQ9BRF zIO7ws)+9r6Mth~o$%Z8N4Caf{sTZvcpKjF1O}s1;x%u^3RG%Bpq3Q7e+lLV}Ck8Mr zS>Y|RY9)360G5}Qt>z?z)Y)07H3@D1tjN?ulyMQcvZr#O1|LJK*jB45vrl`jLbX^; zPK1)Kl8ZjQLe2PS4juu{b`C9ZL3NoA+hg)aX|ZZ^Nrn|{jsa1sOo%I{&e!S*%#FTB zY+%nLj1Hv&YcqzXX#!jaX2;pkQIW_fJr<G#+bL<2j?Hw86I=o^uUS1INCzmpI!Z$S zqM+6lq>ZW|lwTw=h64R;Xe2xWJwYrfBs_ynL3s?AXA<r~Be2TO7gzaOyQ&9ir@OHS zfl3@XNRRXxfag*!c5{S8^--n{Q%ln7guRe_oY{KazAO$G0m@Y7h#HmlvHNF0ANk<% zZ&%-9((N7+eLW=axxM4wkL2t1@MLM=_#+#AcKZ3Y2S!2q=F}2uLkypz(pG2XPLvHI zZ)^};ZwO(GrfP&)yOj`e$k??jjNR{S-mzD0aPo*bO}npmr4Aa5a053i(BlxamxMNu zOskkejrK?&QR7`NlxaM3L4^ddY`Zk0$g*wFH{Z0|@XdV)S?*j-`Bk0cE)&e;cKP&6 zIa`;}%bAGzX~$)qS$Dp6fB#Z@)eY{srk9`#_oTbM2G*Zug^oc?4}CYrzxxqkn*afg z;x$!#tI;NQ!kbEGR8H)oLwWwZmBQDqM%7&O^cMpF<*12I{Pc1<pGNSv8JdD4z~0dD z&kW5aZe8lLvK8`SGrzQ?V#S*~oiQA_(@bPut&V22|K+ZrYEsK`UL;ZVAJrKcFod0d zG!eoZkpvacnQo`2QdiUeS)ZwkIKXMZ7|Vw#l!~Tg%^_vZpD2PZWlEbe2r(?v*{r!# zId!czvRk6M*8*JT?VT|*gc9n*zezai<2hbRk(9e<5@PCl!VYaZ`A*V)s=V=d!*RPB z#-e3yUujzgSgfA;Vqx%VoVEZ$K$dkm1F@~iD0V^wR<ZF*4`oqd1p-F#HkdOCL!~kN zt<?RgMsHmV-rb4DU_#6nSf&Z~fEbsh8<EgfQS<EYrEpfImZ5tAp#@}gwIU+ZlfMO5 z4G99pc2q@CuE|`=F=H&14r{D#<J^K!cKHhxFS+jDLB@v*p;Fa6qBPe$QXW!!F&vM; zuk{sk_%gmViMfH@#nURWNIgQ`cr?!VeqmP6iRbYA#sz&ETW=IqJeiD6(sSDs#=$SA zDb~HrlAF&<2uP5$a%1EO+QrBssqN*v{d%nJ{56M@D7)iB=o;!z*T($Ck*xF+S-VeU z|F&%TIn!Wc=;$F0@c2XRxy0MZuPJ=?iO``nXpj*@3v7{drF>@3?o&vyjf`~A!R3g( z1nKUiDvF03S#K-Pn9qh%D9F6(5$X_{-D}EMk<1cvZuuYI)^6?n{wepQtxfZd`64N4 zC{z_K70DZmCK{k~0arYM=&;EhjhmYe9g|Bnw=FIUn^rh3+R?GOSm!?AOQxfX0|qo6 z1PE<@bO|a3gL%?hw?hzoD6m71<Zl7%d<fvK+G2VP?n80D=U_SB0}N(-GRyE7O`b<{ zBb2wd+^D95=$O~tCK4IV@PUkojvsc>37TF{*dQKN7-dGP<(eQ?6xi+om>{Ps3<~`? z17iF*Ya==IA#W-o58>;l>)dk8Hz7P78_21&4z6^=Dy=X0b(q0SXQAE1!^V7hd@POC z9jtAqY#t)jl3#h5jClt6)9|J#bk?jPsGZ@ss+s+v8`8k9-4tW=umYOI%sfy=(I~a@ zZb6^3lJPgcX=)>r!21dCLT5(*1Muo<Y?8~{rbvz+2~9EI;Rdpqn)rs%qGmhBCzJyW z9kSZq0GHr9b(v4VNwQyjL-)}B1YFsRPB!AR*dq47l)a)0!0}J4Z9YpapQB{Hwp(n2 zFu-6eEs#wMWH6-FY9i*9vREt@bHM&$0aB@xHdq;F{TIXj_&d2*2v5aRE0~gIZ!_18 z{6DU<Cbfh!P5wW+zA-q`XlpmNZA@%i6Wg|JV`AI3ZQHi34kp$lnK-#QxVOIV)ID9* zRbB6&?pk~I+H0=|%W1af<dKVk!|&_<#2Sd>jy8alA9paUedNfQd<y!9e!WqMygsw0 zX(Pti71;HDZD`%|CtK1lna0bs!zCa7V^obX4xC<D0}yZwOs;KEcrtj?fC!zJ&rdH; zKWB=*mae`O3cU>sB=i74wrxkQp=Vr-ns^BGQA7WD0szbQn2N&Ooi>gZ7R2zWos3bB zo7I<@nQq9+ggSSr8OIt#*!HlvxH|MHS|$plVN15^YzIAEs>fPSMgSxH=&}<fy!3CQ zH$KbxW6YP+s|2M*r9uUoq&#KP=gW>p_0n?02^M()T-hR<)UJYFNP%4OVo<--V%pc3 zv|KRf0d*BUV-|IW8_#|7hLY`JhZA$yBPdIg9=W+`^V%X?gePzEGZqU<Q+iT+G!05z z{XnEOO4fQ}xq-G3q>8$W`LB=H$k57R_jUC2r#sfG>DXhp*jSq}<;QN*P1nFw0j8CN zwPv~qoWG>KV~N9v?ZkH^f5|ZFDeu5SLqVZY!Q9M%mK&XPiwYX)w!G;JZj%F8No{w_ zK%7CXw=OA9T%_^clco8(dHc<V8u+%FwFMo{)hY*-anJHLXG~KuJwS#&{-or3UeVnj zYtu3`>inGw$|1Tt-D*M&Upj3p%XNaZSMy?!)*SzhM~UN5!135idQy!wrBE*#i9^#K z>ZVUYwP(VhJ7(R={De2gNynxe*LpSx#B^MIdn9~yD*SS~uaI#`qI-<ayMjQV&Z<hu zI6NUpw!$br$0d2g92j@{3mGKs6l0L}!vgVxrKWJs5;tOO!i+#Y!dIvbJa_^#eL*}< zU+@&b68sRt68yNqBI5Fa7~C1IrXMJ9=|Sg!SLRQAz~lo!H{#=q7vi3;Q!t2mF7!<R zJ^gOKRK7OLm;KNkuJU4D9Z^u-E5S>kNalDykVWGQZ<JI#7`}lEPmGSC==8XGoD*dH z8b$UKby4NPO#RHL4~Hw(2jffaJrB|E*&Sg_lk*O)qWI+JAaV*_7>~+-z0iQcD~o74 z#A35}z#N|Nu9iBvy$P^{;Mh$Mg~$~1g_Svb1TU=u3;Qxjli(w`J{Z(br(_uYC7fRU zhgE|6n9z%^c-Iff<?26Zq8>Yf1q$E!8|FKI|5uvmcUk&>d+elQvcmtQ467O1xc*<N zu%fK|w_#BBm^v_KjXos|%s6mWgV(Bue=rzG`p>}-<pA`^t<`x9zqGK?;UIy2LeuTl zEKGWqd-j{2oQ;pqmv<0{uqZgRqb7+%N|iBUG$BrCfQq1`V8%CB|CX-nMjN&FheB37 z^G+{AFl{K<iZicpvkbkNuH9Tu2=6sgqP6gIHWDt!k$)TG&L&;KW)64irwxo9HiLHw zgLzWL?m2vR8?d`R{?_qR<J&;9>`g-c3P)R8SdQbNlZXUs4z~IF2*D6PH5|4HcI)@? zxo)-|P?;~)zR}#cdd^lfUepKH;m2mZ#jej50_faMc}W}HoDVUadn}tsl;;!bCcvS# z?}S2snYDbulvFrXqlSSOr{xo;wFRxj`5kFB?f{vHSkft`V+S<3sS32nkF*pCe4s`3 zQ)r3;gtSG7`sX=*xY-<;85s@b0o()Z|4z7Lu0@h`-xr4i$p32BA}0GkR_NdKZPmSh z<l9er%|_B41ud9B|B%Q`+LZ8`pSTuuz%B_uC}bei^b>Rti94NLmeL=JuHLuyr^fo; z3)neShNIlEhedwLUbAMPf=k3KTu-@8=5y||e0v>lYkPg42nKL_mF?Ie{aK1|2dR-6 zlxW2y?ctgj&Wb4aw7W)OZJy@!8VYxEXi?)L$U`W7&C^C9c|G41(;xb&t|yNt{wOvz z=k7Ou_X|ZE1Lcu0#fL+Z*sq32I`llK;omHlT`E-C)@Btyz*&bHi<9UxYH4%>W?jtO ztofT-I<vR5a;9o&8B9;WL{jx+wo)%LQcwD@3UQo461sKiv(yIC$tZ$c#(LXSsO+V~ z9>4=wJPB!R)oJB_)>wi$`#P?5Ta(l1H6-gKdCs{hfdDEBRUho2nnz<ohBN&WTVWGd zX0X*r%nB5ybn_|fOfankrAk|proH4AHYLd@6;*ei@L1$M3OtO0sJ9dJUO8o%ao7&e z9cxXBZMJ;oLW7IMAtqmhco%4`M^e-T4H$bR%)fsa?L=b-Mb43(Ax~cRoPyCJZ5d~R zv@9O;qU#KPhlUH^P?9Np5u>IJtjjxQ^pz)k+FfNR@-Q135!?1Cf&kXiEmb6rTf;Yl zm=(R!UA5D_JjUr63|1wXHQCS+PkRX8yL4b67$R+i2JRS;84BhCkG{R)fcV6Ac^D8{ z<sm$D@+>rxhSNJJ91t}}?_6qf^2F*LW6vrR#LefSRX8JWJJP_HHI5csLO$Fy9S<m# zwE&ZEz;(?s;aRX8ahYy>C}v@w6@;@}f_{5eZDpwETeZlmHe~L>nE}zgBd^{rcW)Y? zo)^2!+<5Z1O!hEx7W?T35rKn1D%xEaBb@AiGOoz1EZ<LWe}iK9u7uw9{Bt$kr*IV& zf}VNRBK={GQX4lZ^x$2x*yzVVxa5!C{URz3Jf@VT6-LT7ys>R_-=%67b|zG`00(ff zgD*A(nA!(%5-iD1-00u{;?84;GXyJ92EAd%ohF8a)xfkf`QXPV5p_R&XcrtjEs`Ui zNYaTli7rX?DxnMX52|4=@oOZyFsOvWYQn-tAVWSEAk~|yLb@_UHROr2SJd+APmoW? z`UawPAR#c&>?LsoWLqdDcOQIp5cQxxP)pqS!Pj*MGIE4}fW5S<=AFP$eIwU9ch>}l zQ~wHQ*AxZ;hE%hQs)Ym~3@sso>M=r8Eq7KQsb>lElh$A%PhnixSXahg1V+(tOC??Q z4AP)Wv|m2kS}zQH(h3FKqjv@7YaT+a*Y}|Bh6Mc1CxN|^x&LyK$5v7>Kd%S~&XF`L zuIt4vX}aeOw~(x*me%SDfY+|c$5gHsl`^_UT0fukr_^TmvkB%L$gczO`SPoX?h&5O z>0EPaUtIl+#eEjS2cSrPCXR(W3nP8~2l?xl)~<K+_mQCSUFH4P-mS8tjHrjP=|4pS z|H?Q$iqi52|DYe%*C;@G6U83DJ==)ZROd_&st<x;j4ljgVWQV+)X=3G>74I57#>VM z+7MwUz5w4Bk^8m@Wg~CPVeVac$2rUYvzGr!@Inc}NKb+;3WfUPh0<7QAQ@_DP=@BY zc)zKi1*UOuPJ}61({Pdbx5+e%gg))qpFU<<s}bk>O;($w3Y=fP=3Fa}yOF;ANE<FR z*~A;>KLr#T{6#~TwJnMaH_)#uumVbj#!!S0Y!QVoEyfx>C%X4{8!Tii#|<-p;m-Q< z*BI|@t&Q(Fi;Tdl;O^GApLo-1u{BVCiD5UIJ}q*Ry({gHdL9?sTqgf@i`wEa)w`!# zE1&?6K38wOv)66xP=1`l8qCy#qMcyWu+LuR=^kql61+(X$~?82d3bhz!XL26F<G_R zu3)Twus)@7O)fr;ym1S`U3$$H$AEraJAh3HBn91In!F|=mg#LswhkmSid(lQaakAQ z#FQJ(3~y#~;QY}-#8I$KLQou(%r6LkU;#8T?1HHV$|*#q#rP1M3`9tD(#cY2*b#y# z03sA9*C>3FdKx_b_LU_Edxy#H0r9_28ZCIBRUT*{ApUQ6LE`_`rc!osGBvdQ*OL3F z+j=XTqkrw~W^HddEbXR3;3UpB%1WXNO-^;z(olvpf=d~);zB4$ByC|@BrO)t&)OC; zi{>o7GD9}Xo=a0Of|pPsK%BcQRct++%*p%SWeM~>ujCO{e+x#E$Yr^okGUA;JZE3> zPPk4;eV+X6x54Y7{T%m+Wx|pCt(pO>4CWpg$xO%o`0@?6mcMg<A7ex2j+kq>r>4#Q z`NO5hKi73)!aMc=i?9rcs^(`nl&*eh1f};5VVj$Jt_;M)b2zky>Amh}?HzcvXMUpl z-8<9Dz#aaE;LO0}9?%hm;EkDP(p|le4qnGyPq3HdxDh~P=5g_c@D3#4vM-)~%u?5I zJ?4E2!=SF&J!w!o*-n1w3cRSmorJEi=lsK$n}8sq3}VP<;|{RAPtwehN>Ii}{G&fX zqD;x_2T!&fbU90mvKRYynq2mBlSvg^Gy$$$jBI?*)HZ=!7)dpeyO(#eOyvYAUjm!W zDuzubIRwOmBVWhfIu#bphqC5}#@DdFe<g`7Y0{HT7cuVTs;FDj0C$p?k+&6Xm$QeB z1mRp!Ivnn#%eqREaak^PLzP@<mn^)gmxh0jGbda24!uE2-@DuoI{C$xOBo8+&cy49 zVE$2##DqIkCB*X$T@bZ5?bL{Ah#fHh2<(M+*@ZnJ!xVnLlx;3F3X#M;sHQ-+1Qj(x zlXP~!;rU9@&7hKlRi%a;zAH^HGZsrtlQ{8Ck2Sev2RatxQ2ug?2f$KiL>Q2m$-BzW zm=bz_qhb}jmXg;X(@eLaiCpH7Rc81BXDyujNpPFLPo#@QfB*op538>dA!44yUy4DO zptIr^(iAE8r7*%u53yDd+_arRQFC0ZjBz;Z{WCS2hy)ig^@X75Ncu~ah1f7v7ysE+ z`ZK83&9Xw&Eft+Hcyxgwcx(Z6M^tC(zXo-YJC_AnX}aA<j12uv%`}nR5+ii)fgimE zMm+rF{cnbJ#Ru%y^^aN9{IU2TnNpF=ETt5KKFdsAZgu=C;wYvaMO|_7+a(AT?Atv} zG}~GHNb-MDCfdsm(w<Wy#qZK1^$+RLk$?LJ2~)=cIGx8bF3fB7N9|R+;VYY5(Fu&6 zdV9xy!F&kI-it`(ks@jGZODvlWD{7(jW*rIxSZ8o`P5`#t@41VVL(iM4jQ8O4c%}p zcQJqFAH+Q;ML(%@$04djGo`oPnWG=Rn`xSyM$!y1(aZX`YGA&-$s^@^D+sFwubW!1 zl!*<NWGpMWKNX|iCE!mSwdWT2$E^NjtRxYNY7tgd79JJF0ftY3s}OxuM!iEe(ivfy z0DFd#M>H3k6GJubIn#ZW@Q%d2XH>5~>r+6D8mjQ-?D|0Gh<5DfLSIu;lr!lyaj3gf z-(}*hDMeP^_4<}k4Neyenvlj%j4DH0O{K!1dTtm_DQAO<O|xM0F){IH=fEg;-~!v4 zODsoOS3Vb#{!r<<pb@E#-V>B~S}-1goG=gSJMd>Bw<|6le=TL!%sEgU8yh=Rj(EW0 z)5{+u5vMMX#;sAAePI$05!R0!O;au6+M<c&bEXM&eFy>&ze*M_$`fbW3`6s7!$}2A z=d*giNs)wDpvMUoKJpI2ZQ3sEK-3%<8qSA{TK++HO@hpfBYjG2Qd>V22!;f?M*?|N zbx-CB57@^m_IF2U?YCVw4#*<i3AQEpgNJsIj8`dpFm5;kUJVuQtYB^_{{yGK0oDAc znG)(eT4{?7!*PDXSZBItdv7iFy#`kpgi<H%F|}}q7eY*?n|MUTruIU5F@EHz&1Q<l zbnOQTP7<3uYpKP~Lb}=7Z_AXHi)QLgxSEwso@VZ54olsF7faQaH49fOzp@swuAkO5 zfA=hIY}<_sUfJ$%T_gg$Zs?wW*QYX8w{$?8E9<SuRGLjF>;Qdj$rDCg-vap%j0tL; z5u81h_6r!DjgAkw4k`T9AG!Md?uI6>vaVLAxg~!P|01FBErlo#YQ^PS;;N<zK`EZ2 zKx(QUDozUDz3C}>@G@3%+M=<5^5k>X@NnZkUq~+FHpl!#hdOr9@5mYg=g^iEPXQL_ zLf#@xJIWC>9w$TR;iiCYg8kANT}u!G;gJ}F=9Pe6Ugy&~Tv}2zvn7yi(ujE1tUhJ3 zAi3w-*1vwH<hSJF7e*2-q?l+`OUi2gYd(t`X3h31X*ClwnS3ViWTKpFE=krnw~ftG zD>p5Zm256b_5{|!ie~Udg?KJM#T<2m8<WKe!}O^7G_ZGw4wL?(regpnXbNkL?hs<p z@l}e5(#zQ+Khd_&^euhk?35MnSCD&;<Q^QJj5+a(({p&qAEx6c^4{1OQEJY^f-l`` zfq>%UzNx`R#Um(qF7M_gXXuu;27a}hI{OUq{axDgr-p9gF!<6@=NNAlLwN5a+l3~% zJYYDj+&GPt=kj*h?d$t#A`@_fcxfRI-Ne%8Q1UrD9txC$KBaNJT|{&tubFsli+y@{ zE)^*3CLy;IVTd$D$(RDF7k@u(_I>j6@)F=M$3d9q!~)RV6Hc>|5Z2?BMG3P6d%)+? zCdCXjN6G3$lUPnx;$AZCl$mlPEw1c@nN%i~WNC4FqJ@Nc-mjk9O*f$m+#8?9+g)+G zVMyBH<x1iXJO^3g+J)N@Lu;wQRSm;B)o^YlCDUyJTQwD{GKI1+HG(xw2RqjNKfU4! zjoy1j6m{fYs@rnr!w8wL?proSSvzmcYVBlsSSg#A^lzfkFFLImAzw$*LT(e%(n7uA zneP!BAy45Y=MED~ig`~?ci+5v7wqQs&`lfq*Mm!i?Zi_xkv%#a7aIJ<%fYB7i_`iB z_qG}ZWx>Y6RCxU|Ftl#}v&Kan(M_ofl#&u8J_ftPW-np)Ez*P{-C;$mv_cWej*<w4 z*4g;9g-tWeT}010RcQJ*m*iR9&@nP(8!M<lx-gM8S}*LDZJsWN5J71O3rl2|@UY|n z%~A^4G(&<RD%hqi9CEoid{cdcpwo#0*P+M6Gh>2r`8MO^;+#{xg-o5AY?XKif~SsR z6ND_z!^T<Hjo7vYd_RS=SbGJagwo+5Q_eF)9GXk9D!jGZ>}f+5S3krq=u{8j;|t3B zL^_X-xz|^HQ?Cu9-Z8a%$b}&3F#1o#|6O^7I`kO+L)8EKy9@JQ0YYV0V`Ee2Z+!57 z;=s0wTXx?7p)Mo@rH7VfgVNQ9QAkDPN~!#)NEs_ON-|>u>0^M5IRZRPG<N7|+cW&D z!4KBEfp0!c^u@BG@Fi&zgLPfcoaWp6^UD>FzYpFKQA6$!n~g<N#S$I9t+}O}i;K8; z*XH($B~_3UMCs3kO2U@73)_<vQ&s%3ooeowG=}U-e+MwL8Ux1YZ9$iVzhcxALr`Wt z`Frk=y*?s|bn)&y_{XA?_7FEU2CU&wYha7=ok4aFDnzP{*2k#8LonVYOKWqknTmvk z^N-_lsgq?OA<pQ0Z}uqG*<_kcpE*+VsT#w%!+hIm9{!PXX`}>3vPJ~3iQ1Y8l>4E> zB)qBZAzL6k-JT^&R~5Z)Y9T2cpBd_0wLBzq%0q_A@Oz4M_U*3VHOLT(``|s?8P{Br zViOD0zjgNP+Y7eT6JVYY+3c*@l%D|sqt<DhDKd9uK(f=LzZChOJR)U#Q;!akk{P48 zpmfYrf948==#3^z<{8-{b67@AuWlI5V@`KF0~^xI$6I9JqLOOs=L^W{MNYutCFaX# z{laAYT<&OU@0~FW?6t^5Egn5uFdt24ieYLTEo(Q#rg0pi9y<&5yr*d-oX8?tGvdAH zD*fg;GN|fE%6{ekr=}a{iFG*cdz+YjZ<GH@7Em!XviT43=>J5~mj5@3rnamC-a~2K zlxme}&=~noDb7A{_bsqDrDLlI+H%OW;mK4V%l+rwD}(`dl;$bcWFhDfHICv!xty6y zhGUAH31h|pny_C*qvlrSa^(f?mT6h5{w@zCk1E7(#v`c!LdokX;cMLpQcGzF-9O6m zm$#_~ls0+y)^@+P?bl=BvV4t0h<i34vYcXyXZDT{h=bH%bY8hkb8X65|AC`jkmj&P zjlqctkDou``k39dMF;Sf!cQBhiS~Sdfki&-4#e*UgM7pfIF`qJ(>yl5g#*kV&2u|T zojt0S(&BFif22hI*jsSGnJ6H3M~45{%_m@8Qp~~Gc6IlZu$4sqWYOpCN0f;>L8Z5S z#9C_h$x+MbhiW_pySt(lCxrjmAm;A*5KpJTF7u6`anUg7_g9yglg1L{#}0ZKS0fo) zTAzVW)Nx-C*TyNOB;2%Cn_I|BXqqf;>cSxyFhYz?(A1B4iM(Rq2b;%I%I&l%djH3D z`#RV_G5C8?$-Wo$ziR$eoDA)p4gYD<{=XnJTZIWZ5J4oL83Y9Sc8~+R;k%#Ro{Z#? z@eV)<f)cksH#1hF;aD8aWS%kl2BIRQ5B~YjUtuOExGb*HQ|+ns(#_MqAq4u{kRyZ= zMMYXqs;E||lPIH?X^M?;pb=r5Labh!_qXct+mT^=K6dJAQ?qEVGFxAznH_WqYteM< zueaSBzTHj~BRm#Uu}s~u#wzq0BwT~=68i^9sD$FyRXhz(s6jXegS-hACduA$=NuCK z_1|(p%&oOwuCkgkV~8cVwMH6ckpU<y3^`MQ0jf5P8PiyO5zo+Ki)92cAyk`-wa!_I zRnL{vR?**5<F?_Qo?DCgQGw~wi|5#D4Of8Yd+0++haqdnRM;Tq^?-&C(TzPf_BbZQ zRZ*C$mR@2ik`MxwjKAPZ#G;EN0|4syl*7cFa#D$3gug~EZnuB=oknPfVw}V>!#@?; zg30v;9<ayl!&81zF*z<@aZdAtA-vMWC}GT>GcLqmgNPx5<($O`Q38o?mkbYI`R+e- z98bK;$3EZgeaqi@{J+>Si^=K>DoFmjYr+j}kZhiEV;bxCJ5PW^n1?i30Y)a481D)Q z6goaClmrj77`4(R{T*7Eg5?a4RmHjn+;*k1Wd&w6av7(k+!Ql$RO4rTh^xEnFAeJ} zz0R)Ar_QeHo~z!ck1w4JKOr|v+MK7)8?UEdUvIw8pFDf~kU&$n$zTF0zyMpG00EbN z!U4kjrM%mvygy5Gc(=~aEWWSKzOS&m@30VkCbwyDpOFLl_o;n`w{38ru_vFo0|JcC z=yM-Mpr6p68DV{9w+zg9YtNrmU|;0IHSEvs5MKlP0@&}EL0_r+__*EH!tsW{h49j( ztP}g8ZP57{0VAPm&}7)W79@fTa?74dsS5#-!6n^Fqd`u-l?DouMg}RtE6mlSnsC&n zE(bO|yZ#)^4w9VWp{^Q3`Kbds%y7G;0A6fvk514Ftm!tu47*N$;I`3F2nv0oAuN4s zf%c#mcB>(15Hkci9JTE_rC}0WSH`$qX%8+R3VlMoW+;E|<>3Us&ZGf$&@r4EV|&Vg zEnGL8T4Qe&R&^?|KR<45f<q1Xu-^*e6w)XLL`t<1O^_=}ZJJ^F2HYV8L<<}*+$O0F zg}FgkaE=?+z!tU(%lfbZOPy^4K#g4_4!%vYT{jeR!yB<ti-&ZZYDkfQ@VG&LP?wo^ z@KD^NTYHd?nKyFWf3yc>mw3pS*B6e43~u}u>@QRPfF5@4Fc0?pJ|EOEPut_Q_14bH zN{4e^UsoL}@CQ`MRfEM3>}c{QFcPYjVQ%GoxGU*x)U!xPNK~kmUu}4B1TgI4feQm> ze#`{12(^Oop?|Ls#ox+m?YI0C;K?j^3Tke+d8-!*cp4-sg{@d49PU#UY|1@}@D#%W z-K*|?2YtK=&)5zGpUdAA9FpA)v+}rCMyQaUse6{;MT!;;v*1Pjprv#x<ZFtEU55yj zKxE?#W?Vb{xu#~D(W(VGXcgR2y<y#+r0%KB%!X$uTE(heoCuJ(CosZ_TB;OEg&IX{ zD?5nL$e!L6hg>JBxD4<<q^<z?HjeZv(2igX*)^JTW-1&`_((ES&e#|sf{DA0UYlMZ zR8Hs)d<gmTY=?l=+1<WoXl!m1Tu|&fok&RFn<<l%dNT-NJMIx6A|`}ptqhR{3Zd>S z__`MJa3d9cu-e3lDhVrU@mP@VKBBa94`m$ji2Q=w5NhNu4CNkl{DUwEY8Q0M4rLLf zyCxxF$ytj4d1$ge!;)+Y5lv-4s>YH++9`Z}y;m+)1^=S^Ve*mt)d&Blg379SFRz9- zYI}!8Az_wFC;@8)j!z%6tLx3oZMKsg51v9BS;mfF_aHZ+$Aaa>x}fWqSeG<aIfuxP zO|+0EzfkBsZ1|B^Pe(DG<uB*l&zon7L1Ez|JeD(g_A0c}r>Z+)E8Z(0ST6rHozNDq zz0j*2n0KVlp8*U*O(@sOxAY#W0hs&Mfr8t0{ptW~lu)!wan*pjA!itb{d^GATN3bD zCeFEiknVzhQ3(BDR2Xk)IqF+D0o_1#G>-^Lz0ftZXP9UykDmjK1S<Pux1}Hg0c~iU z;CnyI)3rX(pUJ(Y15N<VAbsF{HT~F$Frx-|hP`)L=3}WcJ|!xXy=~`%5!{AZpJc8% zT2^Z#p(`GYJy<bh7Z$u|a^#kXnzm<^CDQ8grnh!r=b-lK=e?~eoQrj%=+XP}fr`ai zF&B{&EhHtQh&L)Xk`)o8OL%Ix1f+ZEMHLbvgTaB4G7G<c*=GfY-Rgmhj~hI=XbimF z`oMG})XiUP#6P&z0R2Yt>kEFOc?S0WIfzL8Oq5FfOzaVfGP!P2p&%hkN?9FxmQ&0e z5QfG(_#Sr<hW-xKE!h(cSeW(T#hAkz4ttp<v4NVp3Mi3IQ<_-ER}~MP0JZYdCC!$o zRAke`Tti&Gn`)o!sqT%neO5Gd`dT!7IGD)fK9m6$ActyFSHoZlxn9Rp_Qo?TaYS;d zn3xYZ6YjSi7x_ij>TI8&`l0B74j46}Ll{i7lyEJNP~fF)o<?~G8%2934U%W_h#n}r za|F*bAn^;uzt{BjLJ=t2XX2fm^z}7^(AU#fr^WDEP9WtF<-+im8enjs^1zWJS;o#S zMAaN1c^0LH@Cbyt*Ngql0GKd3KgsSQvxQp_SI)>~R_mMyyZbA_n4mzVnQIu)3rD)u z#8|tp&N(c8SH-gA2M)Qtc6$Lu6D>@#gxGlzGdReJ*^Jr=KvF{|%UQa_UeZ?~omm=V z=Is{sG<g*_Mi^z2!ka|uYoT=P!DS=2%}#$!fV)erLYiaG9@WV#1tjui8JcI0=Wy-F zvhR0n(y^20U0FH(IqZ0_rYY+aa)_kr1ZO|#ONd6HtV3SJ`K&qXlH`KdXt>0;HN2~( zyh$}XI((O1E{8rpo7(0zp5$8N+Rd|5h`gS2VH|0hX=dDf4C69c&MUo`>H*N_Du$7D zPVV0_wn#z|1d%*~E5BOj+;mK&vxhKF>9!}hO|$2>OEwz{(e(DXj~EN{4G>cs%8~rt z@mxqUQx^oFN0W9!7B#eQ%4K45$#MWD4g9|T8f0^luC(jXUR~Su`7Q0XdI?w(Di#Gz zfG&STNP_-op2$XmsC1UU@G~=~grMS`+uv6^rw$CV(k8_y#F!K#Um)bE8yvG>OVii_ z6lZD}za!ABi$k{vnD6Ja2n$|K!L*H<l<;llbm?lJUeDY0;zB?STL=HC*L{oqi5Vl? z%$CrWA|J^v(Y2FS7S@Re)#A-WMPTw{Yw1^oGA2Mdl`5FqntTgc2I5JX)?%T!SYK(g zp4C|hksZfADhzUH!GP4Aze}D4=<I0CdkGymuPVLvRP!D1X3-OfT}ABmD8e0%vzM-6 zL~XU{+3V(Fou|<3ae~C8kj|=WeELY`T6JsiMDEy-K<Uk4IV$OJ7ZbXiyFBm9R;#Pr z25%B=QS#=DJ7z_0c`rb*u@X-C12+-8(Tu;3ig?D18`7F{LD+{og9KX|f@F|i`=PrL zZ!uA>ROB-HRFsxM)}@m6muL77-VE(8i0vhBY#Ow^aeg0`PHH8amy4%<@6Jg)NPj1X zffE1~j!%FX*)8kG=>d7}*){ns%WL{|2*}cktU)IdjEuWr!1qJOofWXsi_Cr(W7Kqd zTacw5*?r96XR-Pv{6AZ)xy6bM>HRVu_oM~}cv7wGY`Ngdhf@j*%bdVw#U!bU^=uhX z_t7cl#igYzM6&)dkZxC+VyBi?x6wg|o_ENvJP#~MnG7gh&T9!dO5@k>t|sbQ<JTbG z>gH?W&hPNO;^u3ImOtENhi8|Phh~Q^J;aPp?vCp3i#J}Tb3?__Jn<%Bxb(Vv@upz8 z^a5|r@Kgt<nev?<GIW23HYos@lPqa;%?|XBnSV*Z%uVtBH5sYznx+j)UjlPn0N^R6 zd%6<er|p~Oyl@X*&Y@$wX0(KH!Hz^#a3VCxp~v^Ysk=0~pK)JJE}Usuu$bdzhn(w# z?k&6!%&&B?6v=5NZP0#QLbnG{Wt?t2Fss~WSM*nH7ALGu_dYcTF!a^k$DO|4FteYq zAqVnW5e?l8-kdR4liU2boRC(O6HIdCPgLW;Kza9h4v?EKJ9$s+PEMbdVLRN<lxheT zm{~wo?vA1S0eB5{OkeUhFDNxcv5NS+-Q=JQdL|G@ae*^!Zs;5ILAzazOaqX2$W%xN z!u<fgwB-c-JEg!64GW^$rb34oCVC=kjk`$I-eTp52v0qST+aCfSItpVgM66eutnM) zVcKI3hvU&=#>E#cXe>YLt(wH|4(9l<L&Fw0DVeT+S-$@FFR2Fz!5b&-T}IQlueHoW zRi!3B@C@00%PmNrj#i5eTq+^x1TTzP(%N~miiZ5pq$!=lX5Q;&t1bF|nAflEh3y5b z?M)sS*n19?9;Wsyi`o7ynqltgRG4R4%!=;$C9LX8TcWqR!g?1?`k25W3S>9Q6HC{> z_X>eijwE&<pFE|u(PbX@WFD&SBTSi9MA@B@G*Vhs7;n=ZyQkxs<}G$gX`Yd?KEJn9 znuWd13YMN02{aYn+t;60NvjbY*dAVJGx4i2bunfTti5FQDvDQ*TJD~~H7=UEF3s~t zC|Il>xwB(ozMw6#gI$5sco8mqBBil|;A`NcHwk_dmFT4N0AG<UYuJ=r<xuqVLE{_! zDr@bT(w?*^s*Aolq^|1Bxf+`5JXPHxZCGN0$db6MoayF<Y4T27r;kyje7en^qV`sm zTUYh<y{3{Xf!+@2GJy4lMcm&x3h#1Eze5Yt4PAQ(_En$4f9^;a(qcv^5?RM6FW}sj zbKF+qVT-kPK5TdE<gA?uHn-KoTQfWG2*Vibz;!;*AiTWfQ!+vu`#d{L&n#KnhgW)n zf3E0%G4tfpRg$^!hiiiVqFtlyT6EM|G_sN%3-h3Bd8Uoll2o)FxkjDmh3*2SpW?hE z1|HY%p@X~G2V-1`T(>CqL<Uj06eAWAr!2M-k<jEUE{52p3ycsR&x9w24U5lTKW<^# zJZ*|fug8QYwzh*(wBRYpOuDT)Xmro^4<j#-ci6mW>aa0(Fozv_Quu-7#Xts9;KL7D z)J2&M4NjE}ef5;e1XDw6zI;=2bn1{Q=P#9@NCu&b%BTR+YlXASNtFo-oa@Gwt=cq| zV|vJV%AuqYzHp2VV)HN|WZ0nq00oC3OrR8-w9XyXPdravN<u<d&b(~e-{%zJY--8J zKBqH65>u?3ru^-i-VGD6`U^x4vp6)w<>^@}=MNL5E3%X3DADeP3m)hNCF^WBc?zBS z85XG)7I_a$QF7gMMY>*~Fj=otQrn;=Kt)a{t7=-43F1l5A6dVo>JJ>=Up1!AIqjKK z9~yJ6syO8$jqB?DySI;R;RT=%aq4j>hD6rXvH_;FJ4s3km!v9hxN8BULB)1;*a1;F z+z7kBQf8|R_%S8$v?>c0w8ty-PCisT;-ryP-Sb?8ln$}V+z9s>#<q%WoF&FLa8A%1 zj{Wu14^>5km>XGV9QGgt^@@2++DC2c5$ZdwA;(tJXo{21R!h#MYX(tg$!Dsg%9Vp) z?-C5DVV1K}9`1Ik&-rTTB4p<soY066IAZ|eLT5}X-efAt=^f`YPv5A7glTMOZ;Uyz zv}0b?Z_vx2B_7DxfbIdQ2xFbfq4(!WDdy=oT0m^$Pr_N4hXiZ-`Ij?rFOSHdarHk5 zXJ8&0zMp_oUuXV&TFM^gsMHDI&n1bUlR@Fbv9Q4jlUGPQ_vxp&7jepvB#(-pNKA=P zdP$s`6k3UAypSx%=@h;qGP^L0>wgi_&DJZImqkBkB3>?Q65{j44}N9pu7G`n&2&cU zHJOK&8AJuPIudA7eKJfUpEr*}m#fKD`Q5!(dlnV_tDu7TpkS@%GKos==)O$ygPaq3 zF7Xw1AG~0fRP@Xw;Pt!Uc6s!ZbuJ0kXR->`vW^QF+2)3php_q`J9Hv)k-6r9H<dnk z-q=V*DpsSHwUo*hGF)2UL}jC?EMWsf?PUX#u^^TweEOTx2xdz~S!2Y_x|MEOi!el+ zP!!7;-5XUdi78c~$~PprTS&c=Mmaj5Jt6mnFfq2D(GB=No6tgD`5=DZO(@`R88yLw zf&VQ{ZA|{vxX4Mi{)gMt*jE`H9WFR<2hF6YDUAjCjeq`OVl-U1A>d;}&8&cLqz36( zF4N*b=plr#AJNoXPCGw>1xNof`!o0Z&a)-=c6icu14LlR7e$+E8b9FN(H%b}-9bBU z$|OCdgsEq^(H|MG2DdTP;-r}EFjvD=|3mo6iYSv96F~43i=R>$I6zd_=!_#}0*5_# zW!!hbS}Yjx$VMP`ZFO+{ifjdE7T87n6jxkBf}rRCZl5g~M1ZLT1u_Q^(t-;On4;x* zL(5K^i_I=w=EioJLw>x)PwAe>4=H9W_x;Id5%>o7Q3C2aXd4&R*@Mfjqo_|>g9A0d zs9Ooq+jHX;JBOGP>Z4Glas^_~z1-<gS%3@Ww3?;^2%Un9>hQb$;?s3(O5ZEWt`dwn z*L>b1Vh&YwA9UI_rkDRpkn1MPN*Q!pzWGVNS9=J@m7J)!uragV*nloRRhy@lLz2;H zxew1|*<~-S#L5&D7}3>kZiM45BQwbAh>J>Idb9-R1feE7Z5(4*{C%L-9x8_PsEb~y zAe7684va5*-)tmbGzOOQpS%94GcJVcFv_y47>3*N&4(;H4U~Lp)z+H}uPbR!YiAhw z7+zE6{mGktKzsl|i$jVl^@u(di?m0HD|^QHuy9&niDB9-OUyCDy<)ZSY&wIJO<m<( zz*E6$me)8jShazTWLpcgifPN&6xM>pU(MeQ{KUS~<_4wV;*vRW+3c#`=(r=6<qLBJ zuu2;mm+^0Ac;nVE%=44}`DktQB^L1C5mOT&`y>1craL}avVF&taB|j+GGQFCE!_Cy z-cPhFkaODjWrgSw`Xg6~Ycj90$7%RKRCIL~FU6-&KtNXCjW@FY|JIfLhE5F4O@(ai zjjjK+gG<!ElyTRP_m+0f<i;cum?*p<&@B$s@Z2JTezp5Y#L(hx5FtzY57-Ijvy4Ir z#yj*&qHYRFC;2+(u)E@Lu*p{XGO?JD@5?3K#eEdK5N@6!esp|*E|z!6y9=$eUdfEy z?r!;X<?Xa}+2=i+$bUT}0mTlLf{Yogf{GJM58=Vzvv&U+0zp)uU8FACk1sP!2*qXX zmKaKeDv8_ELyIbYK!i>;ZLjDT^pFfpGkxv^sq6n9PjX;^7V!!Z;hm(mSGYortxfW0 z3&tCA)$+L(q;BA%`IP{EuM7am`W_!jDCr;#4C+feU<<vwPc-lM`#{5wG=taqn{u~= ziKveyEhbKa=b(tt4d}3;&zt=nw#X8N0U7oeCNvK>n(KfYAYud<9{)*=6Q}y~&P4~o z>PN(|hCXXX<nWJ(h9d*cXpLq_yyfc+9$eYb!v+n~?1QLh!2Wpd)quv)0g#>8Y%JN2 zi2x5;Y;5TmI1!0wWrW<<xxqO^vBZkT%RbKXEfSvi@UjDd#~zl`AvDTMaL`cCLa)SE z25ickaDoWRTsV^v<gJ4O8xsqMXV2WE+;N@L{*)#It=5JlO)DplA)Uj%;a0`5XLP~f zD&LeR%~-&N65`bl<QcPSvS=mxKE|9Jqb+D_cD@`@82Fr%pDm3U&ndn%Y0~n<2pp3E zU9eC0J9yy*7LA_apv1gs4dLC(!X{VADe~8_<6)W5%;v{Mp4RNVZRy|5APbff{1u2r z*fUKUd%A3sK}lX!vZwZm^#$>D+d1ArM)~{{DF_0l<!yI5ACevJq*=L^)a{Gmru?~+ z4COPKQlWPPGVGb(HB<+Y1@{YP(f(~tn7Zgfl16XT8%I@0k^G|+<{|ShW6wuT7+%}r zPO}1B96WvLZC;cS6K7d!XC8cAFX&F`6bP9@K9rkYrd|+1zB^hLJ*gS#Hdj~Tv^0EM zTvBSL;z>c{=209sZPsZ*@*TO{s_j4miU7FgN(Y2o<$^FZLl3nOJ*}LOa2U&U1w*(| zRjgoQ^u%~2LoA3}o4DL>C3N~ZpIf4VUu4GmP8_YQ*8R&_2Q4JgKo<2o+;ur4G&XuK zjJ`5}?zsad4Uh<9pA<uxt!@YtO4?pE$gq!(?hE}yx~>3FzpaJ28K_gGj6dlM*sHwd z`Qe9nv#<N9FDJXZbCM6}8^7k#_ddvE%P=R4UK1Hxj1qg2e4gLUr#-o?-S?4Ype;_L zIQgB%#YlZo9K4CW6NXMkn|iZ2f_SN}zYMp{;)YuB7VXtfElhdY+45Ic%PL1lBX@4D zCA93MP75}tga>benO+(-*JW7_Kr)CYk<qbxX5&@r0-b>?l&IP;{6n}mO5F^@d3g(E zwV2Ikh<Z<?Q*#}HG)v#<idGC-wc*29JCNKvKX!ozC=4Jy9|`|uS*-KT<hWDZkrq%E zY$Nt54E$tXGy~s>eVBlGrIBz~na`1MSDi2W8D{6vDw78ha1B!n-brOMIyGq4O>J}C z^5T)R9$gaM6pDqJk2vOAJPVBYfaHRM=+822>wum6ZC}x8ixmB8iv)iN>R=nRRi4V9 z*d|D>wGKSTNH>hH5V{w(DD44k#C|Fn>;mvk4rq<XkVk^sSP!6PR?Y;^RBb-YA2#e4 z<MPMy5MKyE^xtc4%L@zc@xhZP-S-Z@L5Rdvh*NUXb?E*CLeuX^seGE^kgxfpQ}FE0 z-S4A~&l6hnS$t(ocLwO|x^hcn3T$GGtzG4USvR){k!u!%sfi6_+!bqm|C2Zbkj_p) ziEoFrX!ov#1}lt5<g&8EJypP#Xy*DXNg1oD;kB~6Vr`;G=z*Y6z?}NK+jiA+a{5As zdttJXzjp^X)AiUe3vttoH9DlXUVBOTn)=n(J@$c&)w0tEWA_d!VOZcHpY&TxxDz6; z2j{lW5%VZC7o>b;r8z<K;spsImJ=g$waS{nf0Y;qUKS&TU_;Yds;-Dwcl*4mcE<=@ zjO?3;s@GU!won>)UtXq5G<0QW#<gF|SOd0w<pkUvd*`;%u)Ww$5Wn^X6b5qbZ$k{y zgcqN2=3l=d2^fCp*2l}6aa2e5Q+<JGZlM&cy8@&Cl2p2||03syY~-=^n`ZJ$R5 z#;^Br1PA*aj)z3cI}D|aF^;U>e<gxT$iL-AxLI0vg=V4d(5>Z#De}p050i<s?N1J= zf;x(8wSQZ6(WV6N`%<!01+v@R$NWI_dx4D8G%l_sM#p%MaHCv%2tw&bVn3@lE?9#& zz`lvjah~3E!Xlm;th(`M3>^{fsanXeX}ghh^9Bk$-3l8I(j`YMzs}G+0<QSRfpgXe z9nXAy>jZTX2ExWh2K7^b9&Ucn!MrFi;KHuN0^|Js&y)>S?qI<kLU}Vk5DksUloH<- zEk{w+v6%~ydD%+D>|a(L8e3;U8E6c!vAdn+B-{p~tWfBQ8^SM%YovEyJkf`@dwjbF z9tj>?#*3#cB_y)&Zb((y0&L|U@`0V>)+nhV<Qa|RZy&g~!Sq(ld0Ht<311@R6gT~b z_;nKqyeq^P%yqEgAvoZ-1<Xn^eko6wk!>(Ut`hG)BoaP3-b>)Q;H7jWupqFq+L0V& zxzQ=z*7ge_i&{x6JPu%Vz5xcjP|8M`iR3#a2TLZhI2^}9ck&vl^fue}2ky;4-f(^a zeGQi$``pv(1zyPd2NeFkJ1%!+a1WnRWib1(j@sUB5~ALiJTnx!kEP>TcCu(x-idru zoaQo!_SBh$p6vU<1yhBk(bfdAf|$ZbdgyH<<0#3|3gZg5?CDYk&rDN6fyfru<%?u` z=D_h_Ik60xm8DkC3Nr?J-I<XQ3&X$iEecD`Wa{XxD{F5v(-IHZd@}2j(M0bJmAsSD zg2+nb>K4(ZBITd%I)l^oQqj?N$kbJ3rfi)wj$2(Ou2}VTQKV(pTrLuq-Ei^mdf_2i z8CFl*&roGr{0Ry?cU1(yjKP3?+SuAkSNZ%?>1cleU(81dA|A5H#8`(Ma&bt5y#I&A zY?aj%fbbh`cKCk(7plqsER}>jT}++-RWHfLOaDXW6Eb%!i;b+}9XK!yu97s`<EW@k zn=A?stMSMbkFjY5Oa4xa8505fJuza^qs$OMJDc&#Eb(Ud?f&f%ejgzX$Le%haik#; zm8?u^HaT0}QBgE4pQ~zJH*>2+20A1|(xTlFYct`g(I*A05o$)I*Vg1{@<jG@Ja`CM zaC{thF3%)$6ZX+ws(gwxB57>>u+!;A{PQ(nXkfZoOxc=~IC(j%AJ_}T)dB<_Du9m_ z{O<yag)mZWhW+$M3fxtROmx4qj&T^%*W)J4rTdn~#=;;LPk_r>@PPs60J^;TA$+o6 z<N$|K`gTS#&ybV-_Y|{K1kJeiPEla=zrCN(i}uWD4|bu2yHg5_JSA|ZJ<78RFF$=h z|HG3iJK_lf=sU!G-|zoI)%bUq|6!jh`8{d*UqN>Lx0T=HhT{QVJW}}qR6uZYal@i8 zOc^(o3K0$t$_W&C1D&HdFgQBlJ}fIMtAvCE8n3_KE&Sk%$P`9X=0?WO$Lq^87-PR1 z5aJ__&MnHSclFykkqW{h?}~8X7T<MFCOfrRVt>lA(3FkJ_EF}(Yse{dEDX-K#j;a# zz394hByFce8gmxyk*f<^7WqPgiWPI(p~?n$aL$+PU84ksTUQUhj5NWXRRz?nrcAlE zDeZknFKK*#?aPj^Cc^anExa1MbpST_?OXK+f>#TM5d1)%p+R8n*_+M!T`tn!z5QmM z6GPOhx3Q#p#U37SgNN={cF?~@htL1v52W%t%>e29Iw}nJU!$ntWba~cY;W`LX#V?h zs<x-BEdH&2dLri-h81NjfGXFp78b%0ghi96R-_gDwnPTExghIUG?1`xQe5~P<$oGU zV{TbGgJp0j%~_bQV38qwT^6W($j*WfM)HM{ncd*~_4loJhp%g*@9U!lAs=5phcoKp zd*mI7ja_|5h0!v!Ha~CaK`JUjwDS>r8~?#7SR46<jN=nR8^75-be8<awrNpSy4zsL zg^iKT0UrDMwlT}lZx(iF_9ldF_a6~l6pm#o#ax_ozn#&s(KVq{mL^;-Ki3bsi3M>| z6xhs7nqH%ke>28(g_=D=dKnDJkb<T$WBWK#Cb0b?vuFsB8I{OTBan?jO1>MPK4n@8 zSN2m1>|scdN+*VnG;emz-adB8*09N~V054J2sJwE=<g9(OkcXe&FHuB=EexeSa@>E z)XmG|Py(}j60!IJs0<Vjyaf2JL>tDQV*AW8#>ljxmxQQbif{4MI24n5_YT1zrUvsc z%)ds0qQrV?-Qy-KE3*VBvLs2&JVds{gUQB?MKxAMcI~{t=U1N}FiI=&Cg3}+7JERr z4{Ih*H7SEpP-|L;$))TpR4GofK5)@22~MGiulC9R^({lyV~w$?3k8yazv(X;h;wIq zo+mG;m07T`2vHxL@G-!45F7&KJyHt`71vn4#k#RRHM<8J-WV!H6oe;c$Gi&&Wk5<+ z(C-uggorTPnXu~ge~X_EhNGUfgwtnCbr$C1s&M#+{X?N3P9^MPbRXTTp2ddRo?}rN z&{vHI{t855-<$o&S#*Gx#wo-~b?BTf6l1nz!I!2OIUrrO3DC*QWfK98b4C}fhW)YR znTF@Yzrf9%5gRK`Qo}QL|A@2OIVr_{m#)JnI>LWzxkKvXLZQrp@_sC3DK2qI0N|N+ z;UC6yq~;w@D=lT!UB*<FbVxH!hmp3}=(;7>rdSZVS<&=TLVqn=Y}8WWODzLw;#I|c z;g(P#KN)XTu8Y%~gZXpPZ5`ho!=MOA(HAl+^3We(Z-97{F5kse&>vtT=BO=ThCI0v z==Y0WCXR=Q5F{sTjQ<OAR|9}DcF>;{e8Y_`Z=(yNHrgBHV{l+Vr9O1Kin!Q9yam}s z^`{7)-we!UFA@5nht=~y`;`-A>HhNd<dD~l8@<h_1zOyWTij6+d9EYmMg_S#xU zte;0vcv2VRWAL?{tNV`Td}@~Zc0Pm;N`9um!>ZNeR2GTXJ$yvWw-|43!9n`CNtkh= zdk;+c)Ig>s%%pP1sBle|@#Ciq^-GD9jO&m|tSgmW$)An6KnE+#L4}MnzQ6D9>JExz zogZAw9P1NDx4#*U`NL$-v^O+Nn-0Ewl()%<?IMP`CInOhdmnFxwy?cy;MoavTSDo( zwsO}nZL~%eqPFZ@xZD&sv>=AA*1<dx%20HORR>aHbd(D~2D1Wlp#;x*!0`9zPo*k| zdKHCK!1*xv*h4Mr@4!*5VlkIBgjP91=F_5(n2maj`%@Nm?WYTvmb;@{bzcg3OJX)e zoPcwBTM+zrAGl9twND>hDd)#T91(5A3IFCz7j!5)Qcd07L<&qNy+`+D=oy6Lg#(5! zn6fF&pq6lR%{l3Ix2@{xQXA!t=NoZKDB|;kC}QV1PxOc4$NK~~-2Qw>DIl<Yge%;e zN#-)JraUt!q@Ytem8sUxh?*W3l69kdQ%lp}euX=gAMHVde3pBJ*zO8AlKaKo3jANT zDG(4;QY7DZgXI6c(7rzz+uJgjeb1b*HMBN$Vz4qXGG_XZ{t5zs(9HdNzC7BudB^|X z<$;OeAG5>k?WCB5|DQemzjE;mm!$#j$^uJkweEzqw&DR8F$FR?l4h$hMKOd43JM`K z#FV6ikON3aOLuF^sRJn&X>w7?1AUK$C2B2ev#X`Dl!do{2TXDm2OS+>euz-PeAJ>Z z<gK9jZm;e{s?5vF$2`yPnUCKy-ECg)HC@->{@<bDfXiQsfvKc#N7vnM@1QynJ1h;% zlCrC8zjI)T!)4&O@6gOQVtaz^&>Ws|+<xBn;C-EHfWUNa3O1!vW!i@TmEUjCLYG%@ z%!s65IyC`LtHM%gn1z>S8pb>CuvBPJ96^_vKN>aDso1CH$PKL8X?`ZajL|~lU4f4| zRk>rmmRDz*_Nj_AFK-tcY2nqL6fv)Ck9~WDY3(46zJhTpU$5AQ;HVynq0T)H<=#FW zrRUuWIWgeiKnDM{Js*+PzA-(6VK=MVpgvGz#~G$RJ7Bw=U3TCGKF0v=@kWRKwq1|y z?$D$>0J~iu!_)={v03}2+AT2>r3tG$;)`BHjZkhu$$1(Y<rto2h;9sXt>nOgi>uBE z7$q%L!BcdMi?l>%p*B;+Q+24rRccOIzErtGL4T@f*B_DI`14fZkrA0z<q;C7-U(3h z7T_pefZTTAvQxUFMi(eQSb^~!hgZKlSDii@qV^RTiK~2OLKmn#pwIwcd`N=PI}Ekf z7_h!o?sm>|J2by-;(g7IT&sNc)PrVv#YF3t8)2w?Ce!1~KM+K(Q@?{iw^z9%N4HnI zi;vWIJ2dPb3DF;@`*Uhd9m{mLrrNDKU{Coh3+BqWkR^-j1!Cyv&YEI@6Fm|W+`A>g zafNdl$8H;*K2-xX8=bIgU5wnl)Ai8frK}^5z_wsT%Oz5EouI<K#gchy4!3FQ5R2lg z4p{?7&izomTW1bOB|jHy24x9ZlQ53VhkFr+OD<|}&q0hmVPWO}JX@errbFJK3i@$^ zeI`Sj(rlvMY=3@sX0x~1QgKo!dqSl0duD63iT~AteI-|l)JPLWbQIo3YV?UD**wfR zBMM@X$*{ODeIKDg!bmlMCo?u_bz#AUToi57fHr5sZf!}jz_aD7WIESF`6ks4ntX9m zgB+bANqNG~xK0pm^3aPMm+AYA564etY<vZJiBhfS(m;rw{}JcOGaF83ywL(xGSGRC zgm+Z|{DXmzxp6g@m==EZBTTj?a*@dTHWv$;M3O*Lf|YBAj`POhq_>=DFwz{2*C?{_ zp&(|Gf~L^U)M{9wwJcGRWRe!i4H9;!d<rba%=oT!#<Ebt+*qu%1*rkb<oe3!sa;|N zp`#@#>i;lyj<KSHU7OyvZQDHCwr$(CZQHhO+qP}n`^*`<nar1b$t2B_wm;gWP1|%m z_qr~xkzMUJUWWLsQ6ftwp^<enVGAQf%}4_j<atp%j<xaV(WV|Su4W=5<1LZ<=X1!- zuE>InC(u+Wvs@PP0voQjt!;lB=W%K4T$jx=)7YFjE)J6g_ei;7YKejNHH6Y^?d4=5 z&U%ImBF>2@(_m@edNtvr(A-&r)TD{CP4Zd9?SWe7F(wWSktet%)~lyj$}Td$+vv?R zHq^MctA(9n&;x6ktBGhjqUtG5(?D|4Vv&rFRonr(0`NO<5i4#HIA{11ndJd>#keuL z60AqsNk1GZo2JECAS1m$GTCMUQ$`cjjK;-mR~Oef1HzRm$YZ(*I>eu~%9@YqfN`Wx z`_(uf9#_AJL(9EW(f6>3$SiYscH(77rryfPnhiDFyW*G0zBA`>=Ms~G7q`pv@estU zsTOApm;_RVo=ld*ZP8d4KUmyQag^>^p?jfbtm(m&u(yFmSkg{TY;14#Pde=~LE!rW zuy}!6tnYYid%?t5+t6<o_I%r+09ZIC)pia~Hlppowo3P|uyKdDP`+YAM)#4SN9+X$ zB-}Emj^kGBpmyf&<lJ(cwyVq;Qi>M;JiMG!EbB(H?0=t2MVAzWhPw7uf{`Q5hG}<P zeTD8D;`!CY2pBUbz&>O6O^3rr!HllM8&8)qv(%EH?KOk$>NAk-qnGo=BeF1Yvm{u% zwFbOcy3u#})AOFXXoUy9Si13bm+DdQmhQWzjTWwdEU;rnz=hotQmIW#=k;qs;rD|e zNLygJJ;M_fg=jd^Ez3*d>rPg6w)9t<I#pr&z~vBam6Af?oA7_`<T2LU#m1opbBYse z5*44glV>TB#Ib{vJHb^!Hp61hZ~0x-=M;@VLY0oWB}*-+Yyo*V5catQ`Q@+!%&Bt7 z3;|Kjzc@EHfinzpV&I0E0GTPkfrfVun+G3_XjYb6CR9a+#5QmmsGUPd)p%p~)b7Et zei8hN58@ukA*P}>Gn@PyA0bj$gKmB+Lgn`7SiU*9YYvid7-&y72$<iZN5@nB@x+VA zAsYRujP&a~sDLX3mLlD0l2{YFEm}lITuYZKnrRXJ0P8H@rT!eaQ+XIW2X-4#iPnyn z2H!Y|(Bdv*SoE1K>*I`VkmT98OAhHB)SW5vBWXZ=hr)z#ebB7hN@0Cb%r_moPeC;< z3d0yv=70njd1a|t-s5nS_4rbWL}Ho-umZ*^b*+M3Q4F|aBvV%iAm(&4^oh^xPYZ7T zMVr9ibrxkxZb_Bk=^$>b@I$}g1UAmag7t;q6NH#n2)dDq37j*3=lbTU7*sS(HcCZh z*#Is4!(yh7N4DkIEnGrv02fx-tgdZJJ875`Mo0*BV_d}vUj1bUx1fm>js-08@#iA) z)=`Xx_-H&fPO~Dc`rV60<p$f|qPYh%K+5=F_QD{=k<dM$LQFSg&c<E00N&BnGu1Kf zUc`?|1SOkgT4jRE4IF{HJ5j9m9Q=%lC5#C61o<9Ef+}}kv`9fxO!Zv}B5!4Fdpla* zj55^=?|6DvDX66iA@uBY<VkARWN0^#s<io*Ch(6iTd+R`4u``?EhSKgXlDsU;Bju( z2#Avw9xI{81GU1XCTWJt2x7dcL@V3hKS^$#X1l&15%g{@Y!PjxuGkWW;v=8%*;099 z=qTSsq4bARSig{ZqUMH6$R2FD*};Qb@d$y`EbckfmIUNA<RV_2+nDHLoOOa3+fTPL zpxaNYAZ{jgxv`3{i}$GC%rZ$uki@uAiiRcNn0w8QjJ@jZ?Ni1t!w><VM-{%3=8V3a z6&b;JaZv?=8(x0VO4E8Q-_*Y{1ASKSRKG$)YxjB0w5s(QZ`5BX=}QFY*7`yt0^?nt zGcJc}e;m9^6V2+T{ftqou(E-k94eod>~sG<($Q*#EmcT4KZw)2+KlsXRf0te<lwP$ zj0YOhb8-q0pBnR-@nwEhlLz--qvWD1>{wE=dj$l;US&X_8g{&Vcjtemq%3XRkvD0E zw|Py%$TKN;`-)?0Dd`BIK#O+0iw?wLS5WhaXFCvcB;%F}=^j7oe%rWjb`8<EV&|m= zxn$6TE2b+?W9V2X+ReIEeY6%X()CeMIJbA5Gl_$p6Fb`#M_C<pdG1V5lapr|(uZz0 z5|gbzX$||P)6l$@quWtGH1PW#scQ~Hb*!VwJ!r|2I&)mZ^d6B%7tU>ao7#Le{reQT zb5QgXi+nwik#cRl9|(a*(N&%<L3vdegSfReDCjcFH&&Qa*>?HkWd$ELG)4EwlQ!Ol z@8U;|O$+5a7@Te8f83N#W^TrAqFmoxdaCL1?SdAod6P|s%R_vFmn|ZD^Y#&1@C;tH zBBr1i^Ei)R-w}_2M)Ce=s5a>DAat1jn0nT9en_q%N<~3$rwrtTT;9@fcZt-We$FO- z*}v5Cjx2+?bsLp~hdgO#>k4Ze(IY5RteVZ7xqU@jZ^%+BXMIRhHAstDQ;^MXZdBDy zoBN5H=7kK@9?Chw@1Q-qlkt(G{y6e~qn-A4obc_>tQT7A`#?7HEzBQTFe{kd(EES1 zo&7kUksmKEo3H-*Yw+irnA*1j>7(iHc*G*_t6~5I+wrp|-*@2y;C#=c^Ypxk_$klc z#q;!(i}2B%Asgxr;$sT?mH89<*&+NiU*Dzv@HF<J-y*-iL4PCtq7m-H_XipN#>c~d zD+rEzVBi(>#xmfAjFtOjn_fZ0O)^x&$pD3x<{RTk3dK6u2TP6>M2pGdQ4->Sr(mm< zTjOlQQ1el>6MN(P5_HTI<#wcm#0HQBbH(dXfqXZ}10Ilrd{A;Hz!&Vz?VlAxG*IY3 z+ZqCwkd`v!IpI(V@+N9vKB~q9jcK8(3cegM&?_^;?Z(HkWbd&9LJwBT^&nRw!tqCo zK_`57Qd~cFbdSmS-x0VA#_+Cz;K*^0=I8YL0@kt=7?{AQBGj9r-F7po3-6BrX&VHc z#r62mZk%WMlY$pmVx_)%0PiA`6}<K$1W0TlZwO6c^^kkW<@%o(v^0;LD3uYcA6B}i z>;Nru!UZMe8_A=&s&&}{)oikY7R-Yz?*YPs>+i6zyvhth*)4&vAkTR$d#EW2Vbwn7 z8Umd$+q1IvGU4_7n?N+r2vh=v?i)E|36vYSc(pXg8uXcNGDXrH6Tl8q8niVS##(}K zI(3rk&)9Wg2E391u)9ZT4%y*-V>E|Pb6Q&{RI$o^6|(<iaen=nBsUOhA5>!m#MYwf z;G)(Z(NT*k>s&nIr1^1erF4YRjA(yC04Y1b5!kjt5|cj6t>=GJ$v6*mPGa5NK66O% zY;&J8$-D1;M;Rk|W&&1q25Pm<(>jO=)1P3mMrN9WR{NwP*Y|3tIxaHj@`E7))r5=| zmqK;pF^HR=Oj??B^u+Jz$`r06%JXtdC!>S!(ufNym{hhRzw`B&Z9!K@6jty#RIp!^ z@Ici4_fHei#RzE@{>!9J{b>c^t2BX3DkrEj!Awe@+$}7IZJJ$4et`a{zd9atff!KW zNq<bi4u;w`Mf@%0E@}9R<O2DE4SI?+mHC#)`hsJGeo}aj(T*2td0TpL*!w9lPoD1= zZQWGr>|cZPK>gn0(Qm*ENm0~mRO)YD;J@glPaqhxAXH{}?~4J&g~M`1U2|t+{>)LT zzpl);cf1!*SemU=ZYGpEmyAqp2vLIkVh&ifH@K9zVtseRRHFtx!pBTLW1Cdk7=P;K zv^Xq-B}X`Ocd)@>jzlJ7K{(@-{4A4+cqw&5E8ipW4_o8-!csggL%j21>VLaI2b|Kx zcoG4+<0y}Z7!>*yi{wWitdCla>O=jYBQkr|i#m(&BhB**Fek;6d5o6B?i95cqNS{7 zJ_~(6#-SabFrXp+RCp6O(s(<Q#G+9uz@`5bp&Q88<0KxFn5iuN>PbHllALF0N?4V4 zkiy}-Yj#<ULz(~4MEmOy*iqi+R{H)UGK>#g_7{OYR(7bw=NCAieY9V}^M<6Geo^1{ z+(cFI+Tz&x-2B*DT~+7wf(PWO^x%;fpLCvjP*&F8qyyx9ALRU*g9DIi`z2T<p;!4X zMFd%2!xzZ7jvcz^5&co}f#t>5VhS-s<k#|U&!AAXqEFV)m){T%K~!%=jS~{TIq=<b zYE>L~V{@s$l(Q1ox-v}0##m}<G(St<_`<QZIRTdTs1eJ;!Ep^)HMn3BCzSIMmbUr9 z&dKt(KqHguH_zhN&0WRvHmOUAko7Nvg{~?_{a^pJ-H&eXVVHH5rrD@2`B%Oh>t4ae z%AASIBGt<A2CCyndai-l)_tSkxDboOzU!Gx+<1I59rAr-=8$i;pWm=x6!=5AOl<F7 z$}!l#QXg}}+L9XSF`0a@YtIXy-%2~iQ)O*VMudHEcIzP>$|N^2C1&puA*5jj0^!~7 z8I<qW0`@vF?60p=zpSjQiZLC|{;86~iZg^1)I3O!OM_?UM3%S}Y!+TJfMpYtebSdc zv=_7}#5+BCdBOA$H>LZX#5*No;iWi0_CVeW_8)v%Q&<xvvW_2$3Upg$O`MRjsnxrI zZ6!}djnX!6=2qXaLi>fjFte{|5Ar1k8NTH3Zj1IUdItxfEY(j{+}-h^Qr~z14`eYt zzHx?#oDoVg0>_VM;ua!;k*iXx%U<x({R6;?pQ)aAFOHMZo0mOo<CInol09#t940cU zD_(YqN~@)vyIxJ%y&OuABpa#bRqXJ`!c}mBd!~}S5Sl%2@sM=H_nK0`D-unnQh+K2 z8a1SPCOYWH!_1Z$#N@d3!jgT0l5$>EM80vNa8G#Q(F6W_L$WWraz{@;xjEdu0i!#< zbD-S438PovxzHZoO2KVIPh@d+r4I7eF>eU4=utHfz8plYM=p5yr432OEa`}M`+p-# z=w2;y0=4h}*KqGsDBml)<qL=CN~TCQ9heS#$?TZp#v9er3w9fGZc;2pFbn;0nzj{8 z^Zp)@*vUNpdM1DX|NSp$8%t-=k!VZ+fC;((PQdzq3t0b=m&uqo8~o4p|6Rsv(FFI_ zT3P9P`;fTPOuaE1kt}2f45Jxyg)qRdCm@iTi$#JJYfNGXj3(+Kku;tVcMO*bh;?4* zag(|b2ghyR2e6>jnHNOg@w)3FC*9+)<GY~rD9}sVyNhx9ecN`L>pbKANFcxU^G9fm zkZMi*x&Z9Pc}_@b_LmFuerBLOT#DwG;?*o|67K+{N9|U|tU2(BT_EQ5B<9(KqJMgS zM(N%jK3Br*$ym_B=t)^9WBha$%^Nsp2KAg4^E4k2Q+(EN_xRJx8@6zE_~YT;A(KCc zeh%$z%u37fDTq(;K!mR$qBngmh2cY4L~rzb65SiPpvLq`1+Vbep?sza^b<=|Z%dS} zunzhB3eyL;$j<m#Cb~CcVatVL?)={=gBIGDKL3dB&7N~%@cbJ<Kk4u>OYUrmg`RnU zdXVq#OrCw(f8UCD@%blpfPM%pe+fnJOrP;Y(J^=i&U>PF$IgGEbB&*eqJ2R~dHmnw zKF6uggUWZu?jIeze?Xw#Ns96ep9w|rO`n&deM1+-Fnp31<__oQ2oIm4eFGNgnLaU! z^bDV;#^0fe^h}<uqJ47~>=-^}MEge0+c1CNiuO#Ny`p{d7Vz^Ie8Z7<M$h9gei)1R z44%uPf1?-jm_MOK{U*-qFn(Bz`V5}iXxnl*T_P9u7(cym-oZuxj-TgY{4f{!A)f0g z%<f_Qa25U4f6j~kjau+y{$wxuYw!#yD#sYh5X%&6qz!%KKI(ySW|G~{KH9E2`hl@F z%FcJRiMck=E;||#ePyWa?+}HtHq%aUgf_I;PFinjOQ|d9u0dwc1Jss{<f@+A*PuP2 zMhQ6#ZxUzBhSpR9jLqC4S>UYCOnQ^xSfM$UYRT0!!jXZbSF24m(V<zOU06(?OFd`3 ztw%A*yfNfxa#Zl$yImTS@Hj2q(QKnM%pZtDmgacEJzi`aGE^RuI0|O2#grXico1Q) zEvYDIl<Yj5s9^EtOw{e=*~OAlQ2gYtEoB@xD(UfY?&^V;Y<Hmr&(EtkTa>uCkj)*% z3@oPHFmWA?lO_dj2~PQ-t3ZKjsYQWl-xK)4MX8ZVi#A4mlAWDbHNIjm5(_}sRYyU+ zbXQ=^*eyo@n1R^=VWiTE?wl??MtO0ob!U9?=UD9oiVE@)z0!gsOD-kyX+LFAyP<rX zTFuhY*XjU(CVxscI?b+_#JnuTDnqkXvB+3~M~CV}KqZ|q6ZEA~1#>kyZ)#<ELMSFW z$FZdHy$jbPWe`zEVZoh^Kp-f29FK}?5t<ab$EcP{?dU|il^seJzzx(U*r9`|Ak*H% z#nu%~RbB=qcJc$l9DQo4MAN_zP*|a{T9Z0RiOkIGM3R{-y@F#&<JtqZ={B7@2-PNk zx3eQl2nIG&NS19uk)cpR9>5YJ05>3I198vR_=$*s<jnL~l8}v4ZPH=_fj^z8IG0_o zW`Y^bkPU$xikWFR(3-FapV_fBk*hp1p|az;x_UIpxmk6>&{!DGlzKy3X5mA7C-A^f z#_6<H@J63KFD^OCiJ4TpotQ|Ia_%yIgj1L_I4Z<iMWYqz`DmoWvQb-d(5O06jRN7+ zA88n;IG~IkZ3suFz$rO`=tNS4&eXx7oc+8@^-K)<>um~^!4)|lF@AAD;~qQIiB(ln z<<Zdu<k7Wac9kND)TBGRje<>;a&Bg`A8Q2Yw!$c8{OLqdmzFLy;9<}}<3*%6Jp^U2 zeO1V<R-Jkp?W9>dq%2yyiK>p7oN7anwaRM)qbftC1t1eIosgMaG9;q|6QZj@($$nq ztAPUwDmJ8Hx>;2wv@xfRDTXyPDP#QvU9v>egqIFKAqt?;UHW8H5`mQ2u@~S~;az~s z59L|qyvl_$mR+85`Ltwlz?zbL&R<EasY4J^9N{Ol=#>Ay)e&&byc)Pf1CwxRpBdCX zJ|*mgF^LO8YXZc)JXOr7PhKLu6tTQ^<Pi{7soe6;bl?vorUx1m<RuU(^-IJGroMuD z3G#-bfvaqclvFJyhLPuXWu>fQ@_Fp!mxGvc&R)2}s|L1d%#d^lv3x!Jx(Visl2&}t zW=~AMXAkZ%3)L-v<+69plCf+hb_J_$Efos~en@rIL~QlMhBumq6wD9>CZ}fYIgXJ$ z*p>ILHA%H^)|T54PO>#-b08T=wqE%r@?vCsELvsyv{ZI_gCg?)*J<M=Tw)s<P*1;r zDV92fMGlXKqBiN~?vT1=42NQqBPEksMJn}*eXU}xYC{awG7aF0zj#{Ih|k8hLDU@r zaD=>4W3%l1<x+sO24Tw)Hf3_7ycmHL^+w_DC#`}<yU>aQniWpTv__W*Ht@BX^35%0 zD3W!IyO9*cD&sSeF1^^5d#7{bZm_D%MkHd5q^kz!A?L^nN=qOsFeah-$px5V)6k@a z8pp+BOva#+eb7W&fes@?gJLavTAEnoiI0j=O=yxcp&{;0FjZCS?3zsho2Haqn#(iC zy8h%>Q+=MsYomHgwOWR)(NUX?3pMWeD1`}fppi)4BB!=tGnhV3lWMTk$7iN#Uf~>P zEvEF%>)NqRA#r<(7V8qTK?*K9m;7KRQdQPEJvDB?B8B0_l@+%aJD%8P4K_MVG#8As z&_b}99fd7RX57prm>HUTPfh!+gzTZ`rs}nMihiN-r-W?l+KV-B5oUk$ja8r}^P6W) zfILffdY%ZaLa0HW$Y@l9o<&a=)3D@q@L_(-$AKg%R~!_(MX%CKDPo6a5Xm1ov}BUJ zVjn}VOd6D{B-e9h)#ZX=0YJ@uj~9fv7V<yLRoO}fRjRjCXPAHO1|IZ4<jX{ORBB{T zmW@jGIf*A-NvO-ha8M>=X|iFYJe)17oBO0E=$lujSD;2>xC$y$sAXHDc_i@H!Kh~H zv^TDWxoTLz<E1n>A&;Pex3$~xX~VUWKR=C&tmT?0j9MNII*PAl(>fA+dKVCVA1NOt z_&z{%@lI6VC&VU#fZSs9xYDj(lHwBLhGI>m;lN>!w37O3o}JDJ&!dhR`96?zd!>2d zL%{otN$$TA^Rz_pg8UgEdbSFQ5d*Yt&Q<}kwWeyGoP3TA_}X&0r6GCZkbstAMwKd_ z^@&h%apZ0i7lSUAjhQ4PP&Tk+;YAfE#N7=U@F2~K2ijSn{$&uY4X^aQiEyQ0N{x)P z$ibE-olLoL62O>~h%wz|Vqs+uG3qysMJ12K*dz@TCY)Kg31J6$Xi3RSZRn93f*%XF ziw-K5&52TiGm^)25}SSGeex0qE#`mG&Jk@pJXbDR*J^I^b{XtXSlRZPJ>Dy0v}!T9 z{Z4kR3Mf{(jEv#pwtYXjn)&(I_RqjNU<u4|d9&}%{uDl>a(eUN(2k3+Q%Akb1}Adn z%8C@98*65QQGZMj6JTw70v^{+ObEA1LfS`3DAX)uruH*&m7J4JJ%yy6MNuFwDiUSy z<~G3QrDLUiZ<E2*_rP7o8do(g04fZYw0?C&wMP|XvWc=5%afqyNt3YVJhNp3u?*Z5 ze=_en&x|c8lB7nIBqqDBxaSWiMFb!9KNk-ztlQpuIWpnF#|@`6xQihVz+5(&qU3#+ zMy}{Cf2?NTE>$#e^Tjx&y>}2wgV^4M=XE7_!6?gvd~{58{JTLJU4wHv6E*X=<`EFj zD`-v&8S8lI?LNki&dQQ<S67$egPO<(@6IfL(6adDNXU_w%mXZJN_cI&m9at&;+vPy zx*|5af(>|JHvm;|n5{Tb0W%q+(j~==B+^Z|QzB$2Qf;D4N?ou&Ei$_%=X7R5ezqad zADk56R@ox!upb;L*}%ZoK?2s8NCRTEnLz(VLV?U_aAp6|%|DZhJLy}Q(b7iuH{g>f zU|dpRW*bwYC~l<-es7L2EtoPhRoB9AWo{w`JP=x?l$J0pz`0}W)NszryxOJsZys*Y z+}f_}GKYRXyDlB|w~p+V|F}2X-k1B_oA2yTIIuiBdm;tZ(o&6(9?4+r)W!j^NnAL) zlc2@PNPk@DdcwY=<d(2x^3lc=%E1bP6#_!uBs2#PjtyPd0~G;OVPg<P+-^oJWCe7B z<f;(yGC)2z6r<$8$?>z|WMuct0|@Xd2#QIi#@-(bTXLp?96*)_$g>?%?n`SW*6<)o zjUpj9ZpOa~ySKgQtXD`w<GrG_EJfOb@D-RAtm?=$X?BMYZZG!u=LBxTG-v;!wxIVv zO`gdLL^;nJwi2B|t;@m+#?|4VWB<{Y&c%S41a>5YKEnWf6qFnza1BoUw7@8242`m+ z)F(U?JERQvwSD7s-vtNf2p66=0~zGy0iDYq<2{jwwTdoFG(yw$YS8A?KX5CDapJ(G z8q<c3O8{ugdhB7qZM!vfSM5u_PY)ljAPlQRy>AOuB{3x%jBp6Q&$3i8ZXv4DoSK~u zbV{l?el})mH9`t?t>nYFNrxFTDq@7Bxl^L79CBxU*c!|jccy|>Aw(X)LRLk_F@!6{ zfR8iC6cipFppDm_C{KLx%^dP<jS0%c9UG2yLU;=*s|xv?qlCnqwZ6Bma;oqNOE$8R z!f%zb+WEmLc~wb#NZRbM?`8jqv*al=2<myfoY*Md?;zqVbh)1B$nbHeg5ZEq@LN`x zqZ+N_v}p+nxpdYwdSSmPjoqsLn`-t`BVMrXOZsR?7i@JYf#ZFm!exoDgKoh+P-z1a zj_2&M&$>U)bIDf*!}Y^Ze!Z2t2ZF14XLCM0t1U7bw{!|;$MqNUc?N8`aqBKDNwW#g ztf|UqsFf#nz<*N9>!kN|w8F0HBhed0*~ncrTaB00y&vAIK-oPd&*k9_pWGt+-sH)n zqI`qUT%;nQE*puv!w}Q234&8%qoVz&kL&Hq7dCKLR*!q#x>YemNU|rk^Ell#e-CkN zC>kq_QRUfOkeu?$W`=Ul<|Lvq66hub2+u?DE2pLys&e+G%94|ARId`t;ak#?k3$0D zA>QP8=$P1^p`VZGK%DL1Av(~{CtwUY1gs4G<d^c~*KnU(7%%iqZb%C~x|pKuudU#n z@~`y~^Q8VfN^KlQzlgn9J^+90+?o)jN3u6sEyNDYJX(9*6`z3Sr`9bYj;{INexBev ze073cukbf^3#sQlDGcsi&>^%0JV&_j0p!`U@v{~VE|!z_)X|IH`S3$*1^f3!`5mmt zfZuN*iywaASE-r$UeW8cn2oD?n;1^-krmJ0OG_R-C(^5{TKPSO)vbyGO`zY=65pl_ zjZN%^Jx7F%1&FU!Kx9@7Kl%&nVIS~+k7@-eRxNB<Z&o;Tv6K!1=^hU(MSf84*(A}P zTgYbs^)kFpf$uTYi;-Hx1F~A9?<Ld=vs!sx*WwjAoIpeQ!bYF7zYE)-?+F0(pF!Un z0Ih9^uNYu!3F7NExcZWq`aO<*!G9xHe=6(X@BU<`pL57(67_PPj>iu@oq}IWzGi0r z@2O;6UsvV>ey#D(QcAU7N8*c}TKSmH%sakXIk|R$Y=;2gM#w9GQ_!LI%=#hJNLS{< zk!0!`s-%60VePY}3+dFEq-s`GqWI6P{>`mEZY|pUg>3q{q<R{)azCnN0=04*wemcw zWdrpxl3IC5tvsPxxk;@&PwhW2`N$QNTH~w(>6NxxxvpAyO0E1^hhU9kh~^Dc%P6X4 z4fQgoS~;&;`O9d<owM(?TL>0|yl4Rewp^U^d`dlR3<dbhoExcC5%n@C*d%+U^FuLW z+eAt;G;TDad9cp0<oZahd|JC8Y=@xEC6r4>6_tGlwZ>4beAdp$Ix1Yf6Sjd`XQq=B z@#Io?=cG!nj?55NCHO54)jDw_8}jN=M~?eD7j7xOgUNAt)kRUQu>_sGFQ?>KxF;4L zi1~NE(~iU<vr8aN+#7v7s#;`^*6=Q2ugN&_GfiKR_6q(pO}tZRH?Y7R5Qm%EJauhX zPPICrt`iqxij`XYSe6~Zd>6m!ttR6zc#l@B$N7U2KDIi+Sp_Y4iI#=*((PSwiu=K@ zRf11&HP)$I;tIo0rh#0z9fyRf%)wYdzvcq`WwqBT<YF4+L$`pQU6B`zXJ5=M>pAeB zPW^ds8)wsbw)OKu%5!h7q2%TSmn7);N?+%WdjUs<aCi?O^rsryw*)B+k9Zi?SDmeM z*A*OR{B+=Lez(XQbGSHLIJ@zsVVqpD(|Z=iurckCl0Tgt;Zx5d!Q7>^bZil5LNHsx z>M#u&=VWT;%1YyC&@C(Zx+aJ>%;joY<u+if)&-xqKL!om<i|WgCr2y=8oUsxZv#Cp zz{9y`21Fp8VLX!3o-X7Ngmo9eh*y(6rN~5oIxm9DV{A3$8y7;B=q*@4KG^<D3tsa! zrX;Q<&g2_dx3ey93Nja{;?d_K9NiIbu>;NNVqCyl>k&A(Bl=SZYodz-H6oIdP&Qyp zVI$4zSChzCXmkNbhu}k!;K87*T_<5MR68XWmjWdq8*eYr0|%L<n}1)EVR<Yf-!PDI z0w6!w?|F4bkbDUP#E`Nzr~kp*1{mdux>)kuZ4);5lx^2Djp;>z_qbEhn<hX3#z;m0 zk}*tRjSyKSLDNVI><0<kHk;;n$tWSaW=PD|fD+t<V>>aXv2P-iRxdY|f%tc2Vk>}P znrNgqF>k<(%0y(t1a?dcT(OpSTnP&Y(i{7`U@mjXJg@_Co$l<Z`HrDmDkr4C2?Xwl z*X)mV9dF_vF}c@U`D?KsspEb@nRvEicVl7Qf;kxmxc)8N@#mU>ZtjG8FJ^@2eQDZ# z{Ehe11UoLB5CjWW-H@$pre0Pmh8}r}^qj);$}A<#2it}C=F|BtTBRslDEwtI`54a^ z03xZK>c6gwu+wxVtvIu;+0K~3-Ap|Qm;T0_r$u9V?l82b^s3j<BUDD$6?0+RmLXp? zmQe<`71(&88^^}sV<<^s9#?o=i^g#=EE`5eW*uX<Z3{Ej?D~81G6LXPH_f19{#yuv zVM6sLkejjzs3|o-S70MV0qAn#^TZJXA8W)B2eJeG!=3nqT|$BS-Tv}CAl-ze*W`6$ z9@li7Pp4c4&H;SOo&9x@f=_hwr%1gKQtxDR4bB07mb5zgvo2_L@@F1b>E;(6&2Hbk zofB`DH*Xp94_cc#P9k%E!Qa1ej|=gBKdIB+`0T+oR`#3>{ysvZj~}ol(7DULzV%y` z`hA2>Gs1CR-r*J5`#jUtl<kVRSpoJ*LBHP|T70GzDlE~?OqIxFqB{ZK|GD^~$%)eV z+f$0TM7Cf!5KXy;w7|@{0;8c@M-;7QDJ)Te2;<2gbkM@2pT>eQ{Yc}fHElLf#0M>j zk*C7UQUYFQXgk2t=5(KVdYYA<<;KLeH@w}Q)Zszy^c4GVR~EJ=+|ssgRYwn+lUL2@ ztLF4gOZt`-W80dctqHSqw#cM>=NQ8qsHSrrTF>7vO$Q6)qO^>l1+yIL2cQmv^(lCP zSBnyNY|CBw$evWiYgQ=-c?RH&!V3n)ILP=9eBprCOfNF7$9M3IOx!pNS8giTeB6KC zVDfJ=T&mSq=+a!OHqJ}2tk^rvN7*s9n-AeJwwaHj*gHsrVmB~Ki`_W`*0r7dMVUV* zN;Jw%eccm+tY1@Qn<8JhxNtE4wl@x#0hZI5hu>R9ecM5NMDFc~DN2CdtJ_NueRF_u z>KO(Rd276KX@cCoSC<0pqcNq$!VuS%s?n(10BIrKw3c0)xt43PJ;740?@rau2{&&b zu}X%X5HwIORVP7mH5<l^?%^1(RoDXuAFyyv+$-(V2N7Z5Mt$1OVVR7u6d+nN>8Guk zwom{Ktst;2v=SV%n-9B)2FzTmZm4Q$mu-hAd2WT~vt6TnMIzu-Adf!+)+*qv;9WLD zTY#mMHE;<RMla<}Z(&?7n8B5^F`(A%iT2Sds%z(ou&bg>!31~WU))&T&GUSHPv8?r z+~rT}6k@~Rz}2^Y8T;98S%FQ_u<`A{riZ;UUD`8T<=PTwioHTptR?i0o@V?>UGgY@ zr^*(k0mr2CGn(g^{7ol$xAHR}zi@&~PcNNpurew>xt)lfNZhj|Sl|Ok3mp0#A+}AB zW|;FG+;8w<xb>dFbrH@({?Z?N(AyLQpesNPfJl5A>h~1~{3ud?ndmNvS?r&9L%W}$ zD$$aUQ)@kk^;bQUcSq&i@0Uyx)BL7fzN>l3GXJu|9`U>!=~3^yU$TF@zz&6c9_0I) zH6743`(?PR9*KYhURQ(Edji&><Ac9-6V5{uY0h)mf!uM|dY#F<Y_n-~w5>Vq8J_Ga z%=uKMeEo5#JBRM(xrbB6?HCK_LQgpoV1s>@eZWcp-9>c=AC8UmY>RzNFMkVPi;Mzt z)0Dq!p~Jbm#HiyP{Q<AWnW=gSy9&@PguTtV47>V!!?yHh@nOT`(!CeT3OxaC?JPyv zIrVVOXi|_Vczs4BCGwe{V~|<`uQAJIYS6hQ$SSqOGxIqbVlWEdf`#v;7uy;G`z6SG zjqS6}_DQ4X<)dqK_i|u*83d+uN9<F$X2np`RVLS5U|;kc!K)O%ZtC$$trzdJ?%yg1 ztjYcrH_l77^s~9)MsKYSb4%&dWVsQ@#|irY?EX>>@#q#G^#!g<6OSykoBsw|>{O4h zdpiOTS6t=?`U~c=SI-chBS>@(>sh<!_`PffzCt<i_rJJ?70SRANYMZQ{QvojsQ;Td z^MAt0|KPbU*3L>M&i^Ny%<191yz;<o=l1k-%eIF@Lt`vK1RWkMBM4-<3^I=c0wlp6 zsLvll`X$rYz7gX^F|X=nZgpc|2W>;Exb+Mm)51X$+1fh4IkfrJYjd-s>1AGXG5zKH zChm&<7}hs;X4du8d)MQ^{B$}qo#k;bk;dnR1)v%MjKv+fm2(gA%CJ7LZwbbQd9Aol zX<KJ7Kc&wW#1rC9t2?H*#=JhIj}Ocj^aJyW0fK=6^XV}H;0MbDLFLXrf~^c=u|Gfv zJA`2nZ2)Sg%upGC-d2Ti^k<f!;813JxB5^37XH9M_kjvjujat&9<9{93Ry3zPU+zV ztHn-VvyHJmr(v%gaWD(&0nWQA)a_8K{Yw?h&gfsL@NUqp{9P6n?Vt;zJL_N4kKO<7 zr0&haovl}IfEbJANCA~Ee}KSOegyvE(hI{oec&I5go%B2pBU!WXcPaWE{+ky;NAh0 zZ{UWUbv-oiunrkUmZ?2&02oFT(>rq@2nNsa9uv$6W)xGJA>H`CJ~VGcse3?7*;{#J zN!A+%-|U_PlyB~kw_qRLT}V&)J{pXWdn(Xp0*ryRWIv4+W0V~AI}%Lcn+o|GOU^Hc z?Qe4A-afOZ=71gApv5=ZoOhN(Z_%Nf%6D$$p4tO=_hT50Z}DMV#(*5kcLiA6(GrYr z>HZvRJ8&FRksiZ)Noe1oo|Qd1?~t}{(Y{^B6HQPPR`#%2#>U;dykFfR{=59&^8GxP zcI>|K{W+N5L8-r$2YdG%sDEdP=c?Y}b>HPs|BfX6J)MQ7>McL?Q}&h^`TN*EMJ3DV zDu|j7r5rr3{|^UXU<N2F2^cJd2wEwxT#$$hNq(bl9!a4bB0K)xOcklDP#umWl1ya? z7s!Lv!4bND$-Un<p_dj8F66=$)9X&M8N44o^5bAM4l#z9>ijAadifbdXf*B@gjmCc zu)e3Zb{L1rBY~qSKabBM2uP&XOOEczHOGXtBvafG`h5`4nd{DiftRo0<Hv9vhi54x zY?MF&bSp|B4Feu7WkoVjs1F{91~V3I?mbpu5CrxIQBscxi<I(p(HCL)U7x|!ck}hy zg7CXnoL%}0N^}rH>glG0HAL94ob9W~04d_wIm>a>7G~we`fA%G7FqIO=2zW~2*ncq z1KeC-+Aj%leOCI$;Ap=ixpgO;RPX^WD8)4HM(&w7+2o>-bYahK+$ldM9d~nle%HO4 z2MPBP`3K5LCOduQ1tcs~NEEwbBHKiU$@beGDXTMJnML7-?a(KPXJDv!pfH{f%}(wO z8a&!P4e<?`gKrR2g?bT6JR&!nTy*m@$Y+${inbI29rr#{pB+Olj6vSTw}~UH!Wi46 zb->wrv&WF!qJb5OV8E?+5r*rWuT)PO%i``*f@?UWI9a1z7_w%HTQ)dE!se9Il4tas zl5EPf0XMalz|uK>6meCphw0LogXwxemoz0GUK+barRF?7UVC`~J#u)OQBav?jDT9| zCT}~u{P@v5#$J;sA^re9t2#V)(CD99(e6<{1rk=Y(7~xV?2imFu0hqF0o_G312NvZ zF`Wgx$Tyl~7p06ANduqpf(`MKndm^kpCWqpWB7*$XOa>UHq2_NIo1pm4XQ{;IL+CF zkdDSR1r{lrxS!y$%;^i<fr4raJS!&F$vhOquuw!a<Ad=CvZdclBcA~Ri<x_Pg>LZz zFk%<ng9G91Y{G5D!5&VWYvMR@!?bZ7M{Su{ZRHdn6b`wu9B2o(+=o=|BOZ@YuE%J* zN#@;LvuwCV&N27jr0l#XsJyeqZ_f$#)hB(8GA$S1>f?{v@wiNvUYs1a61p<bj0KO) z7v*I!I#d}Wv`^pw=elaDGbUHPSIDQ|o7bj`*(t=vOliB##=ig|i8OnE!m?)VOeuwH z_%Ps_MFk@Wp@2x6m*mgoFKZcp%C&SWpPY6@vsK^2!eZ?AwH26Sa-%O!!&5Zwd)-LR zv06T(^&^d8(-*Rn(u}34B@5C!#3NuNv$HS&or2}6l4{kO#2yl?yV~vM&$|eXyk^}= zPyult!eOjHAHp$boinGy<t4cdMOaz!Bt)47{}dtkq(7Ld!Oi69(Kj((2_}W0Hr4+0 z9V9tNa}1=H?3vq}kJGbV6{8BN;;2?~zBY@`t+=yz&`niwnquyqnuPA-b|qaXP+d%< z>2xryk*c9;v;}Oe9bmqv!I>RMae5>7mJGFhTy@>^;P%4v%^!r_C&Tdt;$Ph(gYkvn zQybROokF(3?fI9vyyJN5hLP_>b8>^lUEPbY7Y(HyNZ|GY>8%`Gb$?rJ|8Q~F4b8n@ zo!yfR9%@taqjPvr$raTbaJIY6<3HW9Mc1q8?gyk8`(b-sU0q4IGU_2hJ1d9|hk#dI z7-m%P5+&tKf(QZ5I-xb!?JaaJZ1tLa)t=ti?4Hib+I_v!>geLqqd~hU%z{Lf9o;K~ zX4FTNhfC^c6QErTMzuf~%0&^OT^UBGR}Q)DQ;KMpN15D{HjbHFmn8REiX_p|Ax*g` zj4;*t`<)MxSGs6J&rueNqPG~95M4Se(5qgoN9b^N1JGZ#!%d+yXriMJJt@mnFOQI_ z*G5TYhz7Mwqo+B&K~<{?7tv+T2h~&b+}sY&`x0B?xl8tSst<iRX*Yg8uDo=rM?qIK zdAj)gjBx5oEZ<XA&o_WlyI7AvJ6n&6aHcS3xmXKr9&wTstQmF1V%rzRJ~`;l3h9WH zWje5)tA}&uZKZIoA|k)TcNY)&9hl&jQbZCI&M$<z;^M037X?<v$}T(83>xA})hmy2 zoG&`i%`Pp(JfS$G&}BM=#PaS=AL0guw#j`KrWv+4%wtD;5J$ALE#Ac>lEJj*d`?|n zVWTV*MyW28M!f{uo+iRzAHc+l6i0c>dZr)dFzO3$=;abuiObmo7(c^yu8)T$2}q9e z=U%0orknB~Kge*d>etZyNn#QqPi>gVS`52TeF`OZu;UAP;V(*SNJ|nk)1x*{aF3wt z97m~#TqAI&X)E|Ai9Haf89%e(gu}hRjG}Cc7DLuf9d%itZ9O-vS{FT)vL1FNdCE<r zCS4GTTMv-W*cEqT!NA91IvnVQsk%f{yD}_WFA29QA1Ympks6mg5Q*ejIwZ$G$HM&u z@LLw4_ma@aj*Wxj?`z}3!hCeBs|k54h}!A?`sj#4(zy;eTW73W8F4xE6uDj*;T2FR z*y$>;0++ik)2c}T0&_h=>%~cAWb{=>_aVwZQpHmXI`FN9f>+4z4g9UD(G&SwrmmaC zDBxh0!clPaN4JH6w7HMZR=8*A*F0L-sDVRvTbe2n-@uO@X^MM5*?2XC@Dr6WKT4pr zrqNk?PqH~WI$S+fQ^<8-_nNhELA-gvs)G(RkYGyyyjwW%q!0VwtgP_g6<3!PFreKS zZ0xX5EF;D{gWwL1QH!+;g-IPp4-YG2a|)#0W-4L>iku8VLiahhi$whlOuf<7C)ybb z5h-K9?aYVhMjAg*?i)fAk6IAIFWcRWZDrAb$vWc3WoL3~Il-A}X)8085p_4kr0MiT zHZ_r2OO}|636HQ_o88Gexlw_lI$Der%ROmQw^SIfMy2hIlVVw764YJppJ*?*k#hp` zP5hWo_!p7T2`z7x4QWnCn2AN6HP_9;fvopZRl$USSbM+VX53_%S){4TzZ+;j2mE0w zoNmLdqOgyW#Qk>m-jL+@w-mrzJY8#1+82|~)J#q1F9uW=CmXbrHl7k7oV|}u(n|dh z7(S0Z=Dw(;aUG3=jox(>r%s?9aT#;ek7V16ax6lk?gYH!bEOeKj8o&MWqQb^OKKd6 zn5R#mXEjT<JWmHhlnT>!GQ8s>hQENf<B(U3!<0XZD5C>igdwvt3hRhL=^BD1U`%xT z®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%0A@lz#KMPfT5GG5Gx@R=C! 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 literal 0 HcmV?d00001 diff --git a/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/migration.py b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/migration.py new file mode 100644 index 00000000000..44b497ae290 --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/migration.py @@ -0,0 +1,657 @@ +# some_file.py +import sys +import definitions +import definitionsVoc +import re +import random +from datetime import datetime +from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria, SearchSubCriteria +import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType + +import java.lang.Class as Class +import java.sql.DriverManager as DriverManager + +## +## Generic Process Method +## +notMigratedEntities = { + "ENTITY_TYPE" : {"ENTITY ID" : {"ERROR" : "TIMES" }} + } + +def addNotMigratedEntity(type, entityID, error): + if type not in notMigratedEntities: + notMigratedEntities[type] = {} + if entityID not in notMigratedEntities[type]: + notMigratedEntities[type][entityID] = {} + if error not in notMigratedEntities[type][entityID]: + notMigratedEntities[type][entityID][error] = 1 + else: + notMigratedEntities[type][entityID][error] += 1 + +def printNotMigratedEntities(): + print "--- Not Migrated Entities Report" + for type in notMigratedEntities: + print "Type: [" + str(type) + "]" + for id in notMigratedEntities[type]: + for error in notMigratedEntities[type][id]: + print "Id: [" + str(id) + "] Error: " + str(error) + " Times: " + str(notMigratedEntities[type][id][error]) + print "---" + +def process(tr): + print "START!" + createDataHierarchy(tr) + for adaptor in adaptors: + print "- ADAPTOR [" + adaptor.__class__.__name__ + "] START" + while adaptor.next(): + entity = adaptor.getEntity() + print "* ENTITY [" + str(entity.getIdentifier(tr)) + "]" + try: + if not entity.isInOpenBIS(tr): + entity.write(tr) + #print entity.getIdentifier(tr) + " - Updated" + else: + addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), "Already in openBIS") + except Exception, error: + addNotMigratedEntity(adaptor.__class__.__name__, entity.getIdentifier(tr), str(error.args)) + #print entity.getIdentifier(tr) + " - Already up to date" + print "- ADAPTOR [" + adaptor.__class__.__name__ + "] FINISH" + print "REPORT START" + printNotMigratedEntities() + definitionsVoc.printCreatedTerms() + print "REPORT FINISH" + print "FINISH!" + +## +## Help Methods +## +def setEntityProperties(tr, definition, entity, properties): + for propertyCode, propertyValue in properties.iteritems(): + propertyDefinition = definitions.getPropertyDefinitionByCode(definition, propertyCode) + if propertyValue is not None: + propertyValue = unicode(propertyValue) + + if propertyDefinition is not None and propertyDefinition[3] == DataType.TIMESTAMP and propertyValue is not None: + date_val = datetime.strptime(propertyValue, "%Y") + propertyValue = datetime.strftime(date_val, "%Y-%m-%d") + + if propertyDefinition is not None and propertyDefinition[3] == DataType.CONTROLLEDVOCABULARY and propertyValue is not None: + possiblePropertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel(propertyDefinition[4], propertyValue) + if possiblePropertyValue is not None: + propertyValue = possiblePropertyValue + else: #We rely on the Add Hock Terms if is None, since there is no API we create a new one + #Create new vocabulary term + codeToUse = re.sub(r'\W+','_',propertyValue) + labelToUse = propertyValue + if len(codeToUse) is 0: + codeToUse = "None" + str(random.random()) + if len(codeToUse) > 60: + codeToUse = codeToUse[:50] + #Uses new vocabulary term + newTerm = definitionsVoc.createVocabularyTerm(tr, propertyDefinition[4], codeToUse, labelToUse) + propertyValue = newTerm.getCode() + print "* WARNING ENTITY [" + entity.getCode() + "]: for Vocabulary [" + propertyDefinition[4] + "], found value not in list: [" + repr(labelToUse) + "]. Created new term with code [" + codeToUse + "]" + + if propertyDefinition is not None: #Sometimes special fields are added for other purposes, these should not be set + entity.setPropertyValue(propertyCode, propertyValue) + +## +## Generic Pattern +## +class EntityAdaptor: + entities = None + entitiesIdx = None + definition = None + + def init(self): + self.entities = [] + self.entitiesIdx = -1 + pass + + def next(self): + if self.entities is None and self.entitiesIdx is None: + self.init() + self.entitiesIdx += 1 + if len(self.entities) > self.entitiesIdx: + return True + else: + return False + + def addEntity(self, values): + self.entities.append(OpenBISDTO(values, self.definition)) + + def getEntity(self): + return self.entities[self.entitiesIdx] + +class OpenBISDTO: + values = {} + definition = None + + def __init__(self, values, definition): + self.values = values + self.definition = definition + + def getIdentifier(self, tr): + pass + + def isInOpenBIS(self, tr): + pass + + def write(self, tr): + pass + +## +## Costumer specific logic: generic part +## +experimentCache = {} +sampleCache = {} +sampleID2Sample = {} + +def getExperimentForUpdate(experimentIdentifier, experimentType, tr): + if experimentIdentifier not in experimentCache: + #print "Cache failed " + experimentIdentifier + ":" + str(experimentType) + experiment = tr.getExperimentForUpdate(experimentIdentifier) + if experiment is None and experimentType is not None: + #print "Cache Create " + experimentIdentifier + ":" + str(experimentType) + experiment = tr.createNewExperiment(experimentIdentifier, experimentType) + if experiment is not None: + experimentCache[experimentIdentifier] = experiment + else: + pass + #print "Cache hit " + experimentIdentifier + ":" + str(experimentType) + if experimentIdentifier not in experimentCache: + return None + else: + return experimentCache[experimentIdentifier] + +def getSampleForUpdate(sampleIdentifier, sampleType, tr): + if sampleIdentifier not in sampleCache: + #print "Cache failed " + sampleIdentifier + ":" + str(sampleType) + sample = tr.getSampleForUpdate(sampleIdentifier) + if sample is None and sampleType is not None: + #print "Cache Create " + sampleIdentifier + ":" + str(sampleType) + if sampleType == "ANTIBODY": + experiment = getExperimentForUpdate("/MATERIALS/REAGENTS/ANTIBODIES", sampleType, tr) + elif sampleType == "CELL": + experiment = getExperimentForUpdate("/MATERIALS/CELL_LINES/CELL_LINE_COLLECTION_1", sampleType, tr) + elif sampleType == "STRAIN": + experiment = getExperimentForUpdate("/MATERIALS/YEASTS/YEAST_COLLECTION", sampleType, tr) + elif sampleType == "PLASMID": + experiment = getExperimentForUpdate("/MATERIALS/PLASMIDS/PLASMID_COLLECTION_1", sampleType, tr) + elif sampleType == "CHEMICAL": + experiment = getExperimentForUpdate("/MATERIALS/REAGENTS/CHEMICALS", sampleType, tr) + elif sampleType == "SIRNA": + experiment = getExperimentForUpdate("/MATERIALS/POLYNUCLEOTIDES/RNA_COLLECTION_1", sampleType, tr) + elif sampleType == "OLIGO": + experiment = getExperimentForUpdate("/MATERIALS/POLYNUCLEOTIDES/OLIGO_COLLECTION_1", sampleType, tr) + sample = tr.createNewSample(sampleIdentifier, sampleType) + sample.setExperiment(experiment) + if sample is not None: + sampleCache[sampleIdentifier] = sample + else: + pass + #print "Cache hit " + sampleIdentifier + ":" + str(sampleType) + + if sampleIdentifier not in sampleCache: + return None + else: + return sampleCache[sampleIdentifier] + +class FileMakerEntityAdaptor(EntityAdaptor): + connection = None + selectQuery = None + + def __init__(self, fileMakerConnString, fileMakerUser, fileMakerPass, db): + Class.forName("com.filemaker.jdbc.Driver").newInstance() + self.connection = DriverManager.getConnection(fileMakerConnString+db,fileMakerUser, fileMakerPass) + + def init(self): + EntityAdaptor.init(self) + + preparedStatement = self.connection.prepareStatement(self.selectQuery) + result = preparedStatement.executeQuery() + + while result.next(): + values = {} + for property in self.definition: + values[property[0]] = result.getString(property[2]) + self.addEntity(values) + result.close() + preparedStatement.close() + +## +## Customer specific logic: different sample types +## +class FMPeterOpenBISDTO(OpenBISDTO): + def isSampleCacheable(self): + return True + + def isInOpenBIS(self, tr): + code = self.getIdentifier(tr) + if (code is not None) and (' ' not in code): + if self.isSampleCacheable(): + sampleID2Sample[self.values["NAME"]] = self.values + sample = getSampleForUpdate("/MATERIALS/"+code, None, tr) + if sample is not None: + lastModificationData = self.values["MODIFICATION_DATE"].strip() + lastModificationData = str(datetime.strptime(lastModificationData, "%Y-%m-%d"))[:10] + lastModificationOpenBIS = sample.getPropertyValue("MODIFICATION_DATE")[:10] + return lastModificationOpenBIS == lastModificationData + else : + return False + else: + print "* ERROR [" + str(code) + "] - Invalid Code found for '" + self.__class__.__name__ + "'" + raise Exception('Invalid Code found ' + str(code)) + +class FMPeterBoxAdaptor(FileMakerEntityAdaptor): + selectBoxQuery = None + entityIdFieldName = None + entityCodeFieldName = None + + def addEntity(self, values): + self.entities.append(FMPeterEntityBoxOpenBISDTO(values, self.definition)) + + def init(self): + #print "Reading boxes for: " + self.__class__.__name__ + emptyBox = 0 + boxes = {} + EntityAdaptor.init(self) + preparedStatement = self.connection.prepareStatement(self.selectBoxQuery) + result = preparedStatement.executeQuery() + while result.next(): + entityId = unicode(result.getString(self.entityIdFieldName)) + if entityId is not None: + if entityId in sampleID2Sample: + antibodyNumber = sampleID2Sample[entityId][self.entityCodeFieldName] + if antibodyNumber is not None: + values = {} + values["STORAGE_NAME"] = result.getString("location") + values["STORAGE_ROW"] = None + values["STORAGE_COLUMN"] = None + values["STORAGE_BOX_NAME"] = result.getString("box label") + values["STORAGE_BOX_SIZE"] = result.getString("box size") + values["STORAGE_USER"] = result.getString("frozen by") + values["STORAGE_BOX_POSITION"] = result.getString("position") + + allBoxes = [] + if antibodyNumber in boxes: + allBoxes = boxes[antibodyNumber] + else: + boxes[antibodyNumber] = allBoxes + allBoxes.append(values) + else: + #The antibody is not there. What the *#%$& + emptyBox += 1 + else: + #The antibody is not there. What the *#%$& + emptyBox += 1 + + print "- ERROR ADAPTOR Boxes positions with empty entityId for " + self.__class__.__name__ + ":" + str(emptyBox) + + for entiyCode, allBoxes in boxes.iteritems(): + self.addEntity({ + "*CODE" : entiyCode, + "*BOXESLIST" : allBoxes + }) + + result.close() + preparedStatement.close() + +class FMPeterEntityBoxOpenBISDTO(OpenBISDTO): + def getIdentifier(self, tr): + return self.values["*CODE"] + + def write(self, tr): + sample = getSampleForUpdate("/MATERIALS/"+self.values["*CODE"], None, tr) + print "* INFO Boxes size: " + str(len(self.values["*BOXESLIST"])) + #Delete old boxes + for boxNum in range(1, definitions.numberOfStorageGroups+1): + for propertyCode in definitions.getStorageGroupPropertyCodes(): + sample.setPropertyValue(propertyCode + "_" + str(boxNum), None) + + #Add new boxes + boxNum = 0 + for box in self.values["*BOXESLIST"]: + boxNum += 1 + for propertyCode, propertyValue in box.iteritems(): + if propertyCode == "STORAGE_NAME": + freezerName = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel("FREEZER", propertyValue) + if freezerName is None: + #print repr("NOT FOUND FEEZER: " + self.values["ANTIBODY_ID_NR"] + " : '" + unicode(propertyValue) + "'") + propertyValue = None + else: + propertyValue = freezerName + if propertyCode == "STORAGE_USER": + storageUser = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel("ALL_LAB_MEMBERS", propertyValue) + if storageUser is None: + #print repr("NOT FOUND USER: " + self.values["ANTIBODY_ID_NR"] + " : '" + unicode(propertyValue) + "'") + propertyValue = None + else: + propertyValue = storageUser + + if propertyValue is not None: + propertyValue = unicode(propertyValue) + sample.setPropertyValue(propertyCode + "_" + str(boxNum), propertyValue) + + def isBoxPressent(self, boxSignature, tr): + sample = getSampleForUpdate("/MATERIALS/"+self.values["*CODE"], None, tr) + if sample is not None: + for boxNum in range(1, definitions.numberOfStorageGroups+1): + storedSignature = ""; + for propertyCode in definitions.getStorageGroupPropertyCodes(): + propertyValue = sample.getPropertyValue(propertyCode + "_" + str(boxNum)) + if propertyValue is not None: + propertyValue = unicode(propertyValue) + storedSignature += propertyValue + if storedSignature == boxSignature: + #print "Found Box " + storedSignature.encode('ascii', 'ignore') + return True + return False + + def isInOpenBIS(self, tr): + for box in self.values["*BOXESLIST"]: + boxSignature = ""; + for propertyCode in definitions.getStorageGroupPropertyCodes(): + propertyValue = box[propertyCode] + if propertyCode == "STORAGE_NAME": + propertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel("FREEZER", propertyValue) + if propertyCode == "STORAGE_USER": + propertyValue = definitionsVoc.getVocabularyTermCodeForVocabularyAndTermLabel("LAB_MEMBERS_INITIALS", propertyValue) + + if propertyValue is not None: + propertyValue = unicode(propertyValue) + boxSignature += propertyValue + if not self.isBoxPressent(boxSignature, tr): + return False + return True +## +## Antibodies +## +class AntibodyAdaptor(FileMakerEntityAdaptor): + def init(self): + self.selectQuery = "SELECT * FROM \"boxit antibodies\"" + self.definition = definitions.antibodyDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + self.entities.append(AntibodyOpenBISDTO(values, self.definition)) + +class AntibodyOpenBISDTO(FMPeterOpenBISDTO): + def write(self, tr): + sample = getSampleForUpdate("/MATERIALS/"+self.values["ANTIBODY_ID_NR"],"ANTIBODY", tr) + setEntityProperties(tr, self.definition, sample, self.values); + + def getIdentifier(self, tr): + return self.values["ANTIBODY_ID_NR"] + +class AntibodyBoxAdaptor(FMPeterBoxAdaptor): + selectBoxQuery = "SELECT * FROM \"antibody boxes\"" + entityIdFieldName = "antibody ID" + entityCodeFieldName = "ANTIBODY_ID_NR" + +## +## Cells +## +class CellAdaptor(FileMakerEntityAdaptor): + + def init(self): + self.selectQuery = "SELECT * FROM \"boxit cells\"" + self.definition = definitions.cellDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + self.entities.append(CellOpenBISDTO(values, self.definition)) + +class CellOpenBISDTO(FMPeterOpenBISDTO): + def write(self, tr): + code = self.values["CELL_ID_NR_COPY"] + if code is not None and code.startswith("c_"): + sample = getSampleForUpdate("/MATERIALS/"+code,"CELL", tr) + setEntityProperties(tr, self.definition, sample, self.values); + + def getIdentifier(self, tr): + code = self.values["CELL_ID_NR_COPY"] + return code + +class CellBoxAdaptor(FMPeterBoxAdaptor): + selectBoxQuery = "SELECT * FROM \"cell boxes\"" + entityIdFieldName = "cell ID" + entityCodeFieldName = "CELL_ID_NR_COPY" + +## +## Strains +## +class StrainAdaptor(FileMakerEntityAdaptor): + + def init(self): + self.selectQuery = "SELECT * FROM \"boxit strains\"" + self.definition = definitions.strainDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + self.entities.append(StrainOpenBISDTO(values, self.definition)) + +class StrainOpenBISDTO(FMPeterOpenBISDTO): + def write(self, tr): + code = self.values["STRAIN_ID_NR"] + if code is not None: + sample = getSampleForUpdate("/MATERIALS/"+code,"STRAIN", tr) + setEntityProperties(tr, self.definition, sample, self.values); + + def getIdentifier(self, tr): + code = self.values["STRAIN_ID_NR"] + return code + +class StrainBoxAdaptor(FMPeterBoxAdaptor): + selectBoxQuery = "SELECT * FROM \"strain boxes\"" + entityIdFieldName = "strain ID" + entityCodeFieldName = "STRAIN_ID_NR" +## +## Plasmids +## +class PlasmidAdaptor(FileMakerEntityAdaptor): + + def init(self): + self.selectQuery = "SELECT * FROM \"boxit plasmids\"" + self.definition = definitions.plasmidDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + self.entities.append(PlasmidOpenBISDTO(values, self.definition)) + +class PlasmidOpenBISDTO(FMPeterOpenBISDTO): + def write(self, tr): + code = self.values["PLASMID_ID_NR"] + if code is not None: + sample = getSampleForUpdate("/MATERIALS/"+code,"PLASMID", tr) + setEntityProperties(tr, self.definition, sample, self.values); + + def getIdentifier(self, tr): + code = self.values["PLASMID_ID_NR"] + return code + +class PlasmidBoxAdaptor(FMPeterBoxAdaptor): + selectBoxQuery = "SELECT * FROM \"plasmid boxes\"" + entityIdFieldName = "plasmid ID" + entityCodeFieldName = "PLASMID_ID_NR" + +## +## Oligos +## +class OligoAdaptor(FileMakerEntityAdaptor): + + def init(self): + self.selectQuery = "SELECT * FROM \"boxit oligos\"" + self.definition = definitions.oligoDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + self.entities.append(OligoOpenBISDTO(values, self.definition)) + +class OligoOpenBISDTO(FMPeterOpenBISDTO): + def write(self, tr): + code = self.values["OLIGO_ID_NR"] + if code is not None: + sample = getSampleForUpdate("/MATERIALS/"+code,"OLIGO", tr) + setEntityProperties(tr, self.definition, sample, self.values); + + def getIdentifier(self, tr): + code = self.values["OLIGO_ID_NR"] + return code + +class OligoBoxAdaptor(FMPeterBoxAdaptor): + selectBoxQuery = "SELECT * FROM \"oligo boxes\"" + entityIdFieldName = "oligo ID" + entityCodeFieldName = "OLIGO_ID_NR" + +## +## Chemical +## +class ChemicalAdaptor(FileMakerEntityAdaptor): + + def init(self): + self.selectQuery = "SELECT * FROM \"Chemicals\"" + self.definition = definitions.chemicalDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + self.entities.append(ChemicalOpenBISDTO(values, self.definition)) + +class ChemicalOpenBISDTO(FMPeterOpenBISDTO): + def isSampleCacheable(self): + return False + + def write(self, tr): + code = "CHEM_" + self.values["RECORD_NUMBER"] + if code is not None: + sample = getSampleForUpdate("/MATERIALS/"+code,"CHEMICAL", tr) + setEntityProperties(tr, self.definition, sample, self.values); + + def getIdentifier(self, tr): + code = "CHEM_" + self.values["RECORD_NUMBER"] + return code + +## +## Sirna +## +class SirnaAdaptor(FileMakerEntityAdaptor): + def init(self): + self.selectQuery = "SELECT * FROM \"siRNA\"" + self.definition = definitions.siRNADefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + self.entities.append(SirnaOpenBISDTO(values, self.definition)) + +class SirnaOpenBISDTO(FMPeterOpenBISDTO): + def isSampleCacheable(self): + return False + + def write(self, tr): + code = "SI_" + self.values["SIRNA_OLIGONUMBER"] + if code is not None: + sample = getSampleForUpdate("/MATERIALS/"+code,"SIRNA", tr) + setEntityProperties(tr, self.definition, sample, self.values); + + def getIdentifier(self, tr): + code = "SI_" +self.values["SIRNA_OLIGONUMBER"] + return code + +## +## Documents +## +class DocumentsAdaptor(FileMakerEntityAdaptor): + + def init(self): + self.selectQuery = "SELECT CAST(file AS VARCHAR(1000)) AS file, info, id_nr, serial, \"date created\", \"date modified\" FROM documents" + self.definition = definitions.documentDefinition + FileMakerEntityAdaptor.init(self) + + def addEntity(self, values): + preparedStatement = self.connection.prepareStatement("SELECT GetAs(file, 'FILE') AS fileData FROM documents WHERE serial = ?"); + preparedStatement.setString(1, values["SERIAL"]); + result = preparedStatement.executeQuery(); + + if result.next(): + fileData = result.getBytes("fileData"); + values["*DATA"] = fileData + + self.entities.append(DocumentOpenBISDTO(values, self.definition)) + +class DocumentOpenBISDTO(OpenBISDTO): + def write(self, tr): + sampleIdentifier = "/MATERIALS/"+self.values["ID_NR"]; + dataSetSample = getSampleForUpdate(sampleIdentifier, None, tr) + if dataSetSample is not None and self.values["*DATA"] is not None and self.values["FILE"] is not None: + print "* INFO DATASET CREATION FOR SERIAL " + self.values["SERIAL"] + " WITH FILE " + self.values["FILE"] + dataSet = tr.createNewDataSet("DOCUMENT") + dataSet.setSample(dataSetSample) + setEntityProperties(tr, self.definition, dataSet, self.values) + absolutePath = tr.createNewFile(dataSet, self.values["FILE"].replace("/", "_")) + f = open(absolutePath, 'wb') + f.write(self.values["*DATA"]) + f.close() + #incoming = tr.getIncoming() + #tr.moveFile(incoming.getAbsolutePath(), dataSet) + else: + if dataSetSample is None: + print "* ERROR No sample found for document" + raise Exception('No sample found for document') + if self.values["*DATA"] is None: + print "* ERROR No Data found for file" + raise Exception('No Data found for file') + if self.values["FILE"] is None: + print "* ERROR No file name found for file" + raise Exception('No file name found for file') + + def getIdentifier(self, tr): + return self.values["SERIAL"] + + def getDocumentBySerial(self, tr, serial): + criteria = SearchCriteria() + criteria.setOperator(criteria.SearchOperator.MATCH_ANY_CLAUSES) + criteria.addMatchClause(criteria.MatchClause.createAttributeMatch(criteria.MatchClauseAttribute.TYPE, "DOCUMENT")) + criteria.addMatchClause(criteria.MatchClause.createPropertyMatch("SERIAL", serial)) + datasets = tr.getSearchService().searchForDataSets(criteria) + if datasets: + return datasets[0] + else: + return None + + def isInOpenBIS(self, tr): + dataset = self.getDocumentBySerial(tr, self.values["SERIAL"]) + return dataset is not None + +#fmConnString = "jdbc:filemaker://127.0.0.1/" +fmConnString = "jdbc:filemaker://fm.ethz.ch/" +fmUser= "designer" +fmPass = "seattle" + +adaptors = [ + AntibodyAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibodies_Peter"), + AntibodyBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_antibody_boxes_Peter"), + PlasmidAdaptor(fmConnString, fmUser, fmPass, "BOXIT_plasmids_Peter"), + PlasmidBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_plasmid_boxes_Peter"), + StrainAdaptor(fmConnString, fmUser, fmPass, "BOXIT_strains_Peter"), + StrainBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_strain_boxes_Peter"), + OligoAdaptor(fmConnString, fmUser, fmPass, "BOXIT_oligos_Peter"), + OligoBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_oligo_boxes_Peter"), + CellAdaptor(fmConnString, fmUser, fmPass, "BOXIT_cells_Peter"), + CellBoxAdaptor(fmConnString, fmUser, fmPass, "BOXIT_cell_boxes_Peter"), + SirnaAdaptor(fmConnString, fmUser, fmPass, "BOXIT_Main_Menu_Peter"), + ChemicalAdaptor(fmConnString, fmUser, fmPass, "BOXIT_Main_Menu_Peter"), + DocumentsAdaptor(fmConnString, fmUser, fmPass, "BOXIT_documents_Peter") + ] + + + +def createDataHierarchy(tr): + inventorySpace = tr.getSpace("MATERIALS") + if inventorySpace == None: + tr.createNewSpace("MATERIALS", None) + tr.createNewProject("/MATERIALS/REAGENTS") + tr.createNewProject("/MATERIALS/CELL_LINES") + tr.createNewProject("/MATERIALS/POLYNUCLEOTIDES") + tr.createNewProject("/MATERIALS/PLASMIDS") + tr.createNewProject("/MATERIALS/YEASTS") + + \ No newline at end of file diff --git a/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/plugin.properties b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/plugin.properties new file mode 100644 index 00000000000..54f2044ddda --- /dev/null +++ b/plasmid/source/core-plugins/petermigration/2/dss/drop-boxes/petermigration/plugin.properties @@ -0,0 +1,9 @@ +## +## Defaults +## +incoming-data-completeness-condition = auto-detection +top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 +storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor +script-path = migration.py +dropbox-name = petermigration +incoming-dir = ${root-dir}/petermigration \ No newline at end of file -- GitLab