001package org.hl7.fhir.r4.model;
002
003/*
004  Copyright (c) 2011+, HL7, Inc.
005  All rights reserved.
006  
007  Redistribution and use in source and binary forms, with or without modification, 
008  are permitted provided that the following conditions are met:
009  
010   * Redistributions of source code must retain the above copyright notice, this 
011     list of conditions and the following disclaimer.
012   * Redistributions in binary form must reproduce the above copyright notice, 
013     this list of conditions and the following disclaimer in the documentation 
014     and/or other materials provided with the distribution.
015   * Neither the name of HL7 nor the names of its contributors may be used to 
016     endorse or promote products derived from this software without specific 
017     prior written permission.
018  
019  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
020  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
021  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
022  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
023  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
024  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
025  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
026  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
027  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
028  POSSIBILITY OF SUCH DAMAGE.
029  
030*/
031
032// Generated on Tue, May 12, 2020 07:26+1000 for FHIR v4.0.1
033import java.util.List;
034
035import org.hl7.fhir.exceptions.FHIRException;
036import org.hl7.fhir.instance.model.api.ICompositeType;
037import org.hl7.fhir.utilities.Utilities;
038
039import ca.uhn.fhir.model.api.annotation.Child;
040import ca.uhn.fhir.model.api.annotation.DatatypeDef;
041import ca.uhn.fhir.model.api.annotation.Description;
042
043/**
044 * A expression that is evaluated in a specified context and returns a value.
045 * The context of use of the expression must specify the context in which the
046 * expression is evaluated, and how the result of the expression is used.
047 */
048@DatatypeDef(name = "Expression")
049public class Expression extends Type implements ICompositeType {
050
051  public enum ExpressionLanguage {
052    /**
053     * Clinical Quality Language.
054     */
055    TEXT_CQL,
056    /**
057     * FHIRPath.
058     */
059    TEXT_FHIRPATH,
060    /**
061     * FHIR's RESTful query syntax - typically independent of base URL.
062     */
063    APPLICATION_XFHIRQUERY,
064    /**
065     * added to help the parsers with the generic types
066     */
067    NULL;
068
069    public static ExpressionLanguage fromCode(String codeString) throws FHIRException {
070      if (codeString == null || "".equals(codeString))
071        return null;
072      if ("text/cql".equals(codeString))
073        return TEXT_CQL;
074      if ("text/fhirpath".equals(codeString))
075        return TEXT_FHIRPATH;
076      if ("application/x-fhir-query".equals(codeString))
077        return APPLICATION_XFHIRQUERY;
078      if (Configuration.isAcceptInvalidEnums())
079        return null;
080      else
081        throw new FHIRException("Unknown ExpressionLanguage code '" + codeString + "'");
082    }
083
084    public String toCode() {
085      switch (this) {
086      case TEXT_CQL:
087        return "text/cql";
088      case TEXT_FHIRPATH:
089        return "text/fhirpath";
090      case APPLICATION_XFHIRQUERY:
091        return "application/x-fhir-query";
092      case NULL:
093        return null;
094      default:
095        return "?";
096      }
097    }
098
099    public String getSystem() {
100      switch (this) {
101      case TEXT_CQL:
102        return "http://hl7.org/fhir/expression-language";
103      case TEXT_FHIRPATH:
104        return "http://hl7.org/fhir/expression-language";
105      case APPLICATION_XFHIRQUERY:
106        return "http://hl7.org/fhir/expression-language";
107      case NULL:
108        return null;
109      default:
110        return "?";
111      }
112    }
113
114    public String getDefinition() {
115      switch (this) {
116      case TEXT_CQL:
117        return "Clinical Quality Language.";
118      case TEXT_FHIRPATH:
119        return "FHIRPath.";
120      case APPLICATION_XFHIRQUERY:
121        return "FHIR's RESTful query syntax - typically independent of base URL.";
122      case NULL:
123        return null;
124      default:
125        return "?";
126      }
127    }
128
129    public String getDisplay() {
130      switch (this) {
131      case TEXT_CQL:
132        return "CQL";
133      case TEXT_FHIRPATH:
134        return "FHIRPath";
135      case APPLICATION_XFHIRQUERY:
136        return "FHIR Query";
137      case NULL:
138        return null;
139      default:
140        return "?";
141      }
142    }
143  }
144
145  public static class ExpressionLanguageEnumFactory implements EnumFactory<ExpressionLanguage> {
146    public ExpressionLanguage fromCode(String codeString) throws IllegalArgumentException {
147      if (codeString == null || "".equals(codeString))
148        if (codeString == null || "".equals(codeString))
149          return null;
150      if ("text/cql".equals(codeString))
151        return ExpressionLanguage.TEXT_CQL;
152      if ("text/fhirpath".equals(codeString))
153        return ExpressionLanguage.TEXT_FHIRPATH;
154      if ("application/x-fhir-query".equals(codeString))
155        return ExpressionLanguage.APPLICATION_XFHIRQUERY;
156      throw new IllegalArgumentException("Unknown ExpressionLanguage code '" + codeString + "'");
157    }
158
159    public Enumeration<ExpressionLanguage> fromType(PrimitiveType<?> code) throws FHIRException {
160      if (code == null)
161        return null;
162      if (code.isEmpty())
163        return new Enumeration<ExpressionLanguage>(this, ExpressionLanguage.NULL, code);
164      String codeString = code.asStringValue();
165      if (codeString == null || "".equals(codeString))
166        return new Enumeration<ExpressionLanguage>(this, ExpressionLanguage.NULL, code);
167      if ("text/cql".equals(codeString))
168        return new Enumeration<ExpressionLanguage>(this, ExpressionLanguage.TEXT_CQL, code);
169      if ("text/fhirpath".equals(codeString))
170        return new Enumeration<ExpressionLanguage>(this, ExpressionLanguage.TEXT_FHIRPATH, code);
171      if ("application/x-fhir-query".equals(codeString))
172        return new Enumeration<ExpressionLanguage>(this, ExpressionLanguage.APPLICATION_XFHIRQUERY, code);
173      throw new FHIRException("Unknown ExpressionLanguage code '" + codeString + "'");
174    }
175
176    public String toCode(ExpressionLanguage code) {
177      if (code == ExpressionLanguage.TEXT_CQL)
178        return "text/cql";
179      if (code == ExpressionLanguage.TEXT_FHIRPATH)
180        return "text/fhirpath";
181      if (code == ExpressionLanguage.APPLICATION_XFHIRQUERY)
182        return "application/x-fhir-query";
183      return "?";
184    }
185
186    public String toSystem(ExpressionLanguage code) {
187      return code.getSystem();
188    }
189  }
190
191  /**
192   * A brief, natural language description of the condition that effectively
193   * communicates the intended semantics.
194   */
195  @Child(name = "description", type = {
196      StringType.class }, order = 0, min = 0, max = 1, modifier = false, summary = true)
197  @Description(shortDefinition = "Natural language description of the condition", formalDefinition = "A brief, natural language description of the condition that effectively communicates the intended semantics.")
198  protected StringType description;
199
200  /**
201   * A short name assigned to the expression to allow for multiple reuse of the
202   * expression in the context where it is defined.
203   */
204  @Child(name = "name", type = { IdType.class }, order = 1, min = 0, max = 1, modifier = false, summary = true)
205  @Description(shortDefinition = "Short name assigned to expression for reuse", formalDefinition = "A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.")
206  protected IdType name;
207
208  /**
209   * The media type of the language for the expression.
210   */
211  @Child(name = "language", type = { CodeType.class }, order = 2, min = 1, max = 1, modifier = false, summary = true)
212  @Description(shortDefinition = "text/cql | text/fhirpath | application/x-fhir-query | etc.", formalDefinition = "The media type of the language for the expression.")
213  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/expression-language")
214  protected CodeType language;
215
216  /**
217   * An expression in the specified language that returns a value.
218   */
219  @Child(name = "expression", type = {
220      StringType.class }, order = 3, min = 0, max = 1, modifier = false, summary = true)
221  @Description(shortDefinition = "Expression in specified language", formalDefinition = "An expression in the specified language that returns a value.")
222  protected StringType expression;
223
224  /**
225   * A URI that defines where the expression is found.
226   */
227  @Child(name = "reference", type = { UriType.class }, order = 4, min = 0, max = 1, modifier = false, summary = true)
228  @Description(shortDefinition = "Where the expression is found", formalDefinition = "A URI that defines where the expression is found.")
229  protected UriType reference;
230
231  private static final long serialVersionUID = -941986742L;
232
233  /**
234   * Constructor
235   */
236  public Expression() {
237    super();
238  }
239
240  /**
241   * Constructor
242   */
243  public Expression(CodeType language) {
244    super();
245    this.language = language;
246  }
247
248  /**
249   * @return {@link #description} (A brief, natural language description of the
250   *         condition that effectively communicates the intended semantics.).
251   *         This is the underlying object with id, value and extensions. The
252   *         accessor "getDescription" gives direct access to the value
253   */
254  public StringType getDescriptionElement() {
255    if (this.description == null)
256      if (Configuration.errorOnAutoCreate())
257        throw new Error("Attempt to auto-create Expression.description");
258      else if (Configuration.doAutoCreate())
259        this.description = new StringType(); // bb
260    return this.description;
261  }
262
263  public boolean hasDescriptionElement() {
264    return this.description != null && !this.description.isEmpty();
265  }
266
267  public boolean hasDescription() {
268    return this.description != null && !this.description.isEmpty();
269  }
270
271  /**
272   * @param value {@link #description} (A brief, natural language description of
273   *              the condition that effectively communicates the intended
274   *              semantics.). This is the underlying object with id, value and
275   *              extensions. The accessor "getDescription" gives direct access to
276   *              the value
277   */
278  public Expression setDescriptionElement(StringType value) {
279    this.description = value;
280    return this;
281  }
282
283  /**
284   * @return A brief, natural language description of the condition that
285   *         effectively communicates the intended semantics.
286   */
287  public String getDescription() {
288    return this.description == null ? null : this.description.getValue();
289  }
290
291  /**
292   * @param value A brief, natural language description of the condition that
293   *              effectively communicates the intended semantics.
294   */
295  public Expression setDescription(String value) {
296    if (Utilities.noString(value))
297      this.description = null;
298    else {
299      if (this.description == null)
300        this.description = new StringType();
301      this.description.setValue(value);
302    }
303    return this;
304  }
305
306  /**
307   * @return {@link #name} (A short name assigned to the expression to allow for
308   *         multiple reuse of the expression in the context where it is
309   *         defined.). This is the underlying object with id, value and
310   *         extensions. The accessor "getName" gives direct access to the value
311   */
312  public IdType getNameElement() {
313    if (this.name == null)
314      if (Configuration.errorOnAutoCreate())
315        throw new Error("Attempt to auto-create Expression.name");
316      else if (Configuration.doAutoCreate())
317        this.name = new IdType(); // bb
318    return this.name;
319  }
320
321  public boolean hasNameElement() {
322    return this.name != null && !this.name.isEmpty();
323  }
324
325  public boolean hasName() {
326    return this.name != null && !this.name.isEmpty();
327  }
328
329  /**
330   * @param value {@link #name} (A short name assigned to the expression to allow
331   *              for multiple reuse of the expression in the context where it is
332   *              defined.). This is the underlying object with id, value and
333   *              extensions. The accessor "getName" gives direct access to the
334   *              value
335   */
336  public Expression setNameElement(IdType value) {
337    this.name = value;
338    return this;
339  }
340
341  /**
342   * @return A short name assigned to the expression to allow for multiple reuse
343   *         of the expression in the context where it is defined.
344   */
345  public String getName() {
346    return this.name == null ? null : this.name.getValue();
347  }
348
349  /**
350   * @param value A short name assigned to the expression to allow for multiple
351   *              reuse of the expression in the context where it is defined.
352   */
353  public Expression setName(String value) {
354    if (Utilities.noString(value))
355      this.name = null;
356    else {
357      if (this.name == null)
358        this.name = new IdType();
359      this.name.setValue(value);
360    }
361    return this;
362  }
363
364  /**
365   * @return {@link #language} (The media type of the language for the
366   *         expression.). This is the underlying object with id, value and
367   *         extensions. The accessor "getLanguage" gives direct access to the
368   *         value
369   */
370  public CodeType getLanguageElement() {
371    if (this.language == null)
372      if (Configuration.errorOnAutoCreate())
373        throw new Error("Attempt to auto-create Expression.language");
374      else if (Configuration.doAutoCreate())
375        this.language = new CodeType(); // bb
376    return this.language;
377  }
378
379  public boolean hasLanguageElement() {
380    return this.language != null && !this.language.isEmpty();
381  }
382
383  public boolean hasLanguage() {
384    return this.language != null && !this.language.isEmpty();
385  }
386
387  /**
388   * @param value {@link #language} (The media type of the language for the
389   *              expression.). This is the underlying object with id, value and
390   *              extensions. The accessor "getLanguage" gives direct access to
391   *              the value
392   */
393  public Expression setLanguageElement(CodeType value) {
394    this.language = value;
395    return this;
396  }
397
398  /**
399   * @return The media type of the language for the expression.
400   */
401  public String getLanguage() {
402    return this.language == null ? null : this.language.getValue();
403  }
404
405  /**
406   * @param value The media type of the language for the expression.
407   */
408  public Expression setLanguage(String value) {
409    if (this.language == null)
410      this.language = new CodeType();
411    this.language.setValue(value);
412    return this;
413  }
414
415  /**
416   * @return {@link #expression} (An expression in the specified language that
417   *         returns a value.). This is the underlying object with id, value and
418   *         extensions. The accessor "getExpression" gives direct access to the
419   *         value
420   */
421  public StringType getExpressionElement() {
422    if (this.expression == null)
423      if (Configuration.errorOnAutoCreate())
424        throw new Error("Attempt to auto-create Expression.expression");
425      else if (Configuration.doAutoCreate())
426        this.expression = new StringType(); // bb
427    return this.expression;
428  }
429
430  public boolean hasExpressionElement() {
431    return this.expression != null && !this.expression.isEmpty();
432  }
433
434  public boolean hasExpression() {
435    return this.expression != null && !this.expression.isEmpty();
436  }
437
438  /**
439   * @param value {@link #expression} (An expression in the specified language
440   *              that returns a value.). This is the underlying object with id,
441   *              value and extensions. The accessor "getExpression" gives direct
442   *              access to the value
443   */
444  public Expression setExpressionElement(StringType value) {
445    this.expression = value;
446    return this;
447  }
448
449  /**
450   * @return An expression in the specified language that returns a value.
451   */
452  public String getExpression() {
453    return this.expression == null ? null : this.expression.getValue();
454  }
455
456  /**
457   * @param value An expression in the specified language that returns a value.
458   */
459  public Expression setExpression(String value) {
460    if (Utilities.noString(value))
461      this.expression = null;
462    else {
463      if (this.expression == null)
464        this.expression = new StringType();
465      this.expression.setValue(value);
466    }
467    return this;
468  }
469
470  /**
471   * @return {@link #reference} (A URI that defines where the expression is
472   *         found.). This is the underlying object with id, value and extensions.
473   *         The accessor "getReference" gives direct access to the value
474   */
475  public UriType getReferenceElement() {
476    if (this.reference == null)
477      if (Configuration.errorOnAutoCreate())
478        throw new Error("Attempt to auto-create Expression.reference");
479      else if (Configuration.doAutoCreate())
480        this.reference = new UriType(); // bb
481    return this.reference;
482  }
483
484  public boolean hasReferenceElement() {
485    return this.reference != null && !this.reference.isEmpty();
486  }
487
488  public boolean hasReference() {
489    return this.reference != null && !this.reference.isEmpty();
490  }
491
492  /**
493   * @param value {@link #reference} (A URI that defines where the expression is
494   *              found.). This is the underlying object with id, value and
495   *              extensions. The accessor "getReference" gives direct access to
496   *              the value
497   */
498  public Expression setReferenceElement(UriType value) {
499    this.reference = value;
500    return this;
501  }
502
503  /**
504   * @return A URI that defines where the expression is found.
505   */
506  public String getReference() {
507    return this.reference == null ? null : this.reference.getValue();
508  }
509
510  /**
511   * @param value A URI that defines where the expression is found.
512   */
513  public Expression setReference(String value) {
514    if (Utilities.noString(value))
515      this.reference = null;
516    else {
517      if (this.reference == null)
518        this.reference = new UriType();
519      this.reference.setValue(value);
520    }
521    return this;
522  }
523
524  protected void listChildren(List<Property> children) {
525    super.listChildren(children);
526    children.add(new Property("description", "string",
527        "A brief, natural language description of the condition that effectively communicates the intended semantics.",
528        0, 1, description));
529    children.add(new Property("name", "id",
530        "A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.",
531        0, 1, name));
532    children
533        .add(new Property("language", "code", "The media type of the language for the expression.", 0, 1, language));
534    children.add(new Property("expression", "string", "An expression in the specified language that returns a value.",
535        0, 1, expression));
536    children
537        .add(new Property("reference", "uri", "A URI that defines where the expression is found.", 0, 1, reference));
538  }
539
540  @Override
541  public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
542    switch (_hash) {
543    case -1724546052:
544      /* description */ return new Property("description", "string",
545          "A brief, natural language description of the condition that effectively communicates the intended semantics.",
546          0, 1, description);
547    case 3373707:
548      /* name */ return new Property("name", "id",
549          "A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.",
550          0, 1, name);
551    case -1613589672:
552      /* language */ return new Property("language", "code", "The media type of the language for the expression.", 0, 1,
553          language);
554    case -1795452264:
555      /* expression */ return new Property("expression", "string",
556          "An expression in the specified language that returns a value.", 0, 1, expression);
557    case -925155509:
558      /* reference */ return new Property("reference", "uri", "A URI that defines where the expression is found.", 0, 1,
559          reference);
560    default:
561      return super.getNamedProperty(_hash, _name, _checkValid);
562    }
563
564  }
565
566  @Override
567  public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
568    switch (hash) {
569    case -1724546052:
570      /* description */ return this.description == null ? new Base[0] : new Base[] { this.description }; // StringType
571    case 3373707:
572      /* name */ return this.name == null ? new Base[0] : new Base[] { this.name }; // IdType
573    case -1613589672:
574      /* language */ return this.language == null ? new Base[0] : new Base[] { this.language }; // Enumeration<ExpressionLanguage>
575    case -1795452264:
576      /* expression */ return this.expression == null ? new Base[0] : new Base[] { this.expression }; // StringType
577    case -925155509:
578      /* reference */ return this.reference == null ? new Base[0] : new Base[] { this.reference }; // UriType
579    default:
580      return super.getProperty(hash, name, checkValid);
581    }
582
583  }
584
585  @Override
586  public Base setProperty(int hash, String name, Base value) throws FHIRException {
587    switch (hash) {
588    case -1724546052: // description
589      this.description = castToString(value); // StringType
590      return value;
591    case 3373707: // name
592      this.name = castToId(value); // IdType
593      return value;
594    case -1613589672: // language
595      this.language = castToCode(value); // Enumeration<ExpressionLanguage>
596      return value;
597    case -1795452264: // expression
598      this.expression = castToString(value); // StringType
599      return value;
600    case -925155509: // reference
601      this.reference = castToUri(value); // UriType
602      return value;
603    default:
604      return super.setProperty(hash, name, value);
605    }
606
607  }
608
609  @Override
610  public Base setProperty(String name, Base value) throws FHIRException {
611    if (name.equals("description")) {
612      this.description = castToString(value); // StringType
613    } else if (name.equals("name")) {
614      this.name = castToId(value); // IdType
615    } else if (name.equals("language")) {
616      this.language = castToCode(value); // Enumeration<ExpressionLanguage>
617    } else if (name.equals("expression")) {
618      this.expression = castToString(value); // StringType
619    } else if (name.equals("reference")) {
620      this.reference = castToUri(value); // UriType
621    } else
622      return super.setProperty(name, value);
623    return value;
624  }
625
626  @Override
627  public Base makeProperty(int hash, String name) throws FHIRException {
628    switch (hash) {
629    case -1724546052:
630      return getDescriptionElement();
631    case 3373707:
632      return getNameElement();
633    case -1613589672:
634      return getLanguageElement();
635    case -1795452264:
636      return getExpressionElement();
637    case -925155509:
638      return getReferenceElement();
639    default:
640      return super.makeProperty(hash, name);
641    }
642
643  }
644
645  @Override
646  public String[] getTypesForProperty(int hash, String name) throws FHIRException {
647    switch (hash) {
648    case -1724546052:
649      /* description */ return new String[] { "string" };
650    case 3373707:
651      /* name */ return new String[] { "id" };
652    case -1613589672:
653      /* language */ return new String[] { "code" };
654    case -1795452264:
655      /* expression */ return new String[] { "string" };
656    case -925155509:
657      /* reference */ return new String[] { "uri" };
658    default:
659      return super.getTypesForProperty(hash, name);
660    }
661
662  }
663
664  @Override
665  public Base addChild(String name) throws FHIRException {
666    if (name.equals("description")) {
667      throw new FHIRException("Cannot call addChild on a singleton property Expression.description");
668    } else if (name.equals("name")) {
669      throw new FHIRException("Cannot call addChild on a singleton property Expression.name");
670    } else if (name.equals("language")) {
671      throw new FHIRException("Cannot call addChild on a singleton property Expression.language");
672    } else if (name.equals("expression")) {
673      throw new FHIRException("Cannot call addChild on a singleton property Expression.expression");
674    } else if (name.equals("reference")) {
675      throw new FHIRException("Cannot call addChild on a singleton property Expression.reference");
676    } else
677      return super.addChild(name);
678  }
679
680  public String fhirType() {
681    return "Expression";
682
683  }
684
685  public Expression copy() {
686    Expression dst = new Expression();
687    copyValues(dst);
688    return dst;
689  }
690
691  public void copyValues(Expression dst) {
692    super.copyValues(dst);
693    dst.description = description == null ? null : description.copy();
694    dst.name = name == null ? null : name.copy();
695    dst.language = language == null ? null : language.copy();
696    dst.expression = expression == null ? null : expression.copy();
697    dst.reference = reference == null ? null : reference.copy();
698  }
699
700  protected Expression typedCopy() {
701    return copy();
702  }
703
704  @Override
705  public boolean equalsDeep(Base other_) {
706    if (!super.equalsDeep(other_))
707      return false;
708    if (!(other_ instanceof Expression))
709      return false;
710    Expression o = (Expression) other_;
711    return compareDeep(description, o.description, true) && compareDeep(name, o.name, true)
712        && compareDeep(language, o.language, true) && compareDeep(expression, o.expression, true)
713        && compareDeep(reference, o.reference, true);
714  }
715
716  @Override
717  public boolean equalsShallow(Base other_) {
718    if (!super.equalsShallow(other_))
719      return false;
720    if (!(other_ instanceof Expression))
721      return false;
722    Expression o = (Expression) other_;
723    return compareValues(description, o.description, true) && compareValues(name, o.name, true)
724        && compareValues(language, o.language, true) && compareValues(expression, o.expression, true)
725        && compareValues(reference, o.reference, true);
726  }
727
728  public boolean isEmpty() {
729    return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(description, name, language, expression, reference);
730  }
731
732}