# Code generated by jtd-codegen for Ruby v0.1.1

require 'json'
require 'time'

module SenzingTypedef

  class Senzingsdk
    attr_accessor :value

    def self.from_json_data(data)
      out = Senzingsdk.new
      out.value = SenzingTypedef.from_json_data(Object, data)
      out
    end

    def to_json_data
      SenzingTypedef.to_json_data(value)
    end
  end

  class AdditionalScores
    attr_accessor :full_score
    attr_accessor :generation_match
    attr_accessor :gnr_fn
    attr_accessor :gnr_gn
    attr_accessor :gnr_on
    attr_accessor :gnr_sn

    def self.from_json_data(data)
      out = AdditionalScores.new
      out.full_score = SenzingTypedef::from_json_data(Integer, data["FULL_SCORE"])
      out.generation_match = SenzingTypedef::from_json_data(Integer, data["GENERATION_MATCH"])
      out.gnr_fn = SenzingTypedef::from_json_data(Integer, data["GNR_FN"])
      out.gnr_gn = SenzingTypedef::from_json_data(Integer, data["GNR_GN"])
      out.gnr_on = SenzingTypedef::from_json_data(Integer, data["GNR_ON"])
      out.gnr_sn = SenzingTypedef::from_json_data(Integer, data["GNR_SN"])
      out
    end

    def to_json_data
      data = {}
      data["FULL_SCORE"] = SenzingTypedef::to_json_data(full_score)
      data["GENERATION_MATCH"] = SenzingTypedef::to_json_data(generation_match)
      data["GNR_FN"] = SenzingTypedef::to_json_data(gnr_fn)
      data["GNR_GN"] = SenzingTypedef::to_json_data(gnr_gn)
      data["GNR_ON"] = SenzingTypedef::to_json_data(gnr_on)
      data["GNR_SN"] = SenzingTypedef::to_json_data(gnr_sn)
      data
    end
  end

  class AffectedEntity
    # The ENTITY_ID is the Senzing-generated identifier for the discovered
    # entity. It may change when new information is added.
    attr_accessor :entity_id

    def self.from_json_data(data)
      out = AffectedEntity.new
      out.entity_id = SenzingTypedef::from_json_data(Integer, data["ENTITY_ID"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITY_ID"] = SenzingTypedef::to_json_data(entity_id)
      data
    end
  end

  class CfgAttr
    attr_accessor :attr_class
    attr_accessor :attr_code
    attr_accessor :attr_id
    attr_accessor :default_value
    attr_accessor :felem_code
    attr_accessor :felem_req
    attr_accessor :ftype_code
    attr_accessor :internal
    attr_accessor :xxx_advanced

    def self.from_json_data(data)
      out = CfgAttr.new
      out.attr_class = SenzingTypedef::from_json_data(String, data["ATTR_CLASS"])
      out.attr_code = SenzingTypedef::from_json_data(String, data["ATTR_CODE"])
      out.attr_id = SenzingTypedef::from_json_data(Integer, data["ATTR_ID"])
      out.default_value = SenzingTypedef::from_json_data(String, data["DEFAULT_VALUE"])
      out.felem_code = SenzingTypedef::from_json_data(String, data["FELEM_CODE"])
      out.felem_req = SenzingTypedef::from_json_data(String, data["FELEM_REQ"])
      out.ftype_code = SenzingTypedef::from_json_data(String, data["FTYPE_CODE"])
      out.internal = SenzingTypedef::from_json_data(String, data["INTERNAL"])
      out.xxx_advanced = SenzingTypedef::from_json_data(String, data["XXX_ADVANCED"])
      out
    end

    def to_json_data
      data = {}
      data["ATTR_CLASS"] = SenzingTypedef::to_json_data(attr_class)
      data["ATTR_CODE"] = SenzingTypedef::to_json_data(attr_code)
      data["ATTR_ID"] = SenzingTypedef::to_json_data(attr_id)
      data["DEFAULT_VALUE"] = SenzingTypedef::to_json_data(default_value)
      data["FELEM_CODE"] = SenzingTypedef::to_json_data(felem_code)
      data["FELEM_REQ"] = SenzingTypedef::to_json_data(felem_req)
      data["FTYPE_CODE"] = SenzingTypedef::to_json_data(ftype_code)
      data["INTERNAL"] = SenzingTypedef::to_json_data(internal)
      data["XXX_ADVANCED"] = SenzingTypedef::to_json_data(xxx_advanced)
      data
    end
  end

  class CfgCfbom
    attr_accessor :cfcall_id
    attr_accessor :exec_order
    attr_accessor :felem_id
    attr_accessor :ftype_id

    def self.from_json_data(data)
      out = CfgCfbom.new
      out.cfcall_id = SenzingTypedef::from_json_data(Integer, data["CFCALL_ID"])
      out.exec_order = SenzingTypedef::from_json_data(Integer, data["EXEC_ORDER"])
      out.felem_id = SenzingTypedef::from_json_data(Integer, data["FELEM_ID"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out
    end

    def to_json_data
      data = {}
      data["CFCALL_ID"] = SenzingTypedef::to_json_data(cfcall_id)
      data["EXEC_ORDER"] = SenzingTypedef::to_json_data(exec_order)
      data["FELEM_ID"] = SenzingTypedef::to_json_data(felem_id)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data
    end
  end

  class CfgCfcall
    attr_accessor :cfcall_id
    attr_accessor :cfunc_id
    attr_accessor :ftype_id
    attr_accessor :xxx_exec_order

    def self.from_json_data(data)
      out = CfgCfcall.new
      out.cfcall_id = SenzingTypedef::from_json_data(Integer, data["CFCALL_ID"])
      out.cfunc_id = SenzingTypedef::from_json_data(Integer, data["CFUNC_ID"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.xxx_exec_order = SenzingTypedef::from_json_data(Integer, data["XXX_EXEC_ORDER"])
      out
    end

    def to_json_data
      data = {}
      data["CFCALL_ID"] = SenzingTypedef::to_json_data(cfcall_id)
      data["CFUNC_ID"] = SenzingTypedef::to_json_data(cfunc_id)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["XXX_EXEC_ORDER"] = SenzingTypedef::to_json_data(xxx_exec_order)
      data
    end
  end

  class CfgCfrtn
    attr_accessor :cfrtn_id
    attr_accessor :cfunc_id
    attr_accessor :cfunc_rtnval
    attr_accessor :close_score
    attr_accessor :exec_order
    attr_accessor :ftype_id
    attr_accessor :likely_score
    attr_accessor :plausible_score
    attr_accessor :same_score
    attr_accessor :un_likely_score

    def self.from_json_data(data)
      out = CfgCfrtn.new
      out.cfrtn_id = SenzingTypedef::from_json_data(Integer, data["CFRTN_ID"])
      out.cfunc_id = SenzingTypedef::from_json_data(Integer, data["CFUNC_ID"])
      out.cfunc_rtnval = SenzingTypedef::from_json_data(String, data["CFUNC_RTNVAL"])
      out.close_score = SenzingTypedef::from_json_data(Integer, data["CLOSE_SCORE"])
      out.exec_order = SenzingTypedef::from_json_data(Integer, data["EXEC_ORDER"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.likely_score = SenzingTypedef::from_json_data(Integer, data["LIKELY_SCORE"])
      out.plausible_score = SenzingTypedef::from_json_data(Integer, data["PLAUSIBLE_SCORE"])
      out.same_score = SenzingTypedef::from_json_data(Integer, data["SAME_SCORE"])
      out.un_likely_score = SenzingTypedef::from_json_data(Integer, data["UN_LIKELY_SCORE"])
      out
    end

    def to_json_data
      data = {}
      data["CFRTN_ID"] = SenzingTypedef::to_json_data(cfrtn_id)
      data["CFUNC_ID"] = SenzingTypedef::to_json_data(cfunc_id)
      data["CFUNC_RTNVAL"] = SenzingTypedef::to_json_data(cfunc_rtnval)
      data["CLOSE_SCORE"] = SenzingTypedef::to_json_data(close_score)
      data["EXEC_ORDER"] = SenzingTypedef::to_json_data(exec_order)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["LIKELY_SCORE"] = SenzingTypedef::to_json_data(likely_score)
      data["PLAUSIBLE_SCORE"] = SenzingTypedef::to_json_data(plausible_score)
      data["SAME_SCORE"] = SenzingTypedef::to_json_data(same_score)
      data["UN_LIKELY_SCORE"] = SenzingTypedef::to_json_data(un_likely_score)
      data
    end
  end

  class CfgCfunc
    attr_accessor :anon_support
    attr_accessor :cfunc_code
    attr_accessor :cfunc_desc
    attr_accessor :cfunc_id
    attr_accessor :connect_str
    attr_accessor :xxx_func_lib
    attr_accessor :xxx_func_ver
    attr_accessor :xxx_java_class_name
    attr_accessor :xxx_language

    def self.from_json_data(data)
      out = CfgCfunc.new
      out.anon_support = SenzingTypedef::from_json_data(String, data["ANON_SUPPORT"])
      out.cfunc_code = SenzingTypedef::from_json_data(String, data["CFUNC_CODE"])
      out.cfunc_desc = SenzingTypedef::from_json_data(String, data["CFUNC_DESC"])
      out.cfunc_id = SenzingTypedef::from_json_data(Integer, data["CFUNC_ID"])
      out.connect_str = SenzingTypedef::from_json_data(String, data["CONNECT_STR"])
      out.xxx_func_lib = SenzingTypedef::from_json_data(String, data["XXX_FUNC_LIB"])
      out.xxx_func_ver = SenzingTypedef::from_json_data(String, data["XXX_FUNC_VER"])
      out.xxx_java_class_name = SenzingTypedef::from_json_data(String, data["XXX_JAVA_CLASS_NAME"])
      out.xxx_language = SenzingTypedef::from_json_data(String, data["XXX_LANGUAGE"])
      out
    end

    def to_json_data
      data = {}
      data["ANON_SUPPORT"] = SenzingTypedef::to_json_data(anon_support)
      data["CFUNC_CODE"] = SenzingTypedef::to_json_data(cfunc_code)
      data["CFUNC_DESC"] = SenzingTypedef::to_json_data(cfunc_desc)
      data["CFUNC_ID"] = SenzingTypedef::to_json_data(cfunc_id)
      data["CONNECT_STR"] = SenzingTypedef::to_json_data(connect_str)
      data["XXX_FUNC_LIB"] = SenzingTypedef::to_json_data(xxx_func_lib)
      data["XXX_FUNC_VER"] = SenzingTypedef::to_json_data(xxx_func_ver)
      data["XXX_JAVA_CLASS_NAME"] = SenzingTypedef::to_json_data(xxx_java_class_name)
      data["XXX_LANGUAGE"] = SenzingTypedef::to_json_data(xxx_language)
      data
    end
  end

  class CfgDfbom
    attr_accessor :dfcall_id
    attr_accessor :exec_order
    attr_accessor :felem_id
    attr_accessor :ftype_id

    def self.from_json_data(data)
      out = CfgDfbom.new
      out.dfcall_id = SenzingTypedef::from_json_data(Integer, data["DFCALL_ID"])
      out.exec_order = SenzingTypedef::from_json_data(Integer, data["EXEC_ORDER"])
      out.felem_id = SenzingTypedef::from_json_data(Integer, data["FELEM_ID"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out
    end

    def to_json_data
      data = {}
      data["DFCALL_ID"] = SenzingTypedef::to_json_data(dfcall_id)
      data["EXEC_ORDER"] = SenzingTypedef::to_json_data(exec_order)
      data["FELEM_ID"] = SenzingTypedef::to_json_data(felem_id)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data
    end
  end

  class CfgDfcall
    attr_accessor :dfcall_id
    attr_accessor :dfunc_id
    attr_accessor :ftype_id
    attr_accessor :xxx_exec_order

    def self.from_json_data(data)
      out = CfgDfcall.new
      out.dfcall_id = SenzingTypedef::from_json_data(Integer, data["DFCALL_ID"])
      out.dfunc_id = SenzingTypedef::from_json_data(Integer, data["DFUNC_ID"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.xxx_exec_order = SenzingTypedef::from_json_data(Integer, data["XXX_EXEC_ORDER"])
      out
    end

    def to_json_data
      data = {}
      data["DFCALL_ID"] = SenzingTypedef::to_json_data(dfcall_id)
      data["DFUNC_ID"] = SenzingTypedef::to_json_data(dfunc_id)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["XXX_EXEC_ORDER"] = SenzingTypedef::to_json_data(xxx_exec_order)
      data
    end
  end

  class CfgDfunc
    attr_accessor :anon_support
    attr_accessor :connect_str
    attr_accessor :dfunc_code
    attr_accessor :dfunc_desc
    attr_accessor :dfunc_id
    attr_accessor :xxx_func_lib
    attr_accessor :xxx_func_ver
    attr_accessor :xxx_java_class_name
    attr_accessor :xxx_language

    def self.from_json_data(data)
      out = CfgDfunc.new
      out.anon_support = SenzingTypedef::from_json_data(String, data["ANON_SUPPORT"])
      out.connect_str = SenzingTypedef::from_json_data(String, data["CONNECT_STR"])
      out.dfunc_code = SenzingTypedef::from_json_data(String, data["DFUNC_CODE"])
      out.dfunc_desc = SenzingTypedef::from_json_data(String, data["DFUNC_DESC"])
      out.dfunc_id = SenzingTypedef::from_json_data(Integer, data["DFUNC_ID"])
      out.xxx_func_lib = SenzingTypedef::from_json_data(String, data["XXX_FUNC_LIB"])
      out.xxx_func_ver = SenzingTypedef::from_json_data(String, data["XXX_FUNC_VER"])
      out.xxx_java_class_name = SenzingTypedef::from_json_data(String, data["XXX_JAVA_CLASS_NAME"])
      out.xxx_language = SenzingTypedef::from_json_data(String, data["XXX_LANGUAGE"])
      out
    end

    def to_json_data
      data = {}
      data["ANON_SUPPORT"] = SenzingTypedef::to_json_data(anon_support)
      data["CONNECT_STR"] = SenzingTypedef::to_json_data(connect_str)
      data["DFUNC_CODE"] = SenzingTypedef::to_json_data(dfunc_code)
      data["DFUNC_DESC"] = SenzingTypedef::to_json_data(dfunc_desc)
      data["DFUNC_ID"] = SenzingTypedef::to_json_data(dfunc_id)
      data["XXX_FUNC_LIB"] = SenzingTypedef::to_json_data(xxx_func_lib)
      data["XXX_FUNC_VER"] = SenzingTypedef::to_json_data(xxx_func_ver)
      data["XXX_JAVA_CLASS_NAME"] = SenzingTypedef::to_json_data(xxx_java_class_name)
      data["XXX_LANGUAGE"] = SenzingTypedef::to_json_data(xxx_language)
      data
    end
  end

  class CfgDsrc
    attr_accessor :dsrc_code
    attr_accessor :dsrc_desc
    attr_accessor :dsrc_id
    attr_accessor :retention_level
    attr_accessor :xxx_conversational
    attr_accessor :xxx_dsrc_rely

    def self.from_json_data(data)
      out = CfgDsrc.new
      out.dsrc_code = SenzingTypedef::from_json_data(String, data["DSRC_CODE"])
      out.dsrc_desc = SenzingTypedef::from_json_data(String, data["DSRC_DESC"])
      out.dsrc_id = SenzingTypedef::from_json_data(Integer, data["DSRC_ID"])
      out.retention_level = SenzingTypedef::from_json_data(String, data["RETENTION_LEVEL"])
      out.xxx_conversational = SenzingTypedef::from_json_data(String, data["XXX_CONVERSATIONAL"])
      out.xxx_dsrc_rely = SenzingTypedef::from_json_data(Integer, data["XXX_DSRC_RELY"])
      out
    end

    def to_json_data
      data = {}
      data["DSRC_CODE"] = SenzingTypedef::to_json_data(dsrc_code)
      data["DSRC_DESC"] = SenzingTypedef::to_json_data(dsrc_desc)
      data["DSRC_ID"] = SenzingTypedef::to_json_data(dsrc_id)
      data["RETENTION_LEVEL"] = SenzingTypedef::to_json_data(retention_level)
      data["XXX_CONVERSATIONAL"] = SenzingTypedef::to_json_data(xxx_conversational)
      data["XXX_DSRC_RELY"] = SenzingTypedef::to_json_data(xxx_dsrc_rely)
      data
    end
  end

  class CfgDsrcInterest
    attr_accessor :xxx_dsrc_id
    attr_accessor :xxx_interest_flag
    attr_accessor :xxx_max_degree

    def self.from_json_data(data)
      out = CfgDsrcInterest.new
      out.xxx_dsrc_id = SenzingTypedef::from_json_data(Integer, data["XXX_DSRC_ID"])
      out.xxx_interest_flag = SenzingTypedef::from_json_data(String, data["XXX_INTEREST_FLAG"])
      out.xxx_max_degree = SenzingTypedef::from_json_data(Integer, data["XXX_MAX_DEGREE"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_DSRC_ID"] = SenzingTypedef::to_json_data(xxx_dsrc_id)
      data["XXX_INTEREST_FLAG"] = SenzingTypedef::to_json_data(xxx_interest_flag)
      data["XXX_MAX_DEGREE"] = SenzingTypedef::to_json_data(xxx_max_degree)
      data
    end
  end

  class CfgEbom
    attr_accessor :xxx_etype_id
    attr_accessor :xxx_exec_order
    attr_accessor :xxx_ftype_id
    attr_accessor :xxx_utype_code

    def self.from_json_data(data)
      out = CfgEbom.new
      out.xxx_etype_id = SenzingTypedef::from_json_data(Integer, data["XXX_ETYPE_ID"])
      out.xxx_exec_order = SenzingTypedef::from_json_data(Integer, data["XXX_EXEC_ORDER"])
      out.xxx_ftype_id = SenzingTypedef::from_json_data(Integer, data["XXX_FTYPE_ID"])
      out.xxx_utype_code = SenzingTypedef::from_json_data(String, data["XXX_UTYPE_CODE"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_ETYPE_ID"] = SenzingTypedef::to_json_data(xxx_etype_id)
      data["XXX_EXEC_ORDER"] = SenzingTypedef::to_json_data(xxx_exec_order)
      data["XXX_FTYPE_ID"] = SenzingTypedef::to_json_data(xxx_ftype_id)
      data["XXX_UTYPE_CODE"] = SenzingTypedef::to_json_data(xxx_utype_code)
      data
    end
  end

  class CfgEclass
    attr_accessor :xxx_eclass_code
    attr_accessor :xxx_eclass_desc
    attr_accessor :xxx_eclass_id
    attr_accessor :xxx_resolve

    def self.from_json_data(data)
      out = CfgEclass.new
      out.xxx_eclass_code = SenzingTypedef::from_json_data(String, data["XXX_ECLASS_CODE"])
      out.xxx_eclass_desc = SenzingTypedef::from_json_data(String, data["XXX_ECLASS_DESC"])
      out.xxx_eclass_id = SenzingTypedef::from_json_data(Integer, data["XXX_ECLASS_ID"])
      out.xxx_resolve = SenzingTypedef::from_json_data(String, data["XXX_RESOLVE"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_ECLASS_CODE"] = SenzingTypedef::to_json_data(xxx_eclass_code)
      data["XXX_ECLASS_DESC"] = SenzingTypedef::to_json_data(xxx_eclass_desc)
      data["XXX_ECLASS_ID"] = SenzingTypedef::to_json_data(xxx_eclass_id)
      data["XXX_RESOLVE"] = SenzingTypedef::to_json_data(xxx_resolve)
      data
    end
  end

  class CfgEfbom
    attr_accessor :efcall_id
    attr_accessor :exec_order
    attr_accessor :felem_id
    attr_accessor :felem_req
    attr_accessor :ftype_id

    def self.from_json_data(data)
      out = CfgEfbom.new
      out.efcall_id = SenzingTypedef::from_json_data(Integer, data["EFCALL_ID"])
      out.exec_order = SenzingTypedef::from_json_data(Integer, data["EXEC_ORDER"])
      out.felem_id = SenzingTypedef::from_json_data(Integer, data["FELEM_ID"])
      out.felem_req = SenzingTypedef::from_json_data(String, data["FELEM_REQ"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out
    end

    def to_json_data
      data = {}
      data["EFCALL_ID"] = SenzingTypedef::to_json_data(efcall_id)
      data["EXEC_ORDER"] = SenzingTypedef::to_json_data(exec_order)
      data["FELEM_ID"] = SenzingTypedef::to_json_data(felem_id)
      data["FELEM_REQ"] = SenzingTypedef::to_json_data(felem_req)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data
    end
  end

  class CfgEfcall
    attr_accessor :efcall_id
    attr_accessor :efeat_ftype_id
    attr_accessor :efunc_id
    attr_accessor :exec_order
    attr_accessor :felem_id
    attr_accessor :ftype_id
    attr_accessor :is_virtual

    def self.from_json_data(data)
      out = CfgEfcall.new
      out.efcall_id = SenzingTypedef::from_json_data(Integer, data["EFCALL_ID"])
      out.efeat_ftype_id = SenzingTypedef::from_json_data(Integer, data["EFEAT_FTYPE_ID"])
      out.efunc_id = SenzingTypedef::from_json_data(Integer, data["EFUNC_ID"])
      out.exec_order = SenzingTypedef::from_json_data(Integer, data["EXEC_ORDER"])
      out.felem_id = SenzingTypedef::from_json_data(Integer, data["FELEM_ID"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.is_virtual = SenzingTypedef::from_json_data(String, data["IS_VIRTUAL"])
      out
    end

    def to_json_data
      data = {}
      data["EFCALL_ID"] = SenzingTypedef::to_json_data(efcall_id)
      data["EFEAT_FTYPE_ID"] = SenzingTypedef::to_json_data(efeat_ftype_id)
      data["EFUNC_ID"] = SenzingTypedef::to_json_data(efunc_id)
      data["EXEC_ORDER"] = SenzingTypedef::to_json_data(exec_order)
      data["FELEM_ID"] = SenzingTypedef::to_json_data(felem_id)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["IS_VIRTUAL"] = SenzingTypedef::to_json_data(is_virtual)
      data
    end
  end

  class CfgEfunc
    attr_accessor :connect_str
    attr_accessor :efunc_code
    attr_accessor :efunc_desc
    attr_accessor :efunc_id
    attr_accessor :xxx_func_lib
    attr_accessor :xxx_func_ver
    attr_accessor :xxx_java_class_name
    attr_accessor :xxx_language

    def self.from_json_data(data)
      out = CfgEfunc.new
      out.connect_str = SenzingTypedef::from_json_data(String, data["CONNECT_STR"])
      out.efunc_code = SenzingTypedef::from_json_data(String, data["EFUNC_CODE"])
      out.efunc_desc = SenzingTypedef::from_json_data(String, data["EFUNC_DESC"])
      out.efunc_id = SenzingTypedef::from_json_data(Integer, data["EFUNC_ID"])
      out.xxx_func_lib = SenzingTypedef::from_json_data(String, data["XXX_FUNC_LIB"])
      out.xxx_func_ver = SenzingTypedef::from_json_data(String, data["XXX_FUNC_VER"])
      out.xxx_java_class_name = SenzingTypedef::from_json_data(String, data["XXX_JAVA_CLASS_NAME"])
      out.xxx_language = SenzingTypedef::from_json_data(String, data["XXX_LANGUAGE"])
      out
    end

    def to_json_data
      data = {}
      data["CONNECT_STR"] = SenzingTypedef::to_json_data(connect_str)
      data["EFUNC_CODE"] = SenzingTypedef::to_json_data(efunc_code)
      data["EFUNC_DESC"] = SenzingTypedef::to_json_data(efunc_desc)
      data["EFUNC_ID"] = SenzingTypedef::to_json_data(efunc_id)
      data["XXX_FUNC_LIB"] = SenzingTypedef::to_json_data(xxx_func_lib)
      data["XXX_FUNC_VER"] = SenzingTypedef::to_json_data(xxx_func_ver)
      data["XXX_JAVA_CLASS_NAME"] = SenzingTypedef::to_json_data(xxx_java_class_name)
      data["XXX_LANGUAGE"] = SenzingTypedef::to_json_data(xxx_language)
      data
    end
  end

  class CfgErfrag
    attr_accessor :erfrag_code
    attr_accessor :erfrag_depends
    attr_accessor :erfrag_desc
    attr_accessor :erfrag_id
    attr_accessor :erfrag_source

    def self.from_json_data(data)
      out = CfgErfrag.new
      out.erfrag_code = SenzingTypedef::from_json_data(String, data["ERFRAG_CODE"])
      out.erfrag_depends = SenzingTypedef::from_json_data(String, data["ERFRAG_DEPENDS"])
      out.erfrag_desc = SenzingTypedef::from_json_data(String, data["ERFRAG_DESC"])
      out.erfrag_id = SenzingTypedef::from_json_data(Integer, data["ERFRAG_ID"])
      out.erfrag_source = SenzingTypedef::from_json_data(String, data["ERFRAG_SOURCE"])
      out
    end

    def to_json_data
      data = {}
      data["ERFRAG_CODE"] = SenzingTypedef::to_json_data(erfrag_code)
      data["ERFRAG_DEPENDS"] = SenzingTypedef::to_json_data(erfrag_depends)
      data["ERFRAG_DESC"] = SenzingTypedef::to_json_data(erfrag_desc)
      data["ERFRAG_ID"] = SenzingTypedef::to_json_data(erfrag_id)
      data["ERFRAG_SOURCE"] = SenzingTypedef::to_json_data(erfrag_source)
      data
    end
  end

  class CfgErrule
    attr_accessor :disq_erfrag_code

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :errule_code
    attr_accessor :errule_id
    attr_accessor :errule_tier
    attr_accessor :qual_erfrag_code
    attr_accessor :relate
    attr_accessor :resolve
    attr_accessor :rtype_id
    attr_accessor :xxx_errule_desc
    attr_accessor :xxx_ref_score

    def self.from_json_data(data)
      out = CfgErrule.new
      out.disq_erfrag_code = SenzingTypedef::from_json_data(String, data["DISQ_ERFRAG_CODE"])
      out.errule_code = SenzingTypedef::from_json_data(String, data["ERRULE_CODE"])
      out.errule_id = SenzingTypedef::from_json_data(Integer, data["ERRULE_ID"])
      out.errule_tier = SenzingTypedef::from_json_data(Integer, data["ERRULE_TIER"])
      out.qual_erfrag_code = SenzingTypedef::from_json_data(String, data["QUAL_ERFRAG_CODE"])
      out.relate = SenzingTypedef::from_json_data(String, data["RELATE"])
      out.resolve = SenzingTypedef::from_json_data(String, data["RESOLVE"])
      out.rtype_id = SenzingTypedef::from_json_data(Integer, data["RTYPE_ID"])
      out.xxx_errule_desc = SenzingTypedef::from_json_data(String, data["XXX_ERRULE_DESC"])
      out.xxx_ref_score = SenzingTypedef::from_json_data(Integer, data["XXX_REF_SCORE"])
      out
    end

    def to_json_data
      data = {}
      data["DISQ_ERFRAG_CODE"] = SenzingTypedef::to_json_data(disq_erfrag_code)
      data["ERRULE_CODE"] = SenzingTypedef::to_json_data(errule_code)
      data["ERRULE_ID"] = SenzingTypedef::to_json_data(errule_id)
      data["ERRULE_TIER"] = SenzingTypedef::to_json_data(errule_tier)
      data["QUAL_ERFRAG_CODE"] = SenzingTypedef::to_json_data(qual_erfrag_code)
      data["RELATE"] = SenzingTypedef::to_json_data(relate)
      data["RESOLVE"] = SenzingTypedef::to_json_data(resolve)
      data["RTYPE_ID"] = SenzingTypedef::to_json_data(rtype_id)
      data["XXX_ERRULE_DESC"] = SenzingTypedef::to_json_data(xxx_errule_desc)
      data["XXX_REF_SCORE"] = SenzingTypedef::to_json_data(xxx_ref_score)
      data
    end
  end

  class CfgEtype
    attr_accessor :xxx_eclass_id
    attr_accessor :xxx_etype_code
    attr_accessor :xxx_etype_desc
    attr_accessor :xxx_etype_id

    def self.from_json_data(data)
      out = CfgEtype.new
      out.xxx_eclass_id = SenzingTypedef::from_json_data(Integer, data["XXX_ECLASS_ID"])
      out.xxx_etype_code = SenzingTypedef::from_json_data(String, data["XXX_ETYPE_CODE"])
      out.xxx_etype_desc = SenzingTypedef::from_json_data(String, data["XXX_ETYPE_DESC"])
      out.xxx_etype_id = SenzingTypedef::from_json_data(Integer, data["XXX_ETYPE_ID"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_ECLASS_ID"] = SenzingTypedef::to_json_data(xxx_eclass_id)
      data["XXX_ETYPE_CODE"] = SenzingTypedef::to_json_data(xxx_etype_code)
      data["XXX_ETYPE_DESC"] = SenzingTypedef::to_json_data(xxx_etype_desc)
      data["XXX_ETYPE_ID"] = SenzingTypedef::to_json_data(xxx_etype_id)
      data
    end
  end

  class CfgFbom
    attr_accessor :derived
    attr_accessor :display_level
    attr_accessor :exec_order
    attr_accessor :felem_id
    attr_accessor :ftype_id
    attr_accessor :xxx_display_delim

    def self.from_json_data(data)
      out = CfgFbom.new
      out.derived = SenzingTypedef::from_json_data(String, data["DERIVED"])
      out.display_level = SenzingTypedef::from_json_data(Integer, data["DISPLAY_LEVEL"])
      out.exec_order = SenzingTypedef::from_json_data(Integer, data["EXEC_ORDER"])
      out.felem_id = SenzingTypedef::from_json_data(Integer, data["FELEM_ID"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.xxx_display_delim = SenzingTypedef::from_json_data(String, data["XXX_DISPLAY_DELIM"])
      out
    end

    def to_json_data
      data = {}
      data["DERIVED"] = SenzingTypedef::to_json_data(derived)
      data["DISPLAY_LEVEL"] = SenzingTypedef::to_json_data(display_level)
      data["EXEC_ORDER"] = SenzingTypedef::to_json_data(exec_order)
      data["FELEM_ID"] = SenzingTypedef::to_json_data(felem_id)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["XXX_DISPLAY_DELIM"] = SenzingTypedef::to_json_data(xxx_display_delim)
      data
    end
  end

  class CfgFbovr
    attr_accessor :ftype_excl
    attr_accessor :ftype_freq
    attr_accessor :ftype_id
    attr_accessor :ftype_stab
    attr_accessor :utype_code
    attr_accessor :xxx_eclass_id

    def self.from_json_data(data)
      out = CfgFbovr.new
      out.ftype_excl = SenzingTypedef::from_json_data(String, data["FTYPE_EXCL"])
      out.ftype_freq = SenzingTypedef::from_json_data(String, data["FTYPE_FREQ"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.ftype_stab = SenzingTypedef::from_json_data(String, data["FTYPE_STAB"])
      out.utype_code = SenzingTypedef::from_json_data(String, data["UTYPE_CODE"])
      out.xxx_eclass_id = SenzingTypedef::from_json_data(Integer, data["XXX_ECLASS_ID"])
      out
    end

    def to_json_data
      data = {}
      data["FTYPE_EXCL"] = SenzingTypedef::to_json_data(ftype_excl)
      data["FTYPE_FREQ"] = SenzingTypedef::to_json_data(ftype_freq)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["FTYPE_STAB"] = SenzingTypedef::to_json_data(ftype_stab)
      data["UTYPE_CODE"] = SenzingTypedef::to_json_data(utype_code)
      data["XXX_ECLASS_ID"] = SenzingTypedef::to_json_data(xxx_eclass_id)
      data
    end
  end

  class CfgFclass
    attr_accessor :fclass_code
    attr_accessor :fclass_desc
    attr_accessor :fclass_id

    def self.from_json_data(data)
      out = CfgFclass.new
      out.fclass_code = SenzingTypedef::from_json_data(String, data["FCLASS_CODE"])
      out.fclass_desc = SenzingTypedef::from_json_data(String, data["FCLASS_DESC"])
      out.fclass_id = SenzingTypedef::from_json_data(Integer, data["FCLASS_ID"])
      out
    end

    def to_json_data
      data = {}
      data["FCLASS_CODE"] = SenzingTypedef::to_json_data(fclass_code)
      data["FCLASS_DESC"] = SenzingTypedef::to_json_data(fclass_desc)
      data["FCLASS_ID"] = SenzingTypedef::to_json_data(fclass_id)
      data
    end
  end

  class CfgFelem
    attr_accessor :data_type
    attr_accessor :felem_code
    attr_accessor :felem_desc
    attr_accessor :felem_id
    attr_accessor :xxx_tokenize

    def self.from_json_data(data)
      out = CfgFelem.new
      out.data_type = SenzingTypedef::from_json_data(String, data["DATA_TYPE"])
      out.felem_code = SenzingTypedef::from_json_data(String, data["FELEM_CODE"])
      out.felem_desc = SenzingTypedef::from_json_data(String, data["FELEM_DESC"])
      out.felem_id = SenzingTypedef::from_json_data(Integer, data["FELEM_ID"])
      out.xxx_tokenize = SenzingTypedef::from_json_data(String, data["XXX_TOKENIZE"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_TYPE"] = SenzingTypedef::to_json_data(data_type)
      data["FELEM_CODE"] = SenzingTypedef::to_json_data(felem_code)
      data["FELEM_DESC"] = SenzingTypedef::to_json_data(felem_desc)
      data["FELEM_ID"] = SenzingTypedef::to_json_data(felem_id)
      data["XXX_TOKENIZE"] = SenzingTypedef::to_json_data(xxx_tokenize)
      data
    end
  end

  class CfgFtype
    attr_accessor :anonymize
    attr_accessor :derived
    attr_accessor :fclass_id
    attr_accessor :ftype_code
    attr_accessor :ftype_desc
    attr_accessor :ftype_excl
    attr_accessor :ftype_freq
    attr_accessor :ftype_id
    attr_accessor :ftype_stab
    attr_accessor :persist_history
    attr_accessor :rtype_id
    attr_accessor :show_in_match_key
    attr_accessor :used_for_cand
    attr_accessor :version
    attr_accessor :xxx_derivation

    def self.from_json_data(data)
      out = CfgFtype.new
      out.anonymize = SenzingTypedef::from_json_data(String, data["ANONYMIZE"])
      out.derived = SenzingTypedef::from_json_data(String, data["DERIVED"])
      out.fclass_id = SenzingTypedef::from_json_data(Integer, data["FCLASS_ID"])
      out.ftype_code = SenzingTypedef::from_json_data(String, data["FTYPE_CODE"])
      out.ftype_desc = SenzingTypedef::from_json_data(String, data["FTYPE_DESC"])
      out.ftype_excl = SenzingTypedef::from_json_data(String, data["FTYPE_EXCL"])
      out.ftype_freq = SenzingTypedef::from_json_data(String, data["FTYPE_FREQ"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.ftype_stab = SenzingTypedef::from_json_data(String, data["FTYPE_STAB"])
      out.persist_history = SenzingTypedef::from_json_data(String, data["PERSIST_HISTORY"])
      out.rtype_id = SenzingTypedef::from_json_data(Integer, data["RTYPE_ID"])
      out.show_in_match_key = SenzingTypedef::from_json_data(String, data["SHOW_IN_MATCH_KEY"])
      out.used_for_cand = SenzingTypedef::from_json_data(String, data["USED_FOR_CAND"])
      out.version = SenzingTypedef::from_json_data(Integer, data["VERSION"])
      out.xxx_derivation = SenzingTypedef::from_json_data(String, data["XXX_DERIVATION"])
      out
    end

    def to_json_data
      data = {}
      data["ANONYMIZE"] = SenzingTypedef::to_json_data(anonymize)
      data["DERIVED"] = SenzingTypedef::to_json_data(derived)
      data["FCLASS_ID"] = SenzingTypedef::to_json_data(fclass_id)
      data["FTYPE_CODE"] = SenzingTypedef::to_json_data(ftype_code)
      data["FTYPE_DESC"] = SenzingTypedef::to_json_data(ftype_desc)
      data["FTYPE_EXCL"] = SenzingTypedef::to_json_data(ftype_excl)
      data["FTYPE_FREQ"] = SenzingTypedef::to_json_data(ftype_freq)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["FTYPE_STAB"] = SenzingTypedef::to_json_data(ftype_stab)
      data["PERSIST_HISTORY"] = SenzingTypedef::to_json_data(persist_history)
      data["RTYPE_ID"] = SenzingTypedef::to_json_data(rtype_id)
      data["SHOW_IN_MATCH_KEY"] = SenzingTypedef::to_json_data(show_in_match_key)
      data["USED_FOR_CAND"] = SenzingTypedef::to_json_data(used_for_cand)
      data["VERSION"] = SenzingTypedef::to_json_data(version)
      data["XXX_DERIVATION"] = SenzingTypedef::to_json_data(xxx_derivation)
      data
    end
  end

  class CfgGenericThreshold
    attr_accessor :behavior
    attr_accessor :candidate_cap
    attr_accessor :ftype_id
    attr_accessor :gplan_id
    attr_accessor :scoring_cap
    attr_accessor :send_to_redo

    def self.from_json_data(data)
      out = CfgGenericThreshold.new
      out.behavior = SenzingTypedef::from_json_data(String, data["BEHAVIOR"])
      out.candidate_cap = SenzingTypedef::from_json_data(Integer, data["CANDIDATE_CAP"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.gplan_id = SenzingTypedef::from_json_data(Integer, data["GPLAN_ID"])
      out.scoring_cap = SenzingTypedef::from_json_data(Integer, data["SCORING_CAP"])
      out.send_to_redo = SenzingTypedef::from_json_data(String, data["SEND_TO_REDO"])
      out
    end

    def to_json_data
      data = {}
      data["BEHAVIOR"] = SenzingTypedef::to_json_data(behavior)
      data["CANDIDATE_CAP"] = SenzingTypedef::to_json_data(candidate_cap)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["GPLAN_ID"] = SenzingTypedef::to_json_data(gplan_id)
      data["SCORING_CAP"] = SenzingTypedef::to_json_data(scoring_cap)
      data["SEND_TO_REDO"] = SenzingTypedef::to_json_data(send_to_redo)
      data
    end
  end

  class CfgGplan
    attr_accessor :gplan_code
    attr_accessor :gplan_desc
    attr_accessor :gplan_id

    def self.from_json_data(data)
      out = CfgGplan.new
      out.gplan_code = SenzingTypedef::from_json_data(String, data["GPLAN_CODE"])
      out.gplan_desc = SenzingTypedef::from_json_data(String, data["GPLAN_DESC"])
      out.gplan_id = SenzingTypedef::from_json_data(Integer, data["GPLAN_ID"])
      out
    end

    def to_json_data
      data = {}
      data["GPLAN_CODE"] = SenzingTypedef::to_json_data(gplan_code)
      data["GPLAN_DESC"] = SenzingTypedef::to_json_data(gplan_desc)
      data["GPLAN_ID"] = SenzingTypedef::to_json_data(gplan_id)
      data
    end
  end

  class CfgLens
    attr_accessor :xxx_lens_code
    attr_accessor :xxx_lens_desc
    attr_accessor :xxx_lens_id

    def self.from_json_data(data)
      out = CfgLens.new
      out.xxx_lens_code = SenzingTypedef::from_json_data(String, data["XXX_LENS_CODE"])
      out.xxx_lens_desc = SenzingTypedef::from_json_data(String, data["XXX_LENS_DESC"])
      out.xxx_lens_id = SenzingTypedef::from_json_data(Integer, data["XXX_LENS_ID"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_LENS_CODE"] = SenzingTypedef::to_json_data(xxx_lens_code)
      data["XXX_LENS_DESC"] = SenzingTypedef::to_json_data(xxx_lens_desc)
      data["XXX_LENS_ID"] = SenzingTypedef::to_json_data(xxx_lens_id)
      data
    end
  end

  class CfgLensrl
    attr_accessor :value

    def self.from_json_data(data)
      out = CfgLensrl.new
      out.value = SenzingTypedef.from_json_data(Array[Fixme], data)
      out
    end

    def to_json_data
      SenzingTypedef.to_json_data(value)
    end
  end

  class CfgRclass
    # Indicates if this is a disclosed relationship.
    attr_accessor :is_disclosed
    attr_accessor :rclass_code
    attr_accessor :rclass_desc
    attr_accessor :rclass_id

    def self.from_json_data(data)
      out = CfgRclass.new
      out.is_disclosed = SenzingTypedef::from_json_data(String, data["IS_DISCLOSED"])
      out.rclass_code = SenzingTypedef::from_json_data(String, data["RCLASS_CODE"])
      out.rclass_desc = SenzingTypedef::from_json_data(String, data["RCLASS_DESC"])
      out.rclass_id = SenzingTypedef::from_json_data(Integer, data["RCLASS_ID"])
      out
    end

    def to_json_data
      data = {}
      data["IS_DISCLOSED"] = SenzingTypedef::to_json_data(is_disclosed)
      data["RCLASS_CODE"] = SenzingTypedef::to_json_data(rclass_code)
      data["RCLASS_DESC"] = SenzingTypedef::to_json_data(rclass_desc)
      data["RCLASS_ID"] = SenzingTypedef::to_json_data(rclass_id)
      data
    end
  end

  class CfgRtype
    attr_accessor :break_res
    attr_accessor :rclass_id
    attr_accessor :rtype_code
    attr_accessor :rtype_desc
    attr_accessor :rtype_id
    attr_accessor :xxx_rel_strength

    def self.from_json_data(data)
      out = CfgRtype.new
      out.break_res = SenzingTypedef::from_json_data(String, data["BREAK_RES"])
      out.rclass_id = SenzingTypedef::from_json_data(Integer, data["RCLASS_ID"])
      out.rtype_code = SenzingTypedef::from_json_data(String, data["RTYPE_CODE"])
      out.rtype_desc = SenzingTypedef::from_json_data(String, data["RTYPE_DESC"])
      out.rtype_id = SenzingTypedef::from_json_data(Integer, data["RTYPE_ID"])
      out.xxx_rel_strength = SenzingTypedef::from_json_data(Integer, data["XXX_REL_STRENGTH"])
      out
    end

    def to_json_data
      data = {}
      data["BREAK_RES"] = SenzingTypedef::to_json_data(break_res)
      data["RCLASS_ID"] = SenzingTypedef::to_json_data(rclass_id)
      data["RTYPE_CODE"] = SenzingTypedef::to_json_data(rtype_code)
      data["RTYPE_DESC"] = SenzingTypedef::to_json_data(rtype_desc)
      data["RTYPE_ID"] = SenzingTypedef::to_json_data(rtype_id)
      data["XXX_REL_STRENGTH"] = SenzingTypedef::to_json_data(xxx_rel_strength)
      data
    end
  end

  class CfgSfcall
    attr_accessor :exec_order
    attr_accessor :felem_id
    attr_accessor :ftype_id
    attr_accessor :sfcall_id
    attr_accessor :sfunc_id

    def self.from_json_data(data)
      out = CfgSfcall.new
      out.exec_order = SenzingTypedef::from_json_data(Integer, data["EXEC_ORDER"])
      out.felem_id = SenzingTypedef::from_json_data(Integer, data["FELEM_ID"])
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.sfcall_id = SenzingTypedef::from_json_data(Integer, data["SFCALL_ID"])
      out.sfunc_id = SenzingTypedef::from_json_data(Integer, data["SFUNC_ID"])
      out
    end

    def to_json_data
      data = {}
      data["EXEC_ORDER"] = SenzingTypedef::to_json_data(exec_order)
      data["FELEM_ID"] = SenzingTypedef::to_json_data(felem_id)
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["SFCALL_ID"] = SenzingTypedef::to_json_data(sfcall_id)
      data["SFUNC_ID"] = SenzingTypedef::to_json_data(sfunc_id)
      data
    end
  end

  class CfgSfunc
    attr_accessor :connect_str
    attr_accessor :sfunc_code
    attr_accessor :sfunc_desc
    attr_accessor :sfunc_id
    attr_accessor :xxx_func_lib
    attr_accessor :xxx_func_ver
    attr_accessor :xxx_java_class_name
    attr_accessor :xxx_language

    def self.from_json_data(data)
      out = CfgSfunc.new
      out.connect_str = SenzingTypedef::from_json_data(String, data["CONNECT_STR"])
      out.sfunc_code = SenzingTypedef::from_json_data(String, data["SFUNC_CODE"])
      out.sfunc_desc = SenzingTypedef::from_json_data(String, data["SFUNC_DESC"])
      out.sfunc_id = SenzingTypedef::from_json_data(Integer, data["SFUNC_ID"])
      out.xxx_func_lib = SenzingTypedef::from_json_data(String, data["XXX_FUNC_LIB"])
      out.xxx_func_ver = SenzingTypedef::from_json_data(String, data["XXX_FUNC_VER"])
      out.xxx_java_class_name = SenzingTypedef::from_json_data(String, data["XXX_JAVA_CLASS_NAME"])
      out.xxx_language = SenzingTypedef::from_json_data(String, data["XXX_LANGUAGE"])
      out
    end

    def to_json_data
      data = {}
      data["CONNECT_STR"] = SenzingTypedef::to_json_data(connect_str)
      data["SFUNC_CODE"] = SenzingTypedef::to_json_data(sfunc_code)
      data["SFUNC_DESC"] = SenzingTypedef::to_json_data(sfunc_desc)
      data["SFUNC_ID"] = SenzingTypedef::to_json_data(sfunc_id)
      data["XXX_FUNC_LIB"] = SenzingTypedef::to_json_data(xxx_func_lib)
      data["XXX_FUNC_VER"] = SenzingTypedef::to_json_data(xxx_func_ver)
      data["XXX_JAVA_CLASS_NAME"] = SenzingTypedef::to_json_data(xxx_java_class_name)
      data["XXX_LANGUAGE"] = SenzingTypedef::to_json_data(xxx_language)
      data
    end
  end

  class ConfigBaseVersion
    attr_accessor :build_date
    attr_accessor :build_number
    attr_accessor :build_version
    attr_accessor :compatibility_version
    attr_accessor :version
    attr_accessor :xxx_product_name

    def self.from_json_data(data)
      out = ConfigBaseVersion.new
      out.build_date = SenzingTypedef::from_json_data(String, data["BUILD_DATE"])
      out.build_number = SenzingTypedef::from_json_data(String, data["BUILD_NUMBER"])
      out.build_version = SenzingTypedef::from_json_data(String, data["BUILD_VERSION"])
      out.compatibility_version = SenzingTypedef::from_json_data(CompatibilityVersion, data["COMPATIBILITY_VERSION"])
      out.version = SenzingTypedef::from_json_data(String, data["VERSION"])
      out.xxx_product_name = SenzingTypedef::from_json_data(String, data["XXX_PRODUCT_NAME"])
      out
    end

    def to_json_data
      data = {}
      data["BUILD_DATE"] = SenzingTypedef::to_json_data(build_date)
      data["BUILD_NUMBER"] = SenzingTypedef::to_json_data(build_number)
      data["BUILD_VERSION"] = SenzingTypedef::to_json_data(build_version)
      data["COMPATIBILITY_VERSION"] = SenzingTypedef::to_json_data(compatibility_version)
      data["VERSION"] = SenzingTypedef::to_json_data(version)
      data["XXX_PRODUCT_NAME"] = SenzingTypedef::to_json_data(xxx_product_name)
      data
    end
  end

  class CandidateKeysForMatchInfo
    attr_accessor :value

    def self.from_json_data(data)
      out = CandidateKeysForMatchInfo.new
      out.value = SenzingTypedef.from_json_data(Hash[String, Array[MatchInfoForAttribute]], data)
      out
    end

    def to_json_data
      SenzingTypedef.to_json_data(value)
    end
  end

  class CandidateKeysForSearchStatistic
    attr_accessor :feature_types
    attr_accessor :summary

    def self.from_json_data(data)
      out = CandidateKeysForSearchStatistic.new
      out.feature_types = SenzingTypedef::from_json_data(Array[FeatureType], data["FEATURE_TYPES"])
      out.summary = SenzingTypedef::from_json_data(CandidateKeysSummary, data["SUMMARY"])
      out
    end

    def to_json_data
      data = {}
      data["FEATURE_TYPES"] = SenzingTypedef::to_json_data(feature_types)
      data["SUMMARY"] = SenzingTypedef::to_json_data(summary)
      data
    end
  end

  class CandidateKeysSummary
    attr_accessor :found
    attr_accessor :generic
    attr_accessor :not_found

    def self.from_json_data(data)
      out = CandidateKeysSummary.new
      out.found = SenzingTypedef::from_json_data(Integer, data["FOUND"])
      out.generic = SenzingTypedef::from_json_data(Integer, data["GENERIC"])
      out.not_found = SenzingTypedef::from_json_data(Integer, data["NOT_FOUND"])
      out
    end

    def to_json_data
      data = {}
      data["FOUND"] = SenzingTypedef::to_json_data(found)
      data["GENERIC"] = SenzingTypedef::to_json_data(generic)
      data["NOT_FOUND"] = SenzingTypedef::to_json_data(not_found)
      data
    end
  end

  class CompatibilityVersion
    attr_accessor :config_version

    def self.from_json_data(data)
      out = CompatibilityVersion.new
      out.config_version = SenzingTypedef::from_json_data(String, data["CONFIG_VERSION"])
      out
    end

    def to_json_data
      data = {}
      data["CONFIG_VERSION"] = SenzingTypedef::to_json_data(config_version)
      data
    end
  end

  class Config
    # A user-provided description of the configuration.
    attr_accessor :config_comments

    # An internally-generated unique identifier of the configuration.
    attr_accessor :config_id

    # The timestamp of the original registration of the configuration.
    attr_accessor :sys_create_dt

    def self.from_json_data(data)
      out = Config.new
      out.config_comments = SenzingTypedef::from_json_data(String, data["CONFIG_COMMENTS"])
      out.config_id = SenzingTypedef::from_json_data(Integer, data["CONFIG_ID"])
      out.sys_create_dt = SenzingTypedef::from_json_data(String, data["SYS_CREATE_DT"])
      out
    end

    def to_json_data
      data = {}
      data["CONFIG_COMMENTS"] = SenzingTypedef::to_json_data(config_comments)
      data["CONFIG_ID"] = SenzingTypedef::to_json_data(config_id)
      data["SYS_CREATE_DT"] = SenzingTypedef::to_json_data(sys_create_dt)
      data
    end
  end

  class Confirmation
    attr_accessor :additional_scores
    attr_accessor :candidate_feat_desc
    attr_accessor :candidate_feat_id
    attr_accessor :candidate_feat_usage_type

    # Internal use.
    attr_accessor :ftype_code
    attr_accessor :inbound_feat_desc
    attr_accessor :inbound_feat_id
    attr_accessor :inbound_feat_usage_type
    attr_accessor :score
    attr_accessor :score_behavior
    attr_accessor :score_bucket
    attr_accessor :source
    attr_accessor :token

    def self.from_json_data(data)
      out = Confirmation.new
      out.additional_scores = SenzingTypedef::from_json_data(AdditionalScores, data["ADDITIONAL_SCORES"])
      out.candidate_feat_desc = SenzingTypedef::from_json_data(String, data["CANDIDATE_FEAT_DESC"])
      out.candidate_feat_id = SenzingTypedef::from_json_data(Integer, data["CANDIDATE_FEAT_ID"])
      out.candidate_feat_usage_type = SenzingTypedef::from_json_data(String, data["CANDIDATE_FEAT_USAGE_TYPE"])
      out.ftype_code = SenzingTypedef::from_json_data(String, data["FTYPE_CODE"])
      out.inbound_feat_desc = SenzingTypedef::from_json_data(String, data["INBOUND_FEAT_DESC"])
      out.inbound_feat_id = SenzingTypedef::from_json_data(Integer, data["INBOUND_FEAT_ID"])
      out.inbound_feat_usage_type = SenzingTypedef::from_json_data(String, data["INBOUND_FEAT_USAGE_TYPE"])
      out.score = SenzingTypedef::from_json_data(Integer, data["SCORE"])
      out.score_behavior = SenzingTypedef::from_json_data(String, data["SCORE_BEHAVIOR"])
      out.score_bucket = SenzingTypedef::from_json_data(String, data["SCORE_BUCKET"])
      out.source = SenzingTypedef::from_json_data(String, data["SOURCE"])
      out.token = SenzingTypedef::from_json_data(String, data["TOKEN"])
      out
    end

    def to_json_data
      data = {}
      data["ADDITIONAL_SCORES"] = SenzingTypedef::to_json_data(additional_scores)
      data["CANDIDATE_FEAT_DESC"] = SenzingTypedef::to_json_data(candidate_feat_desc)
      data["CANDIDATE_FEAT_ID"] = SenzingTypedef::to_json_data(candidate_feat_id)
      data["CANDIDATE_FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(candidate_feat_usage_type)
      data["FTYPE_CODE"] = SenzingTypedef::to_json_data(ftype_code)
      data["INBOUND_FEAT_DESC"] = SenzingTypedef::to_json_data(inbound_feat_desc)
      data["INBOUND_FEAT_ID"] = SenzingTypedef::to_json_data(inbound_feat_id)
      data["INBOUND_FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(inbound_feat_usage_type)
      data["SCORE"] = SenzingTypedef::to_json_data(score)
      data["SCORE_BEHAVIOR"] = SenzingTypedef::to_json_data(score_behavior)
      data["SCORE_BUCKET"] = SenzingTypedef::to_json_data(score_bucket)
      data["SOURCE"] = SenzingTypedef::to_json_data(source)
      data["TOKEN"] = SenzingTypedef::to_json_data(token)
      data
    end
  end

  class DataSource
    # The unique text identifier of the datasource. It should be UPPER_CASE
    # ASCII without spaces. It will be used as a JSON key.
    attr_accessor :dsrc_code

    # The unique internal integer identifier of the datasource.
    attr_accessor :dsrc_id

    def self.from_json_data(data)
      out = DataSource.new
      out.dsrc_code = SenzingTypedef::from_json_data(String, data["DSRC_CODE"])
      out.dsrc_id = SenzingTypedef::from_json_data(Integer, data["DSRC_ID"])
      out
    end

    def to_json_data
      data = {}
      data["DSRC_CODE"] = SenzingTypedef::to_json_data(dsrc_code)
      data["DSRC_ID"] = SenzingTypedef::to_json_data(dsrc_id)
      data
    end
  end

  class DisclosedRelationsForMatchInfo
    attr_accessor :domain
    attr_accessor :entity_roles
    attr_accessor :related_roles
    attr_accessor :rel_link
    attr_accessor :xxx_rel_anchor
    attr_accessor :xxx_rel_pointer

    def self.from_json_data(data)
      out = DisclosedRelationsForMatchInfo.new
      out.domain = SenzingTypedef::from_json_data(String, data["DOMAIN"])
      out.entity_roles = SenzingTypedef::from_json_data(Array[EntityRoles], data["ENTITY_ROLES"])
      out.related_roles = SenzingTypedef::from_json_data(Array[RelatedRoles], data["RELATED_ROLES"])
      out.rel_link = SenzingTypedef::from_json_data(Array[RelLink], data["REL_LINK"])
      out.xxx_rel_anchor = SenzingTypedef::from_json_data(Array[RelAnchor], data["XXX_REL_ANCHOR"])
      out.xxx_rel_pointer = SenzingTypedef::from_json_data(Array[RelPointer], data["XXX_REL_POINTER"])
      out
    end

    def to_json_data
      data = {}
      data["DOMAIN"] = SenzingTypedef::to_json_data(domain)
      data["ENTITY_ROLES"] = SenzingTypedef::to_json_data(entity_roles)
      data["RELATED_ROLES"] = SenzingTypedef::to_json_data(related_roles)
      data["REL_LINK"] = SenzingTypedef::to_json_data(rel_link)
      data["XXX_REL_ANCHOR"] = SenzingTypedef::to_json_data(xxx_rel_anchor)
      data["XXX_REL_POINTER"] = SenzingTypedef::to_json_data(xxx_rel_pointer)
      data
    end
  end

  class DisclosedRelationsForMatchInfoForWhy
    attr_accessor :domain
    attr_accessor :feat_id
    attr_accessor :feat_usage_type
    attr_accessor :linked_feat_id
    attr_accessor :linked_feat_type
    attr_accessor :rel_anchor
    attr_accessor :rel_link
    attr_accessor :rel_pointer

    # Describes the attributes that make up the feature.
    attr_accessor :xxx_feat_desc
    attr_accessor :xxx_linked_feat_desc

    def self.from_json_data(data)
      out = DisclosedRelationsForMatchInfoForWhy.new
      out.domain = SenzingTypedef::from_json_data(String, data["DOMAIN"])
      out.feat_id = SenzingTypedef::from_json_data(Integer, data["FEAT_ID"])
      out.feat_usage_type = SenzingTypedef::from_json_data(String, data["FEAT_USAGE_TYPE"])
      out.linked_feat_id = SenzingTypedef::from_json_data(Integer, data["LINKED_FEAT_ID"])
      out.linked_feat_type = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_TYPE"])
      out.rel_anchor = SenzingTypedef::from_json_data(Array[RelAnchor], data["REL_ANCHOR"])
      out.rel_link = SenzingTypedef::from_json_data(Array[RelLink], data["REL_LINK"])
      out.rel_pointer = SenzingTypedef::from_json_data(Array[RelPointer], data["REL_POINTER"])
      out.xxx_feat_desc = SenzingTypedef::from_json_data(String, data["XXX_FEAT_DESC"])
      out.xxx_linked_feat_desc = SenzingTypedef::from_json_data(String, data["XXX_LINKED_FEAT_DESC"])
      out
    end

    def to_json_data
      data = {}
      data["DOMAIN"] = SenzingTypedef::to_json_data(domain)
      data["FEAT_ID"] = SenzingTypedef::to_json_data(feat_id)
      data["FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(feat_usage_type)
      data["LINKED_FEAT_ID"] = SenzingTypedef::to_json_data(linked_feat_id)
      data["LINKED_FEAT_TYPE"] = SenzingTypedef::to_json_data(linked_feat_type)
      data["REL_ANCHOR"] = SenzingTypedef::to_json_data(rel_anchor)
      data["REL_LINK"] = SenzingTypedef::to_json_data(rel_link)
      data["REL_POINTER"] = SenzingTypedef::to_json_data(rel_pointer)
      data["XXX_FEAT_DESC"] = SenzingTypedef::to_json_data(xxx_feat_desc)
      data["XXX_LINKED_FEAT_DESC"] = SenzingTypedef::to_json_data(xxx_linked_feat_desc)
      data
    end
  end

  class DisclosedRelationsForWhyKeyDetails
    attr_accessor :domain
    attr_accessor :entity_roles
    attr_accessor :related_roles

    def self.from_json_data(data)
      out = DisclosedRelationsForWhyKeyDetails.new
      out.domain = SenzingTypedef::from_json_data(String, data["DOMAIN"])
      out.entity_roles = SenzingTypedef::from_json_data(Array[EntityRoles], data["ENTITY_ROLES"])
      out.related_roles = SenzingTypedef::from_json_data(Array[RelatedRoles], data["RELATED_ROLES"])
      out
    end

    def to_json_data
      data = {}
      data["DOMAIN"] = SenzingTypedef::to_json_data(domain)
      data["ENTITY_ROLES"] = SenzingTypedef::to_json_data(entity_roles)
      data["RELATED_ROLES"] = SenzingTypedef::to_json_data(related_roles)
      data
    end
  end

  class Entity
    attr_accessor :related_entities
    attr_accessor :resolved_entity

    def self.from_json_data(data)
      out = Entity.new
      out.related_entities = SenzingTypedef::from_json_data(Array[RelatedEntity], data["RELATED_ENTITIES"])
      out.resolved_entity = SenzingTypedef::from_json_data(ResolvedEntity, data["RESOLVED_ENTITY"])
      out
    end

    def to_json_data
      data = {}
      data["RELATED_ENTITIES"] = SenzingTypedef::to_json_data(related_entities)
      data["RESOLVED_ENTITY"] = SenzingTypedef::to_json_data(resolved_entity)
      data
    end
  end

  class EntityForResolvedEntity
    attr_accessor :related_entities
    attr_accessor :resolved_entity

    def self.from_json_data(data)
      out = EntityForResolvedEntity.new
      out.related_entities = SenzingTypedef::from_json_data(Array[RelatedEntity], data["RELATED_ENTITIES"])
      out.resolved_entity = SenzingTypedef::from_json_data(ResolvedEntity, data["RESOLVED_ENTITY"])
      out
    end

    def to_json_data
      data = {}
      data["RELATED_ENTITIES"] = SenzingTypedef::to_json_data(related_entities)
      data["RESOLVED_ENTITY"] = SenzingTypedef::to_json_data(resolved_entity)
      data
    end
  end

  class EntityForWhySearch
    attr_accessor :related_entities
    attr_accessor :resolved_entity

    def self.from_json_data(data)
      out = EntityForWhySearch.new
      out.related_entities = SenzingTypedef::from_json_data(Array[RelatedEntity], data["RELATED_ENTITIES"])
      out.resolved_entity = SenzingTypedef::from_json_data(ResolvedEntity, data["RESOLVED_ENTITY"])
      out
    end

    def to_json_data
      data = {}
      data["RELATED_ENTITIES"] = SenzingTypedef::to_json_data(related_entities)
      data["RESOLVED_ENTITY"] = SenzingTypedef::to_json_data(resolved_entity)
      data
    end
  end

  class EntityNetworkLink
    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :errule_code

    # Indicates if this is an ambiguous relationship.
    attr_accessor :is_ambiguous

    # Indicates if this is a disclosed relationship.
    attr_accessor :is_disclosed

    # Representation of matched source record features.
    attr_accessor :match_key
    attr_accessor :match_key_details

    # The type of match that occurred for the record.
    attr_accessor :match_level_code
    attr_accessor :max_entity_id
    attr_accessor :min_entity_id

    def self.from_json_data(data)
      out = EntityNetworkLink.new
      out.errule_code = SenzingTypedef::from_json_data(String, data["ERRULE_CODE"])
      out.is_ambiguous = SenzingTypedef::from_json_data(Integer, data["IS_AMBIGUOUS"])
      out.is_disclosed = SenzingTypedef::from_json_data(Integer, data["IS_DISCLOSED"])
      out.match_key = SenzingTypedef::from_json_data(String, data["MATCH_KEY"])
      out.match_key_details = SenzingTypedef::from_json_data(MatchKeyDetails, data["MATCH_KEY_DETAILS"])
      out.match_level_code = SenzingTypedef::from_json_data(String, data["MATCH_LEVEL_CODE"])
      out.max_entity_id = SenzingTypedef::from_json_data(Integer, data["MAX_ENTITY_ID"])
      out.min_entity_id = SenzingTypedef::from_json_data(Integer, data["MIN_ENTITY_ID"])
      out
    end

    def to_json_data
      data = {}
      data["ERRULE_CODE"] = SenzingTypedef::to_json_data(errule_code)
      data["IS_AMBIGUOUS"] = SenzingTypedef::to_json_data(is_ambiguous)
      data["IS_DISCLOSED"] = SenzingTypedef::to_json_data(is_disclosed)
      data["MATCH_KEY"] = SenzingTypedef::to_json_data(match_key)
      data["MATCH_KEY_DETAILS"] = SenzingTypedef::to_json_data(match_key_details)
      data["MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(match_level_code)
      data["MAX_ENTITY_ID"] = SenzingTypedef::to_json_data(max_entity_id)
      data["MIN_ENTITY_ID"] = SenzingTypedef::to_json_data(min_entity_id)
      data
    end
  end

  class EntityPath
    attr_accessor :end_entity_id
    attr_accessor :entities
    attr_accessor :start_entity_id

    def self.from_json_data(data)
      out = EntityPath.new
      out.end_entity_id = SenzingTypedef::from_json_data(Integer, data["END_ENTITY_ID"])
      out.entities = SenzingTypedef::from_json_data(Array[Integer], data["ENTITIES"])
      out.start_entity_id = SenzingTypedef::from_json_data(Integer, data["START_ENTITY_ID"])
      out
    end

    def to_json_data
      data = {}
      data["END_ENTITY_ID"] = SenzingTypedef::to_json_data(end_entity_id)
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["START_ENTITY_ID"] = SenzingTypedef::to_json_data(start_entity_id)
      data
    end
  end

  class EntityPathLink
    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :errule_code

    # Indicates if this is an ambiguous relationship.
    attr_accessor :is_ambiguous

    # Indicates if this is a disclosed relationship.
    attr_accessor :is_disclosed

    # Representation of matched source record features.
    attr_accessor :match_key
    attr_accessor :match_key_details

    # The type of match that occurred for the record.
    attr_accessor :match_level_code
    attr_accessor :max_entity_id
    attr_accessor :min_entity_id

    def self.from_json_data(data)
      out = EntityPathLink.new
      out.errule_code = SenzingTypedef::from_json_data(String, data["ERRULE_CODE"])
      out.is_ambiguous = SenzingTypedef::from_json_data(Integer, data["IS_AMBIGUOUS"])
      out.is_disclosed = SenzingTypedef::from_json_data(Integer, data["IS_DISCLOSED"])
      out.match_key = SenzingTypedef::from_json_data(String, data["MATCH_KEY"])
      out.match_key_details = SenzingTypedef::from_json_data(MatchKeyDetails, data["MATCH_KEY_DETAILS"])
      out.match_level_code = SenzingTypedef::from_json_data(String, data["MATCH_LEVEL_CODE"])
      out.max_entity_id = SenzingTypedef::from_json_data(Integer, data["MAX_ENTITY_ID"])
      out.min_entity_id = SenzingTypedef::from_json_data(Integer, data["MIN_ENTITY_ID"])
      out
    end

    def to_json_data
      data = {}
      data["ERRULE_CODE"] = SenzingTypedef::to_json_data(errule_code)
      data["IS_AMBIGUOUS"] = SenzingTypedef::to_json_data(is_ambiguous)
      data["IS_DISCLOSED"] = SenzingTypedef::to_json_data(is_disclosed)
      data["MATCH_KEY"] = SenzingTypedef::to_json_data(match_key)
      data["MATCH_KEY_DETAILS"] = SenzingTypedef::to_json_data(match_key_details)
      data["MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(match_level_code)
      data["MAX_ENTITY_ID"] = SenzingTypedef::to_json_data(max_entity_id)
      data["MIN_ENTITY_ID"] = SenzingTypedef::to_json_data(min_entity_id)
      data
    end
  end

  class EntityRoles
    attr_accessor :feat_desc
    attr_accessor :role

    def self.from_json_data(data)
      out = EntityRoles.new
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.role = SenzingTypedef::from_json_data(String, data["ROLE"])
      out
    end

    def to_json_data
      data = {}
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["ROLE"] = SenzingTypedef::to_json_data(role)
      data
    end
  end

  class Feature
    # Internal use.
    attr_accessor :felem_code

    # Internal use.
    attr_accessor :felem_value

    def self.from_json_data(data)
      out = Feature.new
      out.felem_code = SenzingTypedef::from_json_data(String, data["FELEM_CODE"])
      out.felem_value = SenzingTypedef::from_json_data(String, data["FELEM_VALUE"])
      out
    end

    def to_json_data
      data = {}
      data["FELEM_CODE"] = SenzingTypedef::to_json_data(felem_code)
      data["FELEM_VALUE"] = SenzingTypedef::to_json_data(felem_value)
      data
    end
  end

  class FeatureDescriptionValue
    attr_accessor :attributes
    attr_accessor :candidate_cap_reached
    attr_accessor :entity_count

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc
    attr_accessor :feat_desc_values

    # Internal use.
    attr_accessor :lib_feat_id
    attr_accessor :scoring_cap_reached
    attr_accessor :suppressed
    attr_accessor :used_for_cand
    attr_accessor :used_for_scoring

    def self.from_json_data(data)
      out = FeatureDescriptionValue.new
      out.attributes = SenzingTypedef::from_json_data(Hash[String, String], data["ATTRIBUTES"])
      out.candidate_cap_reached = SenzingTypedef::from_json_data(String, data["CANDIDATE_CAP_REACHED"])
      out.entity_count = SenzingTypedef::from_json_data(Integer, data["ENTITY_COUNT"])
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.feat_desc_values = SenzingTypedef::from_json_data(Array[FeatureDescriptionValueDetails], data["FEAT_DESC_VALUES"])
      out.lib_feat_id = SenzingTypedef::from_json_data(Integer, data["LIB_FEAT_ID"])
      out.scoring_cap_reached = SenzingTypedef::from_json_data(String, data["SCORING_CAP_REACHED"])
      out.suppressed = SenzingTypedef::from_json_data(String, data["SUPPRESSED"])
      out.used_for_cand = SenzingTypedef::from_json_data(String, data["USED_FOR_CAND"])
      out.used_for_scoring = SenzingTypedef::from_json_data(String, data["USED_FOR_SCORING"])
      out
    end

    def to_json_data
      data = {}
      data["ATTRIBUTES"] = SenzingTypedef::to_json_data(attributes)
      data["CANDIDATE_CAP_REACHED"] = SenzingTypedef::to_json_data(candidate_cap_reached)
      data["ENTITY_COUNT"] = SenzingTypedef::to_json_data(entity_count)
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["FEAT_DESC_VALUES"] = SenzingTypedef::to_json_data(feat_desc_values)
      data["LIB_FEAT_ID"] = SenzingTypedef::to_json_data(lib_feat_id)
      data["SCORING_CAP_REACHED"] = SenzingTypedef::to_json_data(scoring_cap_reached)
      data["SUPPRESSED"] = SenzingTypedef::to_json_data(suppressed)
      data["USED_FOR_CAND"] = SenzingTypedef::to_json_data(used_for_cand)
      data["USED_FOR_SCORING"] = SenzingTypedef::to_json_data(used_for_scoring)
      data
    end
  end

  class FeatureDescriptionValueDetails
    attr_accessor :candidate_cap_reached
    attr_accessor :entity_count

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc
    attr_accessor :lib_feat_id
    attr_accessor :scoring_cap_reached
    attr_accessor :suppressed
    attr_accessor :used_for_cand
    attr_accessor :used_for_scoring

    def self.from_json_data(data)
      out = FeatureDescriptionValueDetails.new
      out.candidate_cap_reached = SenzingTypedef::from_json_data(String, data["CANDIDATE_CAP_REACHED"])
      out.entity_count = SenzingTypedef::from_json_data(Integer, data["ENTITY_COUNT"])
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.lib_feat_id = SenzingTypedef::from_json_data(Integer, data["LIB_FEAT_ID"])
      out.scoring_cap_reached = SenzingTypedef::from_json_data(String, data["SCORING_CAP_REACHED"])
      out.suppressed = SenzingTypedef::from_json_data(String, data["SUPPRESSED"])
      out.used_for_cand = SenzingTypedef::from_json_data(String, data["USED_FOR_CAND"])
      out.used_for_scoring = SenzingTypedef::from_json_data(String, data["USED_FOR_SCORING"])
      out
    end

    def to_json_data
      data = {}
      data["CANDIDATE_CAP_REACHED"] = SenzingTypedef::to_json_data(candidate_cap_reached)
      data["ENTITY_COUNT"] = SenzingTypedef::to_json_data(entity_count)
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["LIB_FEAT_ID"] = SenzingTypedef::to_json_data(lib_feat_id)
      data["SCORING_CAP_REACHED"] = SenzingTypedef::to_json_data(scoring_cap_reached)
      data["SUPPRESSED"] = SenzingTypedef::to_json_data(suppressed)
      data["USED_FOR_CAND"] = SenzingTypedef::to_json_data(used_for_cand)
      data["USED_FOR_SCORING"] = SenzingTypedef::to_json_data(used_for_scoring)
      data
    end
  end

  class FeatureForAttributes
    attr_accessor :attributes
    attr_accessor :candidate_cap_reached
    attr_accessor :entity_count

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc_values
    attr_accessor :lib_feat_id
    attr_accessor :scoring_cap_reached

    # Label to identify how some features are being used (can also change some
    # features behavior).
    attr_accessor :usage_type
    attr_accessor :used_for_cand
    attr_accessor :used_for_scoring

    def self.from_json_data(data)
      out = FeatureForAttributes.new
      out.attributes = SenzingTypedef::from_json_data(SenzingEntitySpecification, data["ATTRIBUTES"])
      out.candidate_cap_reached = SenzingTypedef::from_json_data(String, data["CANDIDATE_CAP_REACHED"])
      out.entity_count = SenzingTypedef::from_json_data(Integer, data["ENTITY_COUNT"])
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.feat_desc_values = SenzingTypedef::from_json_data(Array[FeatureDescriptionValue], data["FEAT_DESC_VALUES"])
      out.lib_feat_id = SenzingTypedef::from_json_data(Integer, data["LIB_FEAT_ID"])
      out.scoring_cap_reached = SenzingTypedef::from_json_data(String, data["SCORING_CAP_REACHED"])
      out.usage_type = SenzingTypedef::from_json_data(String, data["USAGE_TYPE"])
      out.used_for_cand = SenzingTypedef::from_json_data(String, data["USED_FOR_CAND"])
      out.used_for_scoring = SenzingTypedef::from_json_data(String, data["USED_FOR_SCORING"])
      out
    end

    def to_json_data
      data = {}
      data["ATTRIBUTES"] = SenzingTypedef::to_json_data(attributes)
      data["CANDIDATE_CAP_REACHED"] = SenzingTypedef::to_json_data(candidate_cap_reached)
      data["ENTITY_COUNT"] = SenzingTypedef::to_json_data(entity_count)
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["FEAT_DESC_VALUES"] = SenzingTypedef::to_json_data(feat_desc_values)
      data["LIB_FEAT_ID"] = SenzingTypedef::to_json_data(lib_feat_id)
      data["SCORING_CAP_REACHED"] = SenzingTypedef::to_json_data(scoring_cap_reached)
      data["USAGE_TYPE"] = SenzingTypedef::to_json_data(usage_type)
      data["USED_FOR_CAND"] = SenzingTypedef::to_json_data(used_for_cand)
      data["USED_FOR_SCORING"] = SenzingTypedef::to_json_data(used_for_scoring)
      data
    end
  end

  class FeatureForGetEntity
    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc_values
    attr_accessor :lib_feat_id

    # Label to identify how some features are being used (can also change some
    # features behavior).
    attr_accessor :usage_type
    attr_accessor :xxx_attributes

    def self.from_json_data(data)
      out = FeatureForGetEntity.new
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.feat_desc_values = SenzingTypedef::from_json_data(Array[FeatureDescriptionValue], data["FEAT_DESC_VALUES"])
      out.lib_feat_id = SenzingTypedef::from_json_data(Integer, data["LIB_FEAT_ID"])
      out.usage_type = SenzingTypedef::from_json_data(String, data["USAGE_TYPE"])
      out.xxx_attributes = SenzingTypedef::from_json_data(Array[SenzingEntitySpecification], data["XXX_ATTRIBUTES"])
      out
    end

    def to_json_data
      data = {}
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["FEAT_DESC_VALUES"] = SenzingTypedef::to_json_data(feat_desc_values)
      data["LIB_FEAT_ID"] = SenzingTypedef::to_json_data(lib_feat_id)
      data["USAGE_TYPE"] = SenzingTypedef::to_json_data(usage_type)
      data["XXX_ATTRIBUTES"] = SenzingTypedef::to_json_data(xxx_attributes)
      data
    end
  end

  class FeatureID
    attr_accessor :lib_feat_id

    # Label to identify how some features are being used (can also change some
    # features behavior).
    attr_accessor :usage_type

    def self.from_json_data(data)
      out = FeatureID.new
      out.lib_feat_id = SenzingTypedef::from_json_data(Integer, data["LIB_FEAT_ID"])
      out.usage_type = SenzingTypedef::from_json_data(String, data["USAGE_TYPE"])
      out
    end

    def to_json_data
      data = {}
      data["LIB_FEAT_ID"] = SenzingTypedef::to_json_data(lib_feat_id)
      data["USAGE_TYPE"] = SenzingTypedef::to_json_data(usage_type)
      data
    end
  end

  class FeatureScoreForAttribute
    attr_accessor :additional_scores
    attr_accessor :candidate_feat_desc
    attr_accessor :candidate_feat_id
    attr_accessor :candidate_feat_usage_type
    attr_accessor :inbound_feat_desc
    attr_accessor :inbound_feat_id
    attr_accessor :inbound_feat_usage_type
    attr_accessor :score
    attr_accessor :score_behavior
    attr_accessor :score_bucket

    def self.from_json_data(data)
      out = FeatureScoreForAttribute.new
      out.additional_scores = SenzingTypedef::from_json_data(AdditionalScores, data["ADDITIONAL_SCORES"])
      out.candidate_feat_desc = SenzingTypedef::from_json_data(String, data["CANDIDATE_FEAT_DESC"])
      out.candidate_feat_id = SenzingTypedef::from_json_data(Integer, data["CANDIDATE_FEAT_ID"])
      out.candidate_feat_usage_type = SenzingTypedef::from_json_data(String, data["CANDIDATE_FEAT_USAGE_TYPE"])
      out.inbound_feat_desc = SenzingTypedef::from_json_data(String, data["INBOUND_FEAT_DESC"])
      out.inbound_feat_id = SenzingTypedef::from_json_data(Integer, data["INBOUND_FEAT_ID"])
      out.inbound_feat_usage_type = SenzingTypedef::from_json_data(String, data["INBOUND_FEAT_USAGE_TYPE"])
      out.score = SenzingTypedef::from_json_data(Integer, data["SCORE"])
      out.score_behavior = SenzingTypedef::from_json_data(String, data["SCORE_BEHAVIOR"])
      out.score_bucket = SenzingTypedef::from_json_data(String, data["SCORE_BUCKET"])
      out
    end

    def to_json_data
      data = {}
      data["ADDITIONAL_SCORES"] = SenzingTypedef::to_json_data(additional_scores)
      data["CANDIDATE_FEAT_DESC"] = SenzingTypedef::to_json_data(candidate_feat_desc)
      data["CANDIDATE_FEAT_ID"] = SenzingTypedef::to_json_data(candidate_feat_id)
      data["CANDIDATE_FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(candidate_feat_usage_type)
      data["INBOUND_FEAT_DESC"] = SenzingTypedef::to_json_data(inbound_feat_desc)
      data["INBOUND_FEAT_ID"] = SenzingTypedef::to_json_data(inbound_feat_id)
      data["INBOUND_FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(inbound_feat_usage_type)
      data["SCORE"] = SenzingTypedef::to_json_data(score)
      data["SCORE_BEHAVIOR"] = SenzingTypedef::to_json_data(score_behavior)
      data["SCORE_BUCKET"] = SenzingTypedef::to_json_data(score_bucket)
      data
    end
  end

  class FeatureScores
    attr_accessor :value

    def self.from_json_data(data)
      out = FeatureScores.new
      out.value = SenzingTypedef.from_json_data(Hash[String, Array[FeatureScoreForAttribute]], data)
      out
    end

    def to_json_data
      SenzingTypedef.to_json_data(value)
    end
  end

  class FeatureType
    attr_accessor :found
    attr_accessor :ftype_code
    attr_accessor :generic
    attr_accessor :not_found

    def self.from_json_data(data)
      out = FeatureType.new
      out.found = SenzingTypedef::from_json_data(Integer, data["FOUND"])
      out.ftype_code = SenzingTypedef::from_json_data(String, data["FTYPE_CODE"])
      out.generic = SenzingTypedef::from_json_data(Integer, data["GENERIC"])
      out.not_found = SenzingTypedef::from_json_data(Integer, data["NOT_FOUND"])
      out
    end

    def to_json_data
      data = {}
      data["FOUND"] = SenzingTypedef::to_json_data(found)
      data["FTYPE_CODE"] = SenzingTypedef::to_json_data(ftype_code)
      data["GENERIC"] = SenzingTypedef::to_json_data(generic)
      data["NOT_FOUND"] = SenzingTypedef::to_json_data(not_found)
      data
    end
  end

  class FinalState
    attr_accessor :need_reevaluation
    attr_accessor :virtual_entities

    def self.from_json_data(data)
      out = FinalState.new
      out.need_reevaluation = SenzingTypedef::from_json_data(Integer, data["NEED_REEVALUATION"])
      out.virtual_entities = SenzingTypedef::from_json_data(Array[VirtualEntitySynopsis], data["VIRTUAL_ENTITIES"])
      out
    end

    def to_json_data
      data = {}
      data["NEED_REEVALUATION"] = SenzingTypedef::to_json_data(need_reevaluation)
      data["VIRTUAL_ENTITIES"] = SenzingTypedef::to_json_data(virtual_entities)
      data
    end
  end

  class Fixme
    attr_accessor :fixme_key

    def self.from_json_data(data)
      out = Fixme.new
      out.fixme_key = SenzingTypedef::from_json_data(String, data["FIXME_KEY"])
      out
    end

    def to_json_data
      data = {}
      data["FIXME_KEY"] = SenzingTypedef::to_json_data(fixme_key)
      data
    end
  end

  class FocusRecord
    # A label identifying the provenance of the record. FIXME: An example of
    # differences.
    attr_accessor :data_source

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id

    def self.from_json_data(data)
      out = FocusRecord.new
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data
    end
  end

  class G2configSettings
    attr_accessor :metaphone_version

    def self.from_json_data(data)
      out = G2configSettings.new
      out.metaphone_version = SenzingTypedef::from_json_data(Integer, data["METAPHONE_VERSION"])
      out
    end

    def to_json_data
      data = {}
      data["METAPHONE_VERSION"] = SenzingTypedef::to_json_data(metaphone_version)
      data
    end
  end

  class G2config
    attr_accessor :cfg_attr
    attr_accessor :cfg_cfbom
    attr_accessor :cfg_cfcall
    attr_accessor :cfg_cfrtn
    attr_accessor :cfg_cfunc
    attr_accessor :cfg_dfbom
    attr_accessor :cfg_dfcall
    attr_accessor :cfg_dfunc
    attr_accessor :cfg_dsrc
    attr_accessor :cfg_dsrc_interest
    attr_accessor :cfg_ebom
    attr_accessor :cfg_efbom
    attr_accessor :cfg_efcall
    attr_accessor :cfg_efunc
    attr_accessor :cfg_erfrag
    attr_accessor :cfg_errule
    attr_accessor :cfg_fbom
    attr_accessor :cfg_fbovr
    attr_accessor :cfg_fclass
    attr_accessor :cfg_felem
    attr_accessor :cfg_ftype
    attr_accessor :cfg_generic_threshold
    attr_accessor :cfg_gplan
    attr_accessor :cfg_rclass
    attr_accessor :cfg_rtype
    attr_accessor :cfg_sfcall
    attr_accessor :cfg_sfunc
    attr_accessor :config_base_version
    attr_accessor :settings
    attr_accessor :sys_oom
    attr_accessor :xxx_cfg_eclass
    attr_accessor :xxx_cfg_etype
    attr_accessor :xxx_cfg_lens
    attr_accessor :xxx_cfg_lensrl

    def self.from_json_data(data)
      out = G2config.new
      out.cfg_attr = SenzingTypedef::from_json_data(Array[CfgAttr], data["CFG_ATTR"])
      out.cfg_cfbom = SenzingTypedef::from_json_data(Array[CfgCfbom], data["CFG_CFBOM"])
      out.cfg_cfcall = SenzingTypedef::from_json_data(Array[CfgCfcall], data["CFG_CFCALL"])
      out.cfg_cfrtn = SenzingTypedef::from_json_data(Array[CfgCfrtn], data["CFG_CFRTN"])
      out.cfg_cfunc = SenzingTypedef::from_json_data(Array[CfgCfunc], data["CFG_CFUNC"])
      out.cfg_dfbom = SenzingTypedef::from_json_data(Array[CfgDfbom], data["CFG_DFBOM"])
      out.cfg_dfcall = SenzingTypedef::from_json_data(Array[CfgDfcall], data["CFG_DFCALL"])
      out.cfg_dfunc = SenzingTypedef::from_json_data(Array[CfgDfunc], data["CFG_DFUNC"])
      out.cfg_dsrc = SenzingTypedef::from_json_data(Array[CfgDsrc], data["CFG_DSRC"])
      out.cfg_dsrc_interest = SenzingTypedef::from_json_data(Array[CfgDsrcInterest], data["CFG_DSRC_INTEREST"])
      out.cfg_ebom = SenzingTypedef::from_json_data(Array[CfgEbom], data["CFG_EBOM"])
      out.cfg_efbom = SenzingTypedef::from_json_data(Array[CfgEfbom], data["CFG_EFBOM"])
      out.cfg_efcall = SenzingTypedef::from_json_data(Array[CfgEfcall], data["CFG_EFCALL"])
      out.cfg_efunc = SenzingTypedef::from_json_data(Array[CfgEfunc], data["CFG_EFUNC"])
      out.cfg_erfrag = SenzingTypedef::from_json_data(Array[CfgErfrag], data["CFG_ERFRAG"])
      out.cfg_errule = SenzingTypedef::from_json_data(Array[CfgErrule], data["CFG_ERRULE"])
      out.cfg_fbom = SenzingTypedef::from_json_data(Array[CfgFbom], data["CFG_FBOM"])
      out.cfg_fbovr = SenzingTypedef::from_json_data(Array[CfgFbovr], data["CFG_FBOVR"])
      out.cfg_fclass = SenzingTypedef::from_json_data(Array[CfgFclass], data["CFG_FCLASS"])
      out.cfg_felem = SenzingTypedef::from_json_data(Array[CfgFelem], data["CFG_FELEM"])
      out.cfg_ftype = SenzingTypedef::from_json_data(Array[CfgFtype], data["CFG_FTYPE"])
      out.cfg_generic_threshold = SenzingTypedef::from_json_data(Array[CfgGenericThreshold], data["CFG_GENERIC_THRESHOLD"])
      out.cfg_gplan = SenzingTypedef::from_json_data(Array[CfgGplan], data["CFG_GPLAN"])
      out.cfg_rclass = SenzingTypedef::from_json_data(Array[CfgRclass], data["CFG_RCLASS"])
      out.cfg_rtype = SenzingTypedef::from_json_data(Array[CfgRtype], data["CFG_RTYPE"])
      out.cfg_sfcall = SenzingTypedef::from_json_data(Array[CfgSfcall], data["CFG_SFCALL"])
      out.cfg_sfunc = SenzingTypedef::from_json_data(Array[CfgSfunc], data["CFG_SFUNC"])
      out.config_base_version = SenzingTypedef::from_json_data(ConfigBaseVersion, data["CONFIG_BASE_VERSION"])
      out.settings = SenzingTypedef::from_json_data(G2configSettings, data["SETTINGS"])
      out.sys_oom = SenzingTypedef::from_json_data(Array[SysOom], data["SYS_OOM"])
      out.xxx_cfg_eclass = SenzingTypedef::from_json_data(Array[CfgEclass], data["XXX_CFG_ECLASS"])
      out.xxx_cfg_etype = SenzingTypedef::from_json_data(Array[CfgEtype], data["XXX_CFG_ETYPE"])
      out.xxx_cfg_lens = SenzingTypedef::from_json_data(Array[CfgLens], data["XXX_CFG_LENS"])
      out.xxx_cfg_lensrl = SenzingTypedef::from_json_data(Array[CfgLensrl], data["XXX_CFG_LENSRL"])
      out
    end

    def to_json_data
      data = {}
      data["CFG_ATTR"] = SenzingTypedef::to_json_data(cfg_attr)
      data["CFG_CFBOM"] = SenzingTypedef::to_json_data(cfg_cfbom)
      data["CFG_CFCALL"] = SenzingTypedef::to_json_data(cfg_cfcall)
      data["CFG_CFRTN"] = SenzingTypedef::to_json_data(cfg_cfrtn)
      data["CFG_CFUNC"] = SenzingTypedef::to_json_data(cfg_cfunc)
      data["CFG_DFBOM"] = SenzingTypedef::to_json_data(cfg_dfbom)
      data["CFG_DFCALL"] = SenzingTypedef::to_json_data(cfg_dfcall)
      data["CFG_DFUNC"] = SenzingTypedef::to_json_data(cfg_dfunc)
      data["CFG_DSRC"] = SenzingTypedef::to_json_data(cfg_dsrc)
      data["CFG_DSRC_INTEREST"] = SenzingTypedef::to_json_data(cfg_dsrc_interest)
      data["CFG_EBOM"] = SenzingTypedef::to_json_data(cfg_ebom)
      data["CFG_EFBOM"] = SenzingTypedef::to_json_data(cfg_efbom)
      data["CFG_EFCALL"] = SenzingTypedef::to_json_data(cfg_efcall)
      data["CFG_EFUNC"] = SenzingTypedef::to_json_data(cfg_efunc)
      data["CFG_ERFRAG"] = SenzingTypedef::to_json_data(cfg_erfrag)
      data["CFG_ERRULE"] = SenzingTypedef::to_json_data(cfg_errule)
      data["CFG_FBOM"] = SenzingTypedef::to_json_data(cfg_fbom)
      data["CFG_FBOVR"] = SenzingTypedef::to_json_data(cfg_fbovr)
      data["CFG_FCLASS"] = SenzingTypedef::to_json_data(cfg_fclass)
      data["CFG_FELEM"] = SenzingTypedef::to_json_data(cfg_felem)
      data["CFG_FTYPE"] = SenzingTypedef::to_json_data(cfg_ftype)
      data["CFG_GENERIC_THRESHOLD"] = SenzingTypedef::to_json_data(cfg_generic_threshold)
      data["CFG_GPLAN"] = SenzingTypedef::to_json_data(cfg_gplan)
      data["CFG_RCLASS"] = SenzingTypedef::to_json_data(cfg_rclass)
      data["CFG_RTYPE"] = SenzingTypedef::to_json_data(cfg_rtype)
      data["CFG_SFCALL"] = SenzingTypedef::to_json_data(cfg_sfcall)
      data["CFG_SFUNC"] = SenzingTypedef::to_json_data(cfg_sfunc)
      data["CONFIG_BASE_VERSION"] = SenzingTypedef::to_json_data(config_base_version)
      data["SETTINGS"] = SenzingTypedef::to_json_data(settings)
      data["SYS_OOM"] = SenzingTypedef::to_json_data(sys_oom)
      data["XXX_CFG_ECLASS"] = SenzingTypedef::to_json_data(xxx_cfg_eclass)
      data["XXX_CFG_ETYPE"] = SenzingTypedef::to_json_data(xxx_cfg_etype)
      data["XXX_CFG_LENS"] = SenzingTypedef::to_json_data(xxx_cfg_lens)
      data["XXX_CFG_LENSRL"] = SenzingTypedef::to_json_data(xxx_cfg_lensrl)
      data
    end
  end

  class HowResults
    attr_accessor :final_state
    attr_accessor :resolution_steps

    def self.from_json_data(data)
      out = HowResults.new
      out.final_state = SenzingTypedef::from_json_data(FinalState, data["FINAL_STATE"])
      out.resolution_steps = SenzingTypedef::from_json_data(Array[ResolutionStep], data["RESOLUTION_STEPS"])
      out
    end

    def to_json_data
      data = {}
      data["FINAL_STATE"] = SenzingTypedef::to_json_data(final_state)
      data["RESOLUTION_STEPS"] = SenzingTypedef::to_json_data(resolution_steps)
      data
    end
  end

  class InterestingEntities
    attr_accessor :entities
    attr_accessor :notices

    def self.from_json_data(data)
      out = InterestingEntities.new
      out.entities = SenzingTypedef::from_json_data(Array[InterestingEntity], data["ENTITIES"])
      out.notices = SenzingTypedef::from_json_data(Array[Notice], data["NOTICES"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["NOTICES"] = SenzingTypedef::to_json_data(notices)
      data
    end
  end

  class InterestingEntity
    attr_accessor :degrees

    # The ENTITY_ID is the Senzing-generated identifier for the discovered
    # entity. It may change when new information is added.
    attr_accessor :entity_id
    attr_accessor :flags
    attr_accessor :sample_records

    def self.from_json_data(data)
      out = InterestingEntity.new
      out.degrees = SenzingTypedef::from_json_data(Integer, data["DEGREES"])
      out.entity_id = SenzingTypedef::from_json_data(Integer, data["ENTITY_ID"])
      out.flags = SenzingTypedef::from_json_data(Array[String], data["FLAGS"])
      out.sample_records = SenzingTypedef::from_json_data(Array[SampleRecord], data["SAMPLE_RECORDS"])
      out
    end

    def to_json_data
      data = {}
      data["DEGREES"] = SenzingTypedef::to_json_data(degrees)
      data["ENTITY_ID"] = SenzingTypedef::to_json_data(entity_id)
      data["FLAGS"] = SenzingTypedef::to_json_data(flags)
      data["SAMPLE_RECORDS"] = SenzingTypedef::to_json_data(sample_records)
      data
    end
  end

  class MatchInfo
    attr_accessor :candidate_keys

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :errule_code
    attr_accessor :feature_scores

    # Representation of matched source record features.
    attr_accessor :match_key
    attr_accessor :match_key_details

    # The type of match that occurred for the record.
    attr_accessor :match_level_code
    attr_accessor :xxx_disclosed_relations
    attr_accessor :xxx_match_level
    attr_accessor :xxx_why_errule_code
    attr_accessor :xxx_why_key

    def self.from_json_data(data)
      out = MatchInfo.new
      out.candidate_keys = SenzingTypedef::from_json_data(CandidateKeysForMatchInfo, data["CANDIDATE_KEYS"])
      out.errule_code = SenzingTypedef::from_json_data(String, data["ERRULE_CODE"])
      out.feature_scores = SenzingTypedef::from_json_data(FeatureScores, data["FEATURE_SCORES"])
      out.match_key = SenzingTypedef::from_json_data(String, data["MATCH_KEY"])
      out.match_key_details = SenzingTypedef::from_json_data(MatchKeyDetails, data["MATCH_KEY_DETAILS"])
      out.match_level_code = SenzingTypedef::from_json_data(String, data["MATCH_LEVEL_CODE"])
      out.xxx_disclosed_relations = SenzingTypedef::from_json_data(DisclosedRelationsForMatchInfo, data["XXX_DISCLOSED_RELATIONS"])
      out.xxx_match_level = SenzingTypedef::from_json_data(Integer, data["XXX_MATCH_LEVEL"])
      out.xxx_why_errule_code = SenzingTypedef::from_json_data(String, data["XXX_WHY_ERRULE_CODE"])
      out.xxx_why_key = SenzingTypedef::from_json_data(String, data["XXX_WHY_KEY"])
      out
    end

    def to_json_data
      data = {}
      data["CANDIDATE_KEYS"] = SenzingTypedef::to_json_data(candidate_keys)
      data["ERRULE_CODE"] = SenzingTypedef::to_json_data(errule_code)
      data["FEATURE_SCORES"] = SenzingTypedef::to_json_data(feature_scores)
      data["MATCH_KEY"] = SenzingTypedef::to_json_data(match_key)
      data["MATCH_KEY_DETAILS"] = SenzingTypedef::to_json_data(match_key_details)
      data["MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(match_level_code)
      data["XXX_DISCLOSED_RELATIONS"] = SenzingTypedef::to_json_data(xxx_disclosed_relations)
      data["XXX_MATCH_LEVEL"] = SenzingTypedef::to_json_data(xxx_match_level)
      data["XXX_WHY_ERRULE_CODE"] = SenzingTypedef::to_json_data(xxx_why_errule_code)
      data["XXX_WHY_KEY"] = SenzingTypedef::to_json_data(xxx_why_key)
      data
    end
  end

  class MatchInfoForAttribute
    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc
    attr_accessor :feat_id

    def self.from_json_data(data)
      out = MatchInfoForAttribute.new
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.feat_id = SenzingTypedef::from_json_data(Integer, data["FEAT_ID"])
      out
    end

    def to_json_data
      data = {}
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["FEAT_ID"] = SenzingTypedef::to_json_data(feat_id)
      data
    end
  end

  class MatchInfoForWhy
    attr_accessor :candidate_keys
    attr_accessor :disclosed_relations
    attr_accessor :feature_scores

    # The type of match that occurred for the record.
    attr_accessor :match_level_code
    attr_accessor :why_errule_code
    attr_accessor :why_key
    attr_accessor :why_key_details

    def self.from_json_data(data)
      out = MatchInfoForWhy.new
      out.candidate_keys = SenzingTypedef::from_json_data(Hash[String, Array[MatchInfoForAttribute]], data["CANDIDATE_KEYS"])
      out.disclosed_relations = SenzingTypedef::from_json_data(DisclosedRelationsForMatchInfoForWhy, data["DISCLOSED_RELATIONS"])
      out.feature_scores = SenzingTypedef::from_json_data(FeatureScores, data["FEATURE_SCORES"])
      out.match_level_code = SenzingTypedef::from_json_data(String, data["MATCH_LEVEL_CODE"])
      out.why_errule_code = SenzingTypedef::from_json_data(String, data["WHY_ERRULE_CODE"])
      out.why_key = SenzingTypedef::from_json_data(String, data["WHY_KEY"])
      out.why_key_details = SenzingTypedef::from_json_data(WhyKeyDetails, data["WHY_KEY_DETAILS"])
      out
    end

    def to_json_data
      data = {}
      data["CANDIDATE_KEYS"] = SenzingTypedef::to_json_data(candidate_keys)
      data["DISCLOSED_RELATIONS"] = SenzingTypedef::to_json_data(disclosed_relations)
      data["FEATURE_SCORES"] = SenzingTypedef::to_json_data(feature_scores)
      data["MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(match_level_code)
      data["WHY_ERRULE_CODE"] = SenzingTypedef::to_json_data(why_errule_code)
      data["WHY_KEY"] = SenzingTypedef::to_json_data(why_key)
      data["WHY_KEY_DETAILS"] = SenzingTypedef::to_json_data(why_key_details)
      data
    end
  end

  class MatchKeyDetails
    attr_accessor :confirmations
    attr_accessor :denials
    attr_accessor :disclosed_relations
    attr_accessor :rel_links

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :xxx_errule_code

    def self.from_json_data(data)
      out = MatchKeyDetails.new
      out.confirmations = SenzingTypedef::from_json_data(Array[Confirmation], data["CONFIRMATIONS"])
      out.denials = SenzingTypedef::from_json_data(Array[Confirmation], data["DENIALS"])
      out.disclosed_relations = SenzingTypedef::from_json_data(Array[DisclosedRelationsForMatchInfo], data["DISCLOSED_RELATIONS"])
      out.rel_links = SenzingTypedef::from_json_data(Array[RelLink], data["REL_LINKS"])
      out.xxx_errule_code = SenzingTypedef::from_json_data(String, data["XXX_ERRULE_CODE"])
      out
    end

    def to_json_data
      data = {}
      data["CONFIRMATIONS"] = SenzingTypedef::to_json_data(confirmations)
      data["DENIALS"] = SenzingTypedef::to_json_data(denials)
      data["DISCLOSED_RELATIONS"] = SenzingTypedef::to_json_data(disclosed_relations)
      data["REL_LINKS"] = SenzingTypedef::to_json_data(rel_links)
      data["XXX_ERRULE_CODE"] = SenzingTypedef::to_json_data(xxx_errule_code)
      data
    end
  end

  class MemberRecord
    # Internal identifier for the record.
    attr_accessor :internal_id
    attr_accessor :records

    def self.from_json_data(data)
      out = MemberRecord.new
      out.internal_id = SenzingTypedef::from_json_data(Integer, data["INTERNAL_ID"])
      out.records = SenzingTypedef::from_json_data(Array[Record], data["RECORDS"])
      out
    end

    def to_json_data
      data = {}
      data["INTERNAL_ID"] = SenzingTypedef::to_json_data(internal_id)
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data
    end
  end

  class Notice
    attr_accessor :code
    attr_accessor :description

    def self.from_json_data(data)
      out = Notice.new
      out.code = SenzingTypedef::from_json_data(String, data["CODE"])
      out.description = SenzingTypedef::from_json_data(String, data["DESCRIPTION"])
      out
    end

    def to_json_data
      data = {}
      data["CODE"] = SenzingTypedef::to_json_data(code)
      data["DESCRIPTION"] = SenzingTypedef::to_json_data(description)
      data
    end
  end

  class Object
    attr_accessor :value

    def self.from_json_data(data)
      out = Object.new
      out.value = SenzingTypedef.from_json_data(String, data)
      out
    end

    def to_json_data
      SenzingTypedef.to_json_data(value)
    end
  end

  class Record
    # A label identifying the provenance of the record.
    attr_accessor :data_source

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :errule_code
    attr_accessor :features
    attr_accessor :feature_ids
    attr_accessor :first_seen_dt

    # Internal identifier for the record.
    attr_accessor :internal_id
    attr_accessor :json_data
    attr_accessor :last_seen_dt

    # Representation of matched source record features.
    attr_accessor :match_key

    # The type of match that occurred for the record.
    attr_accessor :match_level_code

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id
    attr_accessor :unmapped_data
    attr_accessor :xxx_address_data
    attr_accessor :xxx_attribute_data
    attr_accessor :xxx_entity_data
    attr_accessor :xxx_entity_desc
    attr_accessor :xxx_entity_key
    attr_accessor :xxx_entity_type
    attr_accessor :xxx_identifier_data
    attr_accessor :xxx_match_level
    attr_accessor :xxx_name_data
    attr_accessor :xxx_other_data
    attr_accessor :xxx_phone_data
    attr_accessor :xxx_relationship_data

    def self.from_json_data(data)
      out = Record.new
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.errule_code = SenzingTypedef::from_json_data(String, data["ERRULE_CODE"])
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureForAttributes]], data["FEATURES"])
      out.feature_ids = SenzingTypedef::from_json_data(Array[FeatureID], data["FEATURE_IDS"])
      out.first_seen_dt = SenzingTypedef::from_json_data(DateTime, data["FIRST_SEEN_DT"])
      out.internal_id = SenzingTypedef::from_json_data(Integer, data["INTERNAL_ID"])
      out.json_data = SenzingTypedef::from_json_data(Hash[String, Object], data["JSON_DATA"])
      out.last_seen_dt = SenzingTypedef::from_json_data(DateTime, data["LAST_SEEN_DT"])
      out.match_key = SenzingTypedef::from_json_data(String, data["MATCH_KEY"])
      out.match_level_code = SenzingTypedef::from_json_data(String, data["MATCH_LEVEL_CODE"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out.unmapped_data = SenzingTypedef::from_json_data(Hash[String, Object], data["UNMAPPED_DATA"])
      out.xxx_address_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ADDRESS_DATA"])
      out.xxx_attribute_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ATTRIBUTE_DATA"])
      out.xxx_entity_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ENTITY_DATA"])
      out.xxx_entity_desc = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_DESC"])
      out.xxx_entity_key = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_KEY"])
      out.xxx_entity_type = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_TYPE"])
      out.xxx_identifier_data = SenzingTypedef::from_json_data(Array[String], data["XXX_IDENTIFIER_DATA"])
      out.xxx_match_level = SenzingTypedef::from_json_data(Integer, data["XXX_MATCH_LEVEL"])
      out.xxx_name_data = SenzingTypedef::from_json_data(Array[String], data["XXX_NAME_DATA"])
      out.xxx_other_data = SenzingTypedef::from_json_data(Array[String], data["XXX_OTHER_DATA"])
      out.xxx_phone_data = SenzingTypedef::from_json_data(Array[String], data["XXX_PHONE_DATA"])
      out.xxx_relationship_data = SenzingTypedef::from_json_data(Array[String], data["XXX_RELATIONSHIP_DATA"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["ERRULE_CODE"] = SenzingTypedef::to_json_data(errule_code)
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["FEATURE_IDS"] = SenzingTypedef::to_json_data(feature_ids)
      data["FIRST_SEEN_DT"] = SenzingTypedef::to_json_data(first_seen_dt)
      data["INTERNAL_ID"] = SenzingTypedef::to_json_data(internal_id)
      data["JSON_DATA"] = SenzingTypedef::to_json_data(json_data)
      data["LAST_SEEN_DT"] = SenzingTypedef::to_json_data(last_seen_dt)
      data["MATCH_KEY"] = SenzingTypedef::to_json_data(match_key)
      data["MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(match_level_code)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data["UNMAPPED_DATA"] = SenzingTypedef::to_json_data(unmapped_data)
      data["XXX_ADDRESS_DATA"] = SenzingTypedef::to_json_data(xxx_address_data)
      data["XXX_ATTRIBUTE_DATA"] = SenzingTypedef::to_json_data(xxx_attribute_data)
      data["XXX_ENTITY_DATA"] = SenzingTypedef::to_json_data(xxx_entity_data)
      data["XXX_ENTITY_DESC"] = SenzingTypedef::to_json_data(xxx_entity_desc)
      data["XXX_ENTITY_KEY"] = SenzingTypedef::to_json_data(xxx_entity_key)
      data["XXX_ENTITY_TYPE"] = SenzingTypedef::to_json_data(xxx_entity_type)
      data["XXX_IDENTIFIER_DATA"] = SenzingTypedef::to_json_data(xxx_identifier_data)
      data["XXX_MATCH_LEVEL"] = SenzingTypedef::to_json_data(xxx_match_level)
      data["XXX_NAME_DATA"] = SenzingTypedef::to_json_data(xxx_name_data)
      data["XXX_OTHER_DATA"] = SenzingTypedef::to_json_data(xxx_other_data)
      data["XXX_PHONE_DATA"] = SenzingTypedef::to_json_data(xxx_phone_data)
      data["XXX_RELATIONSHIP_DATA"] = SenzingTypedef::to_json_data(xxx_relationship_data)
      data
    end
  end

  class RecordForGetEntity
    # A label identifying the provenance of the record.
    attr_accessor :data_source

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :errule_code
    attr_accessor :features
    attr_accessor :feature_ids
    attr_accessor :first_seen_dt

    # Internal identifier for the record.
    attr_accessor :internal_id
    attr_accessor :json_data
    attr_accessor :last_seen_dt

    # Representation of matched source record features.
    attr_accessor :match_key

    # The type of match that occurred for the record.
    attr_accessor :match_level_code

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id
    attr_accessor :unmapped_data
    attr_accessor :xxx_address_data
    attr_accessor :xxx_attribute_data
    attr_accessor :xxx_entity_data
    attr_accessor :xxx_entity_desc
    attr_accessor :xxx_entity_key
    attr_accessor :xxx_entity_type
    attr_accessor :xxx_identifier_data
    attr_accessor :xxx_match_level
    attr_accessor :xxx_name_data
    attr_accessor :xxx_other_data
    attr_accessor :xxx_phone_data
    attr_accessor :xxx_relationship_data

    def self.from_json_data(data)
      out = RecordForGetEntity.new
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.errule_code = SenzingTypedef::from_json_data(String, data["ERRULE_CODE"])
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureForAttributes]], data["FEATURES"])
      out.feature_ids = SenzingTypedef::from_json_data(Array[FeatureID], data["FEATURE_IDS"])
      out.first_seen_dt = SenzingTypedef::from_json_data(DateTime, data["FIRST_SEEN_DT"])
      out.internal_id = SenzingTypedef::from_json_data(Integer, data["INTERNAL_ID"])
      out.json_data = SenzingTypedef::from_json_data(Hash[String, Object], data["JSON_DATA"])
      out.last_seen_dt = SenzingTypedef::from_json_data(DateTime, data["LAST_SEEN_DT"])
      out.match_key = SenzingTypedef::from_json_data(String, data["MATCH_KEY"])
      out.match_level_code = SenzingTypedef::from_json_data(String, data["MATCH_LEVEL_CODE"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out.unmapped_data = SenzingTypedef::from_json_data(Hash[String, Object], data["UNMAPPED_DATA"])
      out.xxx_address_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ADDRESS_DATA"])
      out.xxx_attribute_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ATTRIBUTE_DATA"])
      out.xxx_entity_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ENTITY_DATA"])
      out.xxx_entity_desc = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_DESC"])
      out.xxx_entity_key = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_KEY"])
      out.xxx_entity_type = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_TYPE"])
      out.xxx_identifier_data = SenzingTypedef::from_json_data(Array[String], data["XXX_IDENTIFIER_DATA"])
      out.xxx_match_level = SenzingTypedef::from_json_data(Integer, data["XXX_MATCH_LEVEL"])
      out.xxx_name_data = SenzingTypedef::from_json_data(Array[String], data["XXX_NAME_DATA"])
      out.xxx_other_data = SenzingTypedef::from_json_data(Array[String], data["XXX_OTHER_DATA"])
      out.xxx_phone_data = SenzingTypedef::from_json_data(Array[String], data["XXX_PHONE_DATA"])
      out.xxx_relationship_data = SenzingTypedef::from_json_data(Array[String], data["XXX_RELATIONSHIP_DATA"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["ERRULE_CODE"] = SenzingTypedef::to_json_data(errule_code)
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["FEATURE_IDS"] = SenzingTypedef::to_json_data(feature_ids)
      data["FIRST_SEEN_DT"] = SenzingTypedef::to_json_data(first_seen_dt)
      data["INTERNAL_ID"] = SenzingTypedef::to_json_data(internal_id)
      data["JSON_DATA"] = SenzingTypedef::to_json_data(json_data)
      data["LAST_SEEN_DT"] = SenzingTypedef::to_json_data(last_seen_dt)
      data["MATCH_KEY"] = SenzingTypedef::to_json_data(match_key)
      data["MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(match_level_code)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data["UNMAPPED_DATA"] = SenzingTypedef::to_json_data(unmapped_data)
      data["XXX_ADDRESS_DATA"] = SenzingTypedef::to_json_data(xxx_address_data)
      data["XXX_ATTRIBUTE_DATA"] = SenzingTypedef::to_json_data(xxx_attribute_data)
      data["XXX_ENTITY_DATA"] = SenzingTypedef::to_json_data(xxx_entity_data)
      data["XXX_ENTITY_DESC"] = SenzingTypedef::to_json_data(xxx_entity_desc)
      data["XXX_ENTITY_KEY"] = SenzingTypedef::to_json_data(xxx_entity_key)
      data["XXX_ENTITY_TYPE"] = SenzingTypedef::to_json_data(xxx_entity_type)
      data["XXX_IDENTIFIER_DATA"] = SenzingTypedef::to_json_data(xxx_identifier_data)
      data["XXX_MATCH_LEVEL"] = SenzingTypedef::to_json_data(xxx_match_level)
      data["XXX_NAME_DATA"] = SenzingTypedef::to_json_data(xxx_name_data)
      data["XXX_OTHER_DATA"] = SenzingTypedef::to_json_data(xxx_other_data)
      data["XXX_PHONE_DATA"] = SenzingTypedef::to_json_data(xxx_phone_data)
      data["XXX_RELATIONSHIP_DATA"] = SenzingTypedef::to_json_data(xxx_relationship_data)
      data
    end
  end

  class RecordKey
    # A label identifying the provenance of the record.
    attr_accessor :data_source

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id

    def self.from_json_data(data)
      out = RecordKey.new
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data
    end
  end

  class RecordKeys
    # A list of (data source code, record id) pairs.
    attr_accessor :records

    def self.from_json_data(data)
      out = RecordKeys.new
      out.records = SenzingTypedef::from_json_data(Array[RecordKey], data["RECORDS"])
      out
    end

    def to_json_data
      data = {}
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data
    end
  end

  class RecordSummary
    # A label identifying the provenance of the record.
    attr_accessor :data_source

    # The number of records for the entity with the same data source code.
    attr_accessor :record_count
    attr_accessor :xxx_first_seen_dt
    attr_accessor :xxx_last_seen_dt

    def self.from_json_data(data)
      out = RecordSummary.new
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.record_count = SenzingTypedef::from_json_data(Integer, data["RECORD_COUNT"])
      out.xxx_first_seen_dt = SenzingTypedef::from_json_data(DateTime, data["XXX_FIRST_SEEN_DT"])
      out.xxx_last_seen_dt = SenzingTypedef::from_json_data(DateTime, data["XXX_LAST_SEEN_DT"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["RECORD_COUNT"] = SenzingTypedef::to_json_data(record_count)
      data["XXX_FIRST_SEEN_DT"] = SenzingTypedef::to_json_data(xxx_first_seen_dt)
      data["XXX_LAST_SEEN_DT"] = SenzingTypedef::to_json_data(xxx_last_seen_dt)
      data
    end
  end

  class RelAnchor
    attr_accessor :domain

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc
    attr_accessor :feat_id
    attr_accessor :linked_feat_desc
    attr_accessor :linked_feat_id
    attr_accessor :linked_feat_type
    attr_accessor :linked_feat_usage_type
    attr_accessor :xxx_rel_pointer

    def self.from_json_data(data)
      out = RelAnchor.new
      out.domain = SenzingTypedef::from_json_data(String, data["DOMAIN"])
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.feat_id = SenzingTypedef::from_json_data(Integer, data["FEAT_ID"])
      out.linked_feat_desc = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_DESC"])
      out.linked_feat_id = SenzingTypedef::from_json_data(Integer, data["LINKED_FEAT_ID"])
      out.linked_feat_type = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_TYPE"])
      out.linked_feat_usage_type = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_USAGE_TYPE"])
      out.xxx_rel_pointer = SenzingTypedef::from_json_data(Array[RelPointer], data["XXX_REL_POINTER"])
      out
    end

    def to_json_data
      data = {}
      data["DOMAIN"] = SenzingTypedef::to_json_data(domain)
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["FEAT_ID"] = SenzingTypedef::to_json_data(feat_id)
      data["LINKED_FEAT_DESC"] = SenzingTypedef::to_json_data(linked_feat_desc)
      data["LINKED_FEAT_ID"] = SenzingTypedef::to_json_data(linked_feat_id)
      data["LINKED_FEAT_TYPE"] = SenzingTypedef::to_json_data(linked_feat_type)
      data["LINKED_FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(linked_feat_usage_type)
      data["XXX_REL_POINTER"] = SenzingTypedef::to_json_data(xxx_rel_pointer)
      data
    end
  end

  class RelLink
    attr_accessor :domain

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc
    attr_accessor :feat_id
    attr_accessor :feat_usage_type
    attr_accessor :ftype_code
    attr_accessor :linked_feat_desc
    attr_accessor :linked_feat_id
    attr_accessor :linked_feat_type
    attr_accessor :linked_feat_usage_type
    attr_accessor :rel_type

    def self.from_json_data(data)
      out = RelLink.new
      out.domain = SenzingTypedef::from_json_data(String, data["DOMAIN"])
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.feat_id = SenzingTypedef::from_json_data(Integer, data["FEAT_ID"])
      out.feat_usage_type = SenzingTypedef::from_json_data(String, data["FEAT_USAGE_TYPE"])
      out.ftype_code = SenzingTypedef::from_json_data(String, data["FTYPE_CODE"])
      out.linked_feat_desc = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_DESC"])
      out.linked_feat_id = SenzingTypedef::from_json_data(Integer, data["LINKED_FEAT_ID"])
      out.linked_feat_type = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_TYPE"])
      out.linked_feat_usage_type = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_USAGE_TYPE"])
      out.rel_type = SenzingTypedef::from_json_data(String, data["REL_TYPE"])
      out
    end

    def to_json_data
      data = {}
      data["DOMAIN"] = SenzingTypedef::to_json_data(domain)
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["FEAT_ID"] = SenzingTypedef::to_json_data(feat_id)
      data["FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(feat_usage_type)
      data["FTYPE_CODE"] = SenzingTypedef::to_json_data(ftype_code)
      data["LINKED_FEAT_DESC"] = SenzingTypedef::to_json_data(linked_feat_desc)
      data["LINKED_FEAT_ID"] = SenzingTypedef::to_json_data(linked_feat_id)
      data["LINKED_FEAT_TYPE"] = SenzingTypedef::to_json_data(linked_feat_type)
      data["LINKED_FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(linked_feat_usage_type)
      data["REL_TYPE"] = SenzingTypedef::to_json_data(rel_type)
      data
    end
  end

  class RelPointer
    attr_accessor :domain

    # Describes the attributes that make up the feature.
    attr_accessor :feat_desc
    attr_accessor :feat_id
    attr_accessor :feat_usage_type
    attr_accessor :linked_feat_desc
    attr_accessor :linked_feat_id
    attr_accessor :linked_feat_type

    def self.from_json_data(data)
      out = RelPointer.new
      out.domain = SenzingTypedef::from_json_data(String, data["DOMAIN"])
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.feat_id = SenzingTypedef::from_json_data(Integer, data["FEAT_ID"])
      out.feat_usage_type = SenzingTypedef::from_json_data(String, data["FEAT_USAGE_TYPE"])
      out.linked_feat_desc = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_DESC"])
      out.linked_feat_id = SenzingTypedef::from_json_data(Integer, data["LINKED_FEAT_ID"])
      out.linked_feat_type = SenzingTypedef::from_json_data(String, data["LINKED_FEAT_TYPE"])
      out
    end

    def to_json_data
      data = {}
      data["DOMAIN"] = SenzingTypedef::to_json_data(domain)
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["FEAT_ID"] = SenzingTypedef::to_json_data(feat_id)
      data["FEAT_USAGE_TYPE"] = SenzingTypedef::to_json_data(feat_usage_type)
      data["LINKED_FEAT_DESC"] = SenzingTypedef::to_json_data(linked_feat_desc)
      data["LINKED_FEAT_ID"] = SenzingTypedef::to_json_data(linked_feat_id)
      data["LINKED_FEAT_TYPE"] = SenzingTypedef::to_json_data(linked_feat_type)
      data
    end
  end

  class RelatedEntity
    # The ENTITY_ID is the Senzing-generated identifier for the discovered
    # entity. It may change when new information is added.
    attr_accessor :entity_id

    # A name this entity goes by. An entity could have multiple names.
    attr_accessor :entity_name

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :errule_code

    # Indicates if this is an ambiguous relationship.
    attr_accessor :is_ambiguous

    # Indicates if this is a disclosed relationship.
    attr_accessor :is_disclosed

    # Representation of matched source record features.
    attr_accessor :match_key
    attr_accessor :match_key_details
    attr_accessor :match_level

    # The type of match that occurred for the record.
    attr_accessor :match_level_code
    attr_accessor :records

    # Overview of the source systems the records came from comprising this
    # related entity.
    attr_accessor :record_summary
    attr_accessor :record_types
    attr_accessor :xxx_last_seen_dt

    def self.from_json_data(data)
      out = RelatedEntity.new
      out.entity_id = SenzingTypedef::from_json_data(Integer, data["ENTITY_ID"])
      out.entity_name = SenzingTypedef::from_json_data(String, data["ENTITY_NAME"])
      out.errule_code = SenzingTypedef::from_json_data(String, data["ERRULE_CODE"])
      out.is_ambiguous = SenzingTypedef::from_json_data(Integer, data["IS_AMBIGUOUS"])
      out.is_disclosed = SenzingTypedef::from_json_data(Integer, data["IS_DISCLOSED"])
      out.match_key = SenzingTypedef::from_json_data(String, data["MATCH_KEY"])
      out.match_key_details = SenzingTypedef::from_json_data(MatchKeyDetails, data["MATCH_KEY_DETAILS"])
      out.match_level = SenzingTypedef::from_json_data(Integer, data["MATCH_LEVEL"])
      out.match_level_code = SenzingTypedef::from_json_data(String, data["MATCH_LEVEL_CODE"])
      out.records = SenzingTypedef::from_json_data(Array[Record], data["RECORDS"])
      out.record_summary = SenzingTypedef::from_json_data(Array[RecordSummary], data["RECORD_SUMMARY"])
      out.record_types = SenzingTypedef::from_json_data(Array[String], data["RECORD_TYPES"])
      out.xxx_last_seen_dt = SenzingTypedef::from_json_data(DateTime, data["XXX_LAST_SEEN_DT"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITY_ID"] = SenzingTypedef::to_json_data(entity_id)
      data["ENTITY_NAME"] = SenzingTypedef::to_json_data(entity_name)
      data["ERRULE_CODE"] = SenzingTypedef::to_json_data(errule_code)
      data["IS_AMBIGUOUS"] = SenzingTypedef::to_json_data(is_ambiguous)
      data["IS_DISCLOSED"] = SenzingTypedef::to_json_data(is_disclosed)
      data["MATCH_KEY"] = SenzingTypedef::to_json_data(match_key)
      data["MATCH_KEY_DETAILS"] = SenzingTypedef::to_json_data(match_key_details)
      data["MATCH_LEVEL"] = SenzingTypedef::to_json_data(match_level)
      data["MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(match_level_code)
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data["RECORD_SUMMARY"] = SenzingTypedef::to_json_data(record_summary)
      data["RECORD_TYPES"] = SenzingTypedef::to_json_data(record_types)
      data["XXX_LAST_SEEN_DT"] = SenzingTypedef::to_json_data(xxx_last_seen_dt)
      data
    end
  end

  class RelatedRoles
    attr_accessor :feat_desc
    attr_accessor :role

    def self.from_json_data(data)
      out = RelatedRoles.new
      out.feat_desc = SenzingTypedef::from_json_data(String, data["FEAT_DESC"])
      out.role = SenzingTypedef::from_json_data(String, data["ROLE"])
      out
    end

    def to_json_data
      data = {}
      data["FEAT_DESC"] = SenzingTypedef::to_json_data(feat_desc)
      data["ROLE"] = SenzingTypedef::to_json_data(role)
      data
    end
  end

  class Repository
    # Label for database repository.
    attr_accessor :id

    # Database connection information.
    attr_accessor :location

    # Type of database.
    attr_accessor :type

    def self.from_json_data(data)
      out = Repository.new
      out.id = SenzingTypedef::from_json_data(String, data["id"])
      out.location = SenzingTypedef::from_json_data(String, data["location"])
      out.type = SenzingTypedef::from_json_data(String, data["type"])
      out
    end

    def to_json_data
      data = {}
      data["id"] = SenzingTypedef::to_json_data(id)
      data["location"] = SenzingTypedef::to_json_data(location)
      data["type"] = SenzingTypedef::to_json_data(type)
      data
    end
  end

  class ResolutionStep
    attr_accessor :inbound_virtual_entity_id
    attr_accessor :match_info
    attr_accessor :result_virtual_entity_id
    attr_accessor :step
    attr_accessor :virtual_entity
    attr_accessor :virtual_entity0

    def self.from_json_data(data)
      out = ResolutionStep.new
      out.inbound_virtual_entity_id = SenzingTypedef::from_json_data(String, data["INBOUND_VIRTUAL_ENTITY_ID"])
      out.match_info = SenzingTypedef::from_json_data(MatchInfo, data["MATCH_INFO"])
      out.result_virtual_entity_id = SenzingTypedef::from_json_data(String, data["RESULT_VIRTUAL_ENTITY_ID"])
      out.step = SenzingTypedef::from_json_data(Integer, data["STEP"])
      out.virtual_entity = SenzingTypedef::from_json_data(VirtualEntitySynopsis, data["VIRTUAL_ENTITY_1"])
      out.virtual_entity0 = SenzingTypedef::from_json_data(VirtualEntitySynopsis, data["VIRTUAL_ENTITY_2"])
      out
    end

    def to_json_data
      data = {}
      data["INBOUND_VIRTUAL_ENTITY_ID"] = SenzingTypedef::to_json_data(inbound_virtual_entity_id)
      data["MATCH_INFO"] = SenzingTypedef::to_json_data(match_info)
      data["RESULT_VIRTUAL_ENTITY_ID"] = SenzingTypedef::to_json_data(result_virtual_entity_id)
      data["STEP"] = SenzingTypedef::to_json_data(step)
      data["VIRTUAL_ENTITY_1"] = SenzingTypedef::to_json_data(virtual_entity)
      data["VIRTUAL_ENTITY_2"] = SenzingTypedef::to_json_data(virtual_entity0)
      data
    end
  end

  class ResolvedEntity
    # The ENTITY_ID is the Senzing-generated identifier for the discovered
    # entity. It may change when new information is added.
    attr_accessor :entity_id

    # A name this entity goes by. An entity could have multiple names.
    attr_accessor :entity_name
    attr_accessor :features
    attr_accessor :records

    # Overview of the source systems the records came from comprising this
    # related entity.
    attr_accessor :record_summary
    attr_accessor :record_types

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :xxx_errule_code
    attr_accessor :xxx_feature_ids

    # Indicates if this is an ambiguous relationship.
    attr_accessor :xxx_is_ambiguous

    # Indicates if this is a disclosed relationship.
    attr_accessor :xxx_is_disclosed
    attr_accessor :xxx_last_seen_dt

    # Representation of matched source record features.
    attr_accessor :xxx_match_key
    attr_accessor :xxx_match_level

    # The type of match that occurred for the record.
    attr_accessor :xxx_match_level_code

    def self.from_json_data(data)
      out = ResolvedEntity.new
      out.entity_id = SenzingTypedef::from_json_data(Integer, data["ENTITY_ID"])
      out.entity_name = SenzingTypedef::from_json_data(String, data["ENTITY_NAME"])
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureForAttributes]], data["FEATURES"])
      out.records = SenzingTypedef::from_json_data(Array[Record], data["RECORDS"])
      out.record_summary = SenzingTypedef::from_json_data(Array[RecordSummary], data["RECORD_SUMMARY"])
      out.record_types = SenzingTypedef::from_json_data(Array[String], data["RECORD_TYPES"])
      out.xxx_errule_code = SenzingTypedef::from_json_data(String, data["XXX_ERRULE_CODE"])
      out.xxx_feature_ids = SenzingTypedef::from_json_data(Array[FeatureID], data["XXX_FEATURE_IDS"])
      out.xxx_is_ambiguous = SenzingTypedef::from_json_data(Integer, data["XXX_IS_AMBIGUOUS"])
      out.xxx_is_disclosed = SenzingTypedef::from_json_data(Integer, data["XXX_IS_DISCLOSED"])
      out.xxx_last_seen_dt = SenzingTypedef::from_json_data(DateTime, data["XXX_LAST_SEEN_DT"])
      out.xxx_match_key = SenzingTypedef::from_json_data(String, data["XXX_MATCH_KEY"])
      out.xxx_match_level = SenzingTypedef::from_json_data(Integer, data["XXX_MATCH_LEVEL"])
      out.xxx_match_level_code = SenzingTypedef::from_json_data(String, data["XXX_MATCH_LEVEL_CODE"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITY_ID"] = SenzingTypedef::to_json_data(entity_id)
      data["ENTITY_NAME"] = SenzingTypedef::to_json_data(entity_name)
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data["RECORD_SUMMARY"] = SenzingTypedef::to_json_data(record_summary)
      data["RECORD_TYPES"] = SenzingTypedef::to_json_data(record_types)
      data["XXX_ERRULE_CODE"] = SenzingTypedef::to_json_data(xxx_errule_code)
      data["XXX_FEATURE_IDS"] = SenzingTypedef::to_json_data(xxx_feature_ids)
      data["XXX_IS_AMBIGUOUS"] = SenzingTypedef::to_json_data(xxx_is_ambiguous)
      data["XXX_IS_DISCLOSED"] = SenzingTypedef::to_json_data(xxx_is_disclosed)
      data["XXX_LAST_SEEN_DT"] = SenzingTypedef::to_json_data(xxx_last_seen_dt)
      data["XXX_MATCH_KEY"] = SenzingTypedef::to_json_data(xxx_match_key)
      data["XXX_MATCH_LEVEL"] = SenzingTypedef::to_json_data(xxx_match_level)
      data["XXX_MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(xxx_match_level_code)
      data
    end
  end

  class ResolvedEntityAndMatchInfo
    attr_accessor :entity
    attr_accessor :features_mjd
    attr_accessor :match_info

    def self.from_json_data(data)
      out = ResolvedEntityAndMatchInfo.new
      out.entity = SenzingTypedef::from_json_data(EntityForResolvedEntity, data["ENTITY"])
      out.features_mjd = SenzingTypedef::from_json_data(EntityForResolvedEntity, data["FEATURES_MJD"])
      out.match_info = SenzingTypedef::from_json_data(MatchInfo, data["MATCH_INFO"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITY"] = SenzingTypedef::to_json_data(entity)
      data["FEATURES_MJD"] = SenzingTypedef::to_json_data(features_mjd)
      data["MATCH_INFO"] = SenzingTypedef::to_json_data(match_info)
      data
    end
  end

  class ResolvedEntityForGetEntity
    # The ENTITY_ID is the Senzing-generated identifier for the discovered
    # entity. It may change when new information is added.
    attr_accessor :entity_id

    # A name this entity goes by. An entity could have multiple names.
    attr_accessor :entity_name
    attr_accessor :features
    attr_accessor :records

    # Overview of the source systems the records came from comprising this
    # related entity.
    attr_accessor :record_summary
    attr_accessor :record_types

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :xxx_errule_code
    attr_accessor :xxx_feature_ids

    # Indicates if this is an ambiguous relationship.
    attr_accessor :xxx_is_ambiguous

    # Indicates if this is a disclosed relationship.
    attr_accessor :xxx_is_disclosed
    attr_accessor :xxx_last_seen_dt

    # Representation of matched source record features.
    attr_accessor :xxx_match_key
    attr_accessor :xxx_match_level

    # The type of match that occurred for the record.
    attr_accessor :xxx_match_level_code

    def self.from_json_data(data)
      out = ResolvedEntityForGetEntity.new
      out.entity_id = SenzingTypedef::from_json_data(Integer, data["ENTITY_ID"])
      out.entity_name = SenzingTypedef::from_json_data(String, data["ENTITY_NAME"])
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureForGetEntity]], data["FEATURES"])
      out.records = SenzingTypedef::from_json_data(Array[RecordForGetEntity], data["RECORDS"])
      out.record_summary = SenzingTypedef::from_json_data(Array[RecordSummary], data["RECORD_SUMMARY"])
      out.record_types = SenzingTypedef::from_json_data(Array[String], data["RECORD_TYPES"])
      out.xxx_errule_code = SenzingTypedef::from_json_data(String, data["XXX_ERRULE_CODE"])
      out.xxx_feature_ids = SenzingTypedef::from_json_data(Array[FeatureID], data["XXX_FEATURE_IDS"])
      out.xxx_is_ambiguous = SenzingTypedef::from_json_data(Integer, data["XXX_IS_AMBIGUOUS"])
      out.xxx_is_disclosed = SenzingTypedef::from_json_data(Integer, data["XXX_IS_DISCLOSED"])
      out.xxx_last_seen_dt = SenzingTypedef::from_json_data(DateTime, data["XXX_LAST_SEEN_DT"])
      out.xxx_match_key = SenzingTypedef::from_json_data(String, data["XXX_MATCH_KEY"])
      out.xxx_match_level = SenzingTypedef::from_json_data(Integer, data["XXX_MATCH_LEVEL"])
      out.xxx_match_level_code = SenzingTypedef::from_json_data(String, data["XXX_MATCH_LEVEL_CODE"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITY_ID"] = SenzingTypedef::to_json_data(entity_id)
      data["ENTITY_NAME"] = SenzingTypedef::to_json_data(entity_name)
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data["RECORD_SUMMARY"] = SenzingTypedef::to_json_data(record_summary)
      data["RECORD_TYPES"] = SenzingTypedef::to_json_data(record_types)
      data["XXX_ERRULE_CODE"] = SenzingTypedef::to_json_data(xxx_errule_code)
      data["XXX_FEATURE_IDS"] = SenzingTypedef::to_json_data(xxx_feature_ids)
      data["XXX_IS_AMBIGUOUS"] = SenzingTypedef::to_json_data(xxx_is_ambiguous)
      data["XXX_IS_DISCLOSED"] = SenzingTypedef::to_json_data(xxx_is_disclosed)
      data["XXX_LAST_SEEN_DT"] = SenzingTypedef::to_json_data(xxx_last_seen_dt)
      data["XXX_MATCH_KEY"] = SenzingTypedef::to_json_data(xxx_match_key)
      data["XXX_MATCH_LEVEL"] = SenzingTypedef::to_json_data(xxx_match_level)
      data["XXX_MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(xxx_match_level_code)
      data
    end
  end

  class SysOom
    attr_accessor :ftype_id
    attr_accessor :next_thresh
    attr_accessor :oom_level
    attr_accessor :oom_type
    attr_accessor :thresh1_cnt
    attr_accessor :thresh1_oom
    attr_accessor :xxx_felem_id
    attr_accessor :xxx_lens_id
    attr_accessor :xxx_lib_feat_id
    attr_accessor :xxx_lib_felem_id

    def self.from_json_data(data)
      out = SysOom.new
      out.ftype_id = SenzingTypedef::from_json_data(Integer, data["FTYPE_ID"])
      out.next_thresh = SenzingTypedef::from_json_data(Integer, data["NEXT_THRESH"])
      out.oom_level = SenzingTypedef::from_json_data(String, data["OOM_LEVEL"])
      out.oom_type = SenzingTypedef::from_json_data(String, data["OOM_TYPE"])
      out.thresh1_cnt = SenzingTypedef::from_json_data(Integer, data["THRESH1_CNT"])
      out.thresh1_oom = SenzingTypedef::from_json_data(Integer, data["THRESH1_OOM"])
      out.xxx_felem_id = SenzingTypedef::from_json_data(Integer, data["XXX_FELEM_ID"])
      out.xxx_lens_id = SenzingTypedef::from_json_data(Integer, data["XXX_LENS_ID"])
      out.xxx_lib_feat_id = SenzingTypedef::from_json_data(Integer, data["XXX_LIB_FEAT_ID"])
      out.xxx_lib_felem_id = SenzingTypedef::from_json_data(Integer, data["XXX_LIB_FELEM_ID"])
      out
    end

    def to_json_data
      data = {}
      data["FTYPE_ID"] = SenzingTypedef::to_json_data(ftype_id)
      data["NEXT_THRESH"] = SenzingTypedef::to_json_data(next_thresh)
      data["OOM_LEVEL"] = SenzingTypedef::to_json_data(oom_level)
      data["OOM_TYPE"] = SenzingTypedef::to_json_data(oom_type)
      data["THRESH1_CNT"] = SenzingTypedef::to_json_data(thresh1_cnt)
      data["THRESH1_OOM"] = SenzingTypedef::to_json_data(thresh1_oom)
      data["XXX_FELEM_ID"] = SenzingTypedef::to_json_data(xxx_felem_id)
      data["XXX_LENS_ID"] = SenzingTypedef::to_json_data(xxx_lens_id)
      data["XXX_LIB_FEAT_ID"] = SenzingTypedef::to_json_data(xxx_lib_feat_id)
      data["XXX_LIB_FELEM_ID"] = SenzingTypedef::to_json_data(xxx_lib_felem_id)
      data
    end
  end

  class SampleRecord
    # A label identifying the provenance of the record.
    attr_accessor :data_source
    attr_accessor :flags

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id

    def self.from_json_data(data)
      out = SampleRecord.new
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.flags = SenzingTypedef::from_json_data(Array[String], data["FLAGS"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["FLAGS"] = SenzingTypedef::to_json_data(flags)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data
    end
  end

  class SchemaVersion
    attr_accessor :engine_schema_version
    attr_accessor :maximum_required_schema_version
    attr_accessor :minimum_required_schema_version

    def self.from_json_data(data)
      out = SchemaVersion.new
      out.engine_schema_version = SenzingTypedef::from_json_data(String, data["ENGINE_SCHEMA_VERSION"])
      out.maximum_required_schema_version = SenzingTypedef::from_json_data(String, data["MAXIMUM_REQUIRED_SCHEMA_VERSION"])
      out.minimum_required_schema_version = SenzingTypedef::from_json_data(String, data["MINIMUM_REQUIRED_SCHEMA_VERSION"])
      out
    end

    def to_json_data
      data = {}
      data["ENGINE_SCHEMA_VERSION"] = SenzingTypedef::to_json_data(engine_schema_version)
      data["MAXIMUM_REQUIRED_SCHEMA_VERSION"] = SenzingTypedef::to_json_data(maximum_required_schema_version)
      data["MINIMUM_REQUIRED_SCHEMA_VERSION"] = SenzingTypedef::to_json_data(minimum_required_schema_version)
      data
    end
  end

  class SearchEntity
    attr_accessor :features
    attr_accessor :summary

    def self.from_json_data(data)
      out = SearchEntity.new
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureDescriptionValue]], data["FEATURES"])
      out.summary = SenzingTypedef::from_json_data(SearchEntitySummary, data["SUMMARY"])
      out
    end

    def to_json_data
      data = {}
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["SUMMARY"] = SenzingTypedef::to_json_data(summary)
      data
    end
  end

  class SearchEntitySummary
    attr_accessor :features_added
    attr_accessor :features_ignored
    attr_accessor :features_searched
    attr_accessor :features_submitted

    def self.from_json_data(data)
      out = SearchEntitySummary.new
      out.features_added = SenzingTypedef::from_json_data(Integer, data["FEATURES_ADDED"])
      out.features_ignored = SenzingTypedef::from_json_data(Integer, data["FEATURES_IGNORED"])
      out.features_searched = SenzingTypedef::from_json_data(Integer, data["FEATURES_SEARCHED"])
      out.features_submitted = SenzingTypedef::from_json_data(Integer, data["FEATURES_SUBMITTED"])
      out
    end

    def to_json_data
      data = {}
      data["FEATURES_ADDED"] = SenzingTypedef::to_json_data(features_added)
      data["FEATURES_IGNORED"] = SenzingTypedef::to_json_data(features_ignored)
      data["FEATURES_SEARCHED"] = SenzingTypedef::to_json_data(features_searched)
      data["FEATURES_SUBMITTED"] = SenzingTypedef::to_json_data(features_submitted)
      data
    end
  end

  class SearchRequest
    attr_accessor :features
    attr_accessor :json_data
    attr_accessor :search_profile

    def self.from_json_data(data)
      out = SearchRequest.new
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureDescriptionValue]], data["FEATURES"])
      out.json_data = SenzingTypedef::from_json_data(String, data["JSON_DATA"])
      out.search_profile = SenzingTypedef::from_json_data(String, data["SEARCH_PROFILE"])
      out
    end

    def to_json_data
      data = {}
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["JSON_DATA"] = SenzingTypedef::to_json_data(json_data)
      data["SEARCH_PROFILE"] = SenzingTypedef::to_json_data(search_profile)
      data
    end
  end

  class SearchStatistic
    attr_accessor :candidate_keys

    def self.from_json_data(data)
      out = SearchStatistic.new
      out.candidate_keys = SenzingTypedef::from_json_data(CandidateKeysForSearchStatistic, data["CANDIDATE_KEYS"])
      out
    end

    def to_json_data
      data = {}
      data["CANDIDATE_KEYS"] = SenzingTypedef::to_json_data(candidate_keys)
      data
    end
  end

  class SenzingEntitySpecification
    # Domain/system for the account number. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :account_domain

    # Account number (e.g., bank, card). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :account_number

    # City/locality. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_city

    # Country code. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_country

    # Single-field address when parsed components are unavailable.
    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_full

    # First address line (street, number). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_line1

    # Second address line (apt/suite). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_line2

    # Third address line (optional). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_line3

    # Fourth address line (optional). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_line4

    # Fifth address line (optional). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_line5

    # Sixth address line (optional). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_line6

    # Postal/ZIP code. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_postal_code

    # State/province/region code. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_state

    # Optional; include when provided by the source. Common
    # values: HOME, MAILING (persons); BUSINESS (organizations).
    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :addr_type

    # Country of citizenship (code or label) as provided by the
    # source. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :citizenship

    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :date_of_birth

    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :date_of_death

    # Driver's license number. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :drivers_license_number

    # Issuing state/province/country. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :drivers_license_state

    # Dun and Bradstreet company identifier. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :duns_number

    # Email address. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :email_address

    # This is the name of the organization the person is employed
    # by. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :employer
    attr_accessor :employer_name

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :facebook

    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :gender

    # The identifier the entity is associated with. An
    # attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :group_assn_id_number

    # The type of group identifier an entity is associated with.
    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :group_assn_id_type

    # Name of the associated organization; use the official or standardized
    # name. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :group_association_org_name

    # Specific group/role within the organization; use precise
    # categories (e.g., OWNER_EXEC, BOARD_MEMBER) to improve
    # resolution. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :group_association_type

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :instagram

    # Legal Entity Identifier. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :lei_number

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :linkedin

    # Person given name. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :name_first

    # Single-field name when type (person vs org) is unknown or only a full
    # name is provided. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :name_full

    # Person surname. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :name_last

    # Person middle name/initial. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :name_middle

    # Organization name. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :name_org

    # Person title. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :name_prefix

    # Person suffix. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :name_suffix

    # Optional include when the source provides it. Common values: PRIMARY,
    # AKA (persons), DBA (organizations). An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :name_type

    # Country of nationality (code or label) as provided by the
    # source. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :nationality

    # Issuing country. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :national_id_country

    # National identifier value. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :national_id_number

    # Use the type label from the source; standardize across
    # sources. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :national_id_type
    attr_accessor :native_name_full

    # US healthcare provider identifier. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :npi_number

    # Optional as country often not known or issued by an organization.
    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :other_id_country

    # Identification number. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :other_id_number

    # Standardized source type. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :other_id_type

    # Issuing country. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :passport_country

    # Passport number. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :passport_number

    # Telephone number. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :phone_number

    # Optional; include when provided by the source. Common
    # values: MOBILE, HOME, WORK, FAX. MOBILE carries extra
    # weight. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :phone_type

    # Place of birth; may be a city/region or a country code/label as provided
    # by the source. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :place_of_birth
    attr_accessor :primary_name_first
    attr_accessor :primary_name_full
    attr_accessor :primary_name_last
    attr_accessor :primary_name_middle
    attr_accessor :primary_name_org

    # Include when known to prevent cross-type resolution; omit if unknown.
    # Use standardized kinds (PERSON, ORGANIZATION). Often used to determine
    # icon/shape in graphs. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :record_type

    # Country of registration (code or label) as provided by the
    # source. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :registration_country

    # Organization registration/incorporation date. An
    # attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :registration_date
    attr_accessor :relationship_key
    attr_accessor :relationship_type

    # This code helps keep the REL_ANCHOR_KEY unique. This is a code (without
    # dashes) for the data source or source field that is contributing the
    # relationship. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :rel_anchor_domain

    # This key should be a unique value for the record within the
    # REL_ANCHOR_DOMAIN. You can just use the current record's RECORD_ID
    # here. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :rel_anchor_key

    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :rel_pointer_domain

    # An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :rel_pointer_key

    # This is the role the pointer record has to the anchor record. Such
    # as SPOUSE_OF, SON_OF, FATHER_OF, EMPLOYED_BY, PRINCIPAL_OF, OWNER_OF,
    # BRANCH_OF, DIRECT_PARENT, ULTIMATE_PARENT. Standardize these role
    # codes for display and filtering. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :rel_pointer_role
    attr_accessor :secondary_name_org

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :signal

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :skype

    # US Social Security Number; partial accepted. An
    # attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :ssn_number

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :tango

    # Issuing country. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :tax_id_country

    # Tax identification number. An attribute in the Senzing Entity
    # Specification. See https://www.senzing.com/docs/entity_specification
    attr_accessor :tax_id_number

    # Use the type label from the source; standardize across
    # sources. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :tax_id_type

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :telegram

    # The identifier value shared by records that must resolve
    # together. An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :trusted_id_number

    # Short code for the identifier domain/system (e.g., STEWARD,
    # MASTER_ID). An attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :trusted_id_type

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :twitter

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :viber

    # Website or domain; typically for organizations. An
    # attribute in the Senzing Entity Specification. See
    # https://www.senzing.com/docs/entity_specification
    attr_accessor :website_address

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :wechat

    # Social medial user name. An attribute in the Senzing Entity Specification.
    # See https://www.senzing.com/docs/entity_specification
    attr_accessor :whatsapp
    attr_accessor :xxx_addr_from_date
    attr_accessor :xxx_addr_thru_date
    attr_accessor :xxx_phone_from_date
    attr_accessor :xxx_phone_thru_date
    attr_accessor :zoomroom

    def self.from_json_data(data)
      out = SenzingEntitySpecification.new
      out.account_domain = SenzingTypedef::from_json_data(String, data["ACCOUNT_DOMAIN"])
      out.account_number = SenzingTypedef::from_json_data(String, data["ACCOUNT_NUMBER"])
      out.addr_city = SenzingTypedef::from_json_data(String, data["ADDR_CITY"])
      out.addr_country = SenzingTypedef::from_json_data(String, data["ADDR_COUNTRY"])
      out.addr_full = SenzingTypedef::from_json_data(String, data["ADDR_FULL"])
      out.addr_line1 = SenzingTypedef::from_json_data(String, data["ADDR_LINE1"])
      out.addr_line2 = SenzingTypedef::from_json_data(String, data["ADDR_LINE2"])
      out.addr_line3 = SenzingTypedef::from_json_data(String, data["ADDR_LINE3"])
      out.addr_line4 = SenzingTypedef::from_json_data(String, data["ADDR_LINE4"])
      out.addr_line5 = SenzingTypedef::from_json_data(String, data["ADDR_LINE5"])
      out.addr_line6 = SenzingTypedef::from_json_data(String, data["ADDR_LINE6"])
      out.addr_postal_code = SenzingTypedef::from_json_data(String, data["ADDR_POSTAL_CODE"])
      out.addr_state = SenzingTypedef::from_json_data(String, data["ADDR_STATE"])
      out.addr_type = SenzingTypedef::from_json_data(String, data["ADDR_TYPE"])
      out.citizenship = SenzingTypedef::from_json_data(String, data["CITIZENSHIP"])
      out.date_of_birth = SenzingTypedef::from_json_data(String, data["DATE_OF_BIRTH"])
      out.date_of_death = SenzingTypedef::from_json_data(String, data["DATE_OF_DEATH"])
      out.drivers_license_number = SenzingTypedef::from_json_data(String, data["DRIVERS_LICENSE_NUMBER"])
      out.drivers_license_state = SenzingTypedef::from_json_data(String, data["DRIVERS_LICENSE_STATE"])
      out.duns_number = SenzingTypedef::from_json_data(String, data["DUNS_NUMBER"])
      out.email_address = SenzingTypedef::from_json_data(String, data["EMAIL_ADDRESS"])
      out.employer = SenzingTypedef::from_json_data(String, data["EMPLOYER"])
      out.employer_name = SenzingTypedef::from_json_data(String, data["EMPLOYER_NAME"])
      out.facebook = SenzingTypedef::from_json_data(String, data["FACEBOOK"])
      out.gender = SenzingTypedef::from_json_data(String, data["GENDER"])
      out.group_assn_id_number = SenzingTypedef::from_json_data(String, data["GROUP_ASSN_ID_NUMBER"])
      out.group_assn_id_type = SenzingTypedef::from_json_data(String, data["GROUP_ASSN_ID_TYPE"])
      out.group_association_org_name = SenzingTypedef::from_json_data(String, data["GROUP_ASSOCIATION_ORG_NAME"])
      out.group_association_type = SenzingTypedef::from_json_data(String, data["GROUP_ASSOCIATION_TYPE"])
      out.instagram = SenzingTypedef::from_json_data(String, data["INSTAGRAM"])
      out.lei_number = SenzingTypedef::from_json_data(String, data["LEI_NUMBER"])
      out.linkedin = SenzingTypedef::from_json_data(String, data["LINKEDIN"])
      out.name_first = SenzingTypedef::from_json_data(String, data["NAME_FIRST"])
      out.name_full = SenzingTypedef::from_json_data(String, data["NAME_FULL"])
      out.name_last = SenzingTypedef::from_json_data(String, data["NAME_LAST"])
      out.name_middle = SenzingTypedef::from_json_data(String, data["NAME_MIDDLE"])
      out.name_org = SenzingTypedef::from_json_data(String, data["NAME_ORG"])
      out.name_prefix = SenzingTypedef::from_json_data(String, data["NAME_PREFIX"])
      out.name_suffix = SenzingTypedef::from_json_data(String, data["NAME_SUFFIX"])
      out.name_type = SenzingTypedef::from_json_data(String, data["NAME_TYPE"])
      out.nationality = SenzingTypedef::from_json_data(String, data["NATIONALITY"])
      out.national_id_country = SenzingTypedef::from_json_data(String, data["NATIONAL_ID_COUNTRY"])
      out.national_id_number = SenzingTypedef::from_json_data(String, data["NATIONAL_ID_NUMBER"])
      out.national_id_type = SenzingTypedef::from_json_data(String, data["NATIONAL_ID_TYPE"])
      out.native_name_full = SenzingTypedef::from_json_data(String, data["NATIVE_NAME_FULL"])
      out.npi_number = SenzingTypedef::from_json_data(String, data["NPI_NUMBER"])
      out.other_id_country = SenzingTypedef::from_json_data(String, data["OTHER_ID_COUNTRY"])
      out.other_id_number = SenzingTypedef::from_json_data(String, data["OTHER_ID_NUMBER"])
      out.other_id_type = SenzingTypedef::from_json_data(String, data["OTHER_ID_TYPE"])
      out.passport_country = SenzingTypedef::from_json_data(String, data["PASSPORT_COUNTRY"])
      out.passport_number = SenzingTypedef::from_json_data(String, data["PASSPORT_NUMBER"])
      out.phone_number = SenzingTypedef::from_json_data(String, data["PHONE_NUMBER"])
      out.phone_type = SenzingTypedef::from_json_data(String, data["PHONE_TYPE"])
      out.place_of_birth = SenzingTypedef::from_json_data(String, data["PLACE_OF_BIRTH"])
      out.primary_name_first = SenzingTypedef::from_json_data(String, data["PRIMARY_NAME_FIRST"])
      out.primary_name_full = SenzingTypedef::from_json_data(String, data["PRIMARY_NAME_FULL"])
      out.primary_name_last = SenzingTypedef::from_json_data(String, data["PRIMARY_NAME_LAST"])
      out.primary_name_middle = SenzingTypedef::from_json_data(String, data["PRIMARY_NAME_MIDDLE"])
      out.primary_name_org = SenzingTypedef::from_json_data(String, data["PRIMARY_NAME_ORG"])
      out.record_type = SenzingTypedef::from_json_data(String, data["RECORD_TYPE"])
      out.registration_country = SenzingTypedef::from_json_data(String, data["REGISTRATION_COUNTRY"])
      out.registration_date = SenzingTypedef::from_json_data(String, data["REGISTRATION_DATE"])
      out.relationship_key = SenzingTypedef::from_json_data(String, data["RELATIONSHIP_KEY"])
      out.relationship_type = SenzingTypedef::from_json_data(String, data["RELATIONSHIP_TYPE"])
      out.rel_anchor_domain = SenzingTypedef::from_json_data(String, data["REL_ANCHOR_DOMAIN"])
      out.rel_anchor_key = SenzingTypedef::from_json_data(String, data["REL_ANCHOR_KEY"])
      out.rel_pointer_domain = SenzingTypedef::from_json_data(String, data["REL_POINTER_DOMAIN"])
      out.rel_pointer_key = SenzingTypedef::from_json_data(String, data["REL_POINTER_KEY"])
      out.rel_pointer_role = SenzingTypedef::from_json_data(String, data["REL_POINTER_ROLE"])
      out.secondary_name_org = SenzingTypedef::from_json_data(String, data["SECONDARY_NAME_ORG"])
      out.signal = SenzingTypedef::from_json_data(String, data["SIGNAL"])
      out.skype = SenzingTypedef::from_json_data(String, data["SKYPE"])
      out.ssn_number = SenzingTypedef::from_json_data(String, data["SSN_NUMBER"])
      out.tango = SenzingTypedef::from_json_data(String, data["TANGO"])
      out.tax_id_country = SenzingTypedef::from_json_data(String, data["TAX_ID_COUNTRY"])
      out.tax_id_number = SenzingTypedef::from_json_data(String, data["TAX_ID_NUMBER"])
      out.tax_id_type = SenzingTypedef::from_json_data(String, data["TAX_ID_TYPE"])
      out.telegram = SenzingTypedef::from_json_data(String, data["TELEGRAM"])
      out.trusted_id_number = SenzingTypedef::from_json_data(String, data["TRUSTED_ID_NUMBER"])
      out.trusted_id_type = SenzingTypedef::from_json_data(String, data["TRUSTED_ID_TYPE"])
      out.twitter = SenzingTypedef::from_json_data(String, data["TWITTER"])
      out.viber = SenzingTypedef::from_json_data(String, data["VIBER"])
      out.website_address = SenzingTypedef::from_json_data(String, data["WEBSITE_ADDRESS"])
      out.wechat = SenzingTypedef::from_json_data(String, data["WECHAT"])
      out.whatsapp = SenzingTypedef::from_json_data(String, data["WHATSAPP"])
      out.xxx_addr_from_date = SenzingTypedef::from_json_data(String, data["XXX_ADDR_FROM_DATE"])
      out.xxx_addr_thru_date = SenzingTypedef::from_json_data(String, data["XXX_ADDR_THRU_DATE"])
      out.xxx_phone_from_date = SenzingTypedef::from_json_data(String, data["XXX_PHONE_FROM_DATE"])
      out.xxx_phone_thru_date = SenzingTypedef::from_json_data(String, data["XXX_PHONE_THRU_DATE"])
      out.zoomroom = SenzingTypedef::from_json_data(String, data["ZOOMROOM"])
      out
    end

    def to_json_data
      data = {}
      data["ACCOUNT_DOMAIN"] = SenzingTypedef::to_json_data(account_domain)
      data["ACCOUNT_NUMBER"] = SenzingTypedef::to_json_data(account_number)
      data["ADDR_CITY"] = SenzingTypedef::to_json_data(addr_city)
      data["ADDR_COUNTRY"] = SenzingTypedef::to_json_data(addr_country)
      data["ADDR_FULL"] = SenzingTypedef::to_json_data(addr_full)
      data["ADDR_LINE1"] = SenzingTypedef::to_json_data(addr_line1)
      data["ADDR_LINE2"] = SenzingTypedef::to_json_data(addr_line2)
      data["ADDR_LINE3"] = SenzingTypedef::to_json_data(addr_line3)
      data["ADDR_LINE4"] = SenzingTypedef::to_json_data(addr_line4)
      data["ADDR_LINE5"] = SenzingTypedef::to_json_data(addr_line5)
      data["ADDR_LINE6"] = SenzingTypedef::to_json_data(addr_line6)
      data["ADDR_POSTAL_CODE"] = SenzingTypedef::to_json_data(addr_postal_code)
      data["ADDR_STATE"] = SenzingTypedef::to_json_data(addr_state)
      data["ADDR_TYPE"] = SenzingTypedef::to_json_data(addr_type)
      data["CITIZENSHIP"] = SenzingTypedef::to_json_data(citizenship)
      data["DATE_OF_BIRTH"] = SenzingTypedef::to_json_data(date_of_birth)
      data["DATE_OF_DEATH"] = SenzingTypedef::to_json_data(date_of_death)
      data["DRIVERS_LICENSE_NUMBER"] = SenzingTypedef::to_json_data(drivers_license_number)
      data["DRIVERS_LICENSE_STATE"] = SenzingTypedef::to_json_data(drivers_license_state)
      data["DUNS_NUMBER"] = SenzingTypedef::to_json_data(duns_number)
      data["EMAIL_ADDRESS"] = SenzingTypedef::to_json_data(email_address)
      data["EMPLOYER"] = SenzingTypedef::to_json_data(employer)
      data["EMPLOYER_NAME"] = SenzingTypedef::to_json_data(employer_name)
      data["FACEBOOK"] = SenzingTypedef::to_json_data(facebook)
      data["GENDER"] = SenzingTypedef::to_json_data(gender)
      data["GROUP_ASSN_ID_NUMBER"] = SenzingTypedef::to_json_data(group_assn_id_number)
      data["GROUP_ASSN_ID_TYPE"] = SenzingTypedef::to_json_data(group_assn_id_type)
      data["GROUP_ASSOCIATION_ORG_NAME"] = SenzingTypedef::to_json_data(group_association_org_name)
      data["GROUP_ASSOCIATION_TYPE"] = SenzingTypedef::to_json_data(group_association_type)
      data["INSTAGRAM"] = SenzingTypedef::to_json_data(instagram)
      data["LEI_NUMBER"] = SenzingTypedef::to_json_data(lei_number)
      data["LINKEDIN"] = SenzingTypedef::to_json_data(linkedin)
      data["NAME_FIRST"] = SenzingTypedef::to_json_data(name_first)
      data["NAME_FULL"] = SenzingTypedef::to_json_data(name_full)
      data["NAME_LAST"] = SenzingTypedef::to_json_data(name_last)
      data["NAME_MIDDLE"] = SenzingTypedef::to_json_data(name_middle)
      data["NAME_ORG"] = SenzingTypedef::to_json_data(name_org)
      data["NAME_PREFIX"] = SenzingTypedef::to_json_data(name_prefix)
      data["NAME_SUFFIX"] = SenzingTypedef::to_json_data(name_suffix)
      data["NAME_TYPE"] = SenzingTypedef::to_json_data(name_type)
      data["NATIONALITY"] = SenzingTypedef::to_json_data(nationality)
      data["NATIONAL_ID_COUNTRY"] = SenzingTypedef::to_json_data(national_id_country)
      data["NATIONAL_ID_NUMBER"] = SenzingTypedef::to_json_data(national_id_number)
      data["NATIONAL_ID_TYPE"] = SenzingTypedef::to_json_data(national_id_type)
      data["NATIVE_NAME_FULL"] = SenzingTypedef::to_json_data(native_name_full)
      data["NPI_NUMBER"] = SenzingTypedef::to_json_data(npi_number)
      data["OTHER_ID_COUNTRY"] = SenzingTypedef::to_json_data(other_id_country)
      data["OTHER_ID_NUMBER"] = SenzingTypedef::to_json_data(other_id_number)
      data["OTHER_ID_TYPE"] = SenzingTypedef::to_json_data(other_id_type)
      data["PASSPORT_COUNTRY"] = SenzingTypedef::to_json_data(passport_country)
      data["PASSPORT_NUMBER"] = SenzingTypedef::to_json_data(passport_number)
      data["PHONE_NUMBER"] = SenzingTypedef::to_json_data(phone_number)
      data["PHONE_TYPE"] = SenzingTypedef::to_json_data(phone_type)
      data["PLACE_OF_BIRTH"] = SenzingTypedef::to_json_data(place_of_birth)
      data["PRIMARY_NAME_FIRST"] = SenzingTypedef::to_json_data(primary_name_first)
      data["PRIMARY_NAME_FULL"] = SenzingTypedef::to_json_data(primary_name_full)
      data["PRIMARY_NAME_LAST"] = SenzingTypedef::to_json_data(primary_name_last)
      data["PRIMARY_NAME_MIDDLE"] = SenzingTypedef::to_json_data(primary_name_middle)
      data["PRIMARY_NAME_ORG"] = SenzingTypedef::to_json_data(primary_name_org)
      data["RECORD_TYPE"] = SenzingTypedef::to_json_data(record_type)
      data["REGISTRATION_COUNTRY"] = SenzingTypedef::to_json_data(registration_country)
      data["REGISTRATION_DATE"] = SenzingTypedef::to_json_data(registration_date)
      data["RELATIONSHIP_KEY"] = SenzingTypedef::to_json_data(relationship_key)
      data["RELATIONSHIP_TYPE"] = SenzingTypedef::to_json_data(relationship_type)
      data["REL_ANCHOR_DOMAIN"] = SenzingTypedef::to_json_data(rel_anchor_domain)
      data["REL_ANCHOR_KEY"] = SenzingTypedef::to_json_data(rel_anchor_key)
      data["REL_POINTER_DOMAIN"] = SenzingTypedef::to_json_data(rel_pointer_domain)
      data["REL_POINTER_KEY"] = SenzingTypedef::to_json_data(rel_pointer_key)
      data["REL_POINTER_ROLE"] = SenzingTypedef::to_json_data(rel_pointer_role)
      data["SECONDARY_NAME_ORG"] = SenzingTypedef::to_json_data(secondary_name_org)
      data["SIGNAL"] = SenzingTypedef::to_json_data(signal)
      data["SKYPE"] = SenzingTypedef::to_json_data(skype)
      data["SSN_NUMBER"] = SenzingTypedef::to_json_data(ssn_number)
      data["TANGO"] = SenzingTypedef::to_json_data(tango)
      data["TAX_ID_COUNTRY"] = SenzingTypedef::to_json_data(tax_id_country)
      data["TAX_ID_NUMBER"] = SenzingTypedef::to_json_data(tax_id_number)
      data["TAX_ID_TYPE"] = SenzingTypedef::to_json_data(tax_id_type)
      data["TELEGRAM"] = SenzingTypedef::to_json_data(telegram)
      data["TRUSTED_ID_NUMBER"] = SenzingTypedef::to_json_data(trusted_id_number)
      data["TRUSTED_ID_TYPE"] = SenzingTypedef::to_json_data(trusted_id_type)
      data["TWITTER"] = SenzingTypedef::to_json_data(twitter)
      data["VIBER"] = SenzingTypedef::to_json_data(viber)
      data["WEBSITE_ADDRESS"] = SenzingTypedef::to_json_data(website_address)
      data["WECHAT"] = SenzingTypedef::to_json_data(wechat)
      data["WHATSAPP"] = SenzingTypedef::to_json_data(whatsapp)
      data["XXX_ADDR_FROM_DATE"] = SenzingTypedef::to_json_data(xxx_addr_from_date)
      data["XXX_ADDR_THRU_DATE"] = SenzingTypedef::to_json_data(xxx_addr_thru_date)
      data["XXX_PHONE_FROM_DATE"] = SenzingTypedef::to_json_data(xxx_phone_from_date)
      data["XXX_PHONE_THRU_DATE"] = SenzingTypedef::to_json_data(xxx_phone_thru_date)
      data["ZOOMROOM"] = SenzingTypedef::to_json_data(zoomroom)
      data
    end
  end

  class SzConfigExportResponse
    attr_accessor :g2_config

    def self.from_json_data(data)
      out = SzConfigExportResponse.new
      out.g2_config = SenzingTypedef::from_json_data(G2config, data["G2_CONFIG"])
      out
    end

    def to_json_data
      data = {}
      data["G2_CONFIG"] = SenzingTypedef::to_json_data(g2_config)
      data
    end
  end

  class SzConfigGetDataSourceRegistryResponse
    # The list of registered data sources.
    attr_accessor :data_sources

    def self.from_json_data(data)
      out = SzConfigGetDataSourceRegistryResponse.new
      out.data_sources = SenzingTypedef::from_json_data(Array[DataSource], data["DATA_SOURCES"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCES"] = SenzingTypedef::to_json_data(data_sources)
      data
    end
  end

  class SzConfigManagerGetConfigRegistryResponse
    # The list of registered configurations.
    attr_accessor :configs

    def self.from_json_data(data)
      out = SzConfigManagerGetConfigRegistryResponse.new
      out.configs = SenzingTypedef::from_json_data(Array[Config], data["CONFIGS"])
      out
    end

    def to_json_data
      data = {}
      data["CONFIGS"] = SenzingTypedef::to_json_data(configs)
      data
    end
  end

  class SzConfigRegisterDataSourceResponse
    # The unique internal integer identifier of the datasource.
    attr_accessor :dsrc_id

    def self.from_json_data(data)
      out = SzConfigRegisterDataSourceResponse.new
      out.dsrc_id = SenzingTypedef::from_json_data(Integer, data["DSRC_ID"])
      out
    end

    def to_json_data
      data = {}
      data["DSRC_ID"] = SenzingTypedef::to_json_data(dsrc_id)
      data
    end
  end

  class SzDiagnosticCheckRepositoryPerformanceResponse
    # The duration of the test in milliseconds.
    attr_accessor :insert_time

    # The total number of records inserted within the insertTime.
    attr_accessor :num_records_inserted

    def self.from_json_data(data)
      out = SzDiagnosticCheckRepositoryPerformanceResponse.new
      out.insert_time = SenzingTypedef::from_json_data(Integer, data["insertTime"])
      out.num_records_inserted = SenzingTypedef::from_json_data(Integer, data["numRecordsInserted"])
      out
    end

    def to_json_data
      data = {}
      data["insertTime"] = SenzingTypedef::to_json_data(insert_time)
      data["numRecordsInserted"] = SenzingTypedef::to_json_data(num_records_inserted)
      data
    end
  end

  class SzDiagnosticGetFeatureResponse
    # Internal use.
    attr_accessor :elements

    # Internal use.
    attr_accessor :ftype_code

    # Internal use.
    attr_accessor :lib_feat_id

    def self.from_json_data(data)
      out = SzDiagnosticGetFeatureResponse.new
      out.elements = SenzingTypedef::from_json_data(Array[Feature], data["ELEMENTS"])
      out.ftype_code = SenzingTypedef::from_json_data(String, data["FTYPE_CODE"])
      out.lib_feat_id = SenzingTypedef::from_json_data(Integer, data["LIB_FEAT_ID"])
      out
    end

    def to_json_data
      data = {}
      data["ELEMENTS"] = SenzingTypedef::to_json_data(elements)
      data["FTYPE_CODE"] = SenzingTypedef::to_json_data(ftype_code)
      data["LIB_FEAT_ID"] = SenzingTypedef::to_json_data(lib_feat_id)
      data
    end
  end

  class SzDiagnosticGetRepositoryInfoResponse
    # A list of database node connection metadata.
    attr_accessor :data_stores

    def self.from_json_data(data)
      out = SzDiagnosticGetRepositoryInfoResponse.new
      out.data_stores = SenzingTypedef::from_json_data(Array[Repository], data["dataStores"])
      out
    end

    def to_json_data
      data = {}
      data["dataStores"] = SenzingTypedef::to_json_data(data_stores)
      data
    end
  end

  class SzEngineAddRecordResponse
    attr_accessor :affected_entities

    # A label identifying the provenance of the record.
    attr_accessor :data_source
    attr_accessor :interesting_entities

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id

    def self.from_json_data(data)
      out = SzEngineAddRecordResponse.new
      out.affected_entities = SenzingTypedef::from_json_data(Array[AffectedEntity], data["AFFECTED_ENTITIES"])
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.interesting_entities = SenzingTypedef::from_json_data(InterestingEntities, data["INTERESTING_ENTITIES"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out
    end

    def to_json_data
      data = {}
      data["AFFECTED_ENTITIES"] = SenzingTypedef::to_json_data(affected_entities)
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["INTERESTING_ENTITIES"] = SenzingTypedef::to_json_data(interesting_entities)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data
    end
  end

  class SzEngineDeleteRecordResponse
    attr_accessor :affected_entities

    # A label identifying the provenance of the record.
    attr_accessor :data_source

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id
    attr_accessor :xxx_interesting_entities

    def self.from_json_data(data)
      out = SzEngineDeleteRecordResponse.new
      out.affected_entities = SenzingTypedef::from_json_data(Array[AffectedEntity], data["AFFECTED_ENTITIES"])
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out.xxx_interesting_entities = SenzingTypedef::from_json_data(InterestingEntities, data["XXX_INTERESTING_ENTITIES"])
      out
    end

    def to_json_data
      data = {}
      data["AFFECTED_ENTITIES"] = SenzingTypedef::to_json_data(affected_entities)
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data["XXX_INTERESTING_ENTITIES"] = SenzingTypedef::to_json_data(xxx_interesting_entities)
      data
    end
  end

  class SzEngineExportCsvEntityReportCsvColumnList
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineExportCsvEntityReportCsvColumnList.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineFetchNextResponse
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineFetchNextResponse.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineFindInterestingEntitiesByEntityIDResponse
    attr_accessor :interesting_entities

    def self.from_json_data(data)
      out = SzEngineFindInterestingEntitiesByEntityIDResponse.new
      out.interesting_entities = SenzingTypedef::from_json_data(InterestingEntities, data["INTERESTING_ENTITIES"])
      out
    end

    def to_json_data
      data = {}
      data["INTERESTING_ENTITIES"] = SenzingTypedef::to_json_data(interesting_entities)
      data
    end
  end

  class SzEngineFindInterestingEntitiesByRecordIDResponse
    attr_accessor :interesting_entities

    def self.from_json_data(data)
      out = SzEngineFindInterestingEntitiesByRecordIDResponse.new
      out.interesting_entities = SenzingTypedef::from_json_data(InterestingEntities, data["INTERESTING_ENTITIES"])
      out
    end

    def to_json_data
      data = {}
      data["INTERESTING_ENTITIES"] = SenzingTypedef::to_json_data(interesting_entities)
      data
    end
  end

  class SzEngineFindNetworkByEntityIDEntityIds
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineFindNetworkByEntityIDEntityIds.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineFindNetworkByEntityIDResponse
    attr_accessor :entities
    attr_accessor :entity_network_links
    attr_accessor :entity_paths
    attr_accessor :entity_path_links
    attr_accessor :max_entity_limit_reached
    attr_accessor :why_results

    def self.from_json_data(data)
      out = SzEngineFindNetworkByEntityIDResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[Entity], data["ENTITIES"])
      out.entity_network_links = SenzingTypedef::from_json_data(Array[EntityNetworkLink], data["ENTITY_NETWORK_LINKS"])
      out.entity_paths = SenzingTypedef::from_json_data(Array[EntityPath], data["ENTITY_PATHS"])
      out.entity_path_links = SenzingTypedef::from_json_data(Array[EntityPathLink], data["ENTITY_PATH_LINKS"])
      out.max_entity_limit_reached = SenzingTypedef::from_json_data(String, data["MAX_ENTITY_LIMIT_REACHED"])
      out.why_results = SenzingTypedef::from_json_data(Array[WhyResult], data["WHY_RESULTS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["ENTITY_NETWORK_LINKS"] = SenzingTypedef::to_json_data(entity_network_links)
      data["ENTITY_PATHS"] = SenzingTypedef::to_json_data(entity_paths)
      data["ENTITY_PATH_LINKS"] = SenzingTypedef::to_json_data(entity_path_links)
      data["MAX_ENTITY_LIMIT_REACHED"] = SenzingTypedef::to_json_data(max_entity_limit_reached)
      data["WHY_RESULTS"] = SenzingTypedef::to_json_data(why_results)
      data
    end
  end

  class SzEngineFindNetworkByRecordIDRecordKeys
    # A list of (data source code, record id) pairs.
    attr_accessor :records

    def self.from_json_data(data)
      out = SzEngineFindNetworkByRecordIDRecordKeys.new
      out.records = SenzingTypedef::from_json_data(Array[RecordKey], data["RECORDS"])
      out
    end

    def to_json_data
      data = {}
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data
    end
  end

  class SzEngineFindNetworkByRecordIDResponse
    attr_accessor :entities
    attr_accessor :entity_network_links
    attr_accessor :entity_paths
    attr_accessor :entity_path_links
    attr_accessor :max_entity_limit_reached
    attr_accessor :why_results

    def self.from_json_data(data)
      out = SzEngineFindNetworkByRecordIDResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[Entity], data["ENTITIES"])
      out.entity_network_links = SenzingTypedef::from_json_data(Array[EntityNetworkLink], data["ENTITY_NETWORK_LINKS"])
      out.entity_paths = SenzingTypedef::from_json_data(Array[EntityPath], data["ENTITY_PATHS"])
      out.entity_path_links = SenzingTypedef::from_json_data(Array[EntityPathLink], data["ENTITY_PATH_LINKS"])
      out.max_entity_limit_reached = SenzingTypedef::from_json_data(String, data["MAX_ENTITY_LIMIT_REACHED"])
      out.why_results = SenzingTypedef::from_json_data(Array[WhyResult], data["WHY_RESULTS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["ENTITY_NETWORK_LINKS"] = SenzingTypedef::to_json_data(entity_network_links)
      data["ENTITY_PATHS"] = SenzingTypedef::to_json_data(entity_paths)
      data["ENTITY_PATH_LINKS"] = SenzingTypedef::to_json_data(entity_path_links)
      data["MAX_ENTITY_LIMIT_REACHED"] = SenzingTypedef::to_json_data(max_entity_limit_reached)
      data["WHY_RESULTS"] = SenzingTypedef::to_json_data(why_results)
      data
    end
  end

  class SzEngineFindPathByEntityIDAvoidEntityIds
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineFindPathByEntityIDAvoidEntityIds.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineFindPathByEntityIDRequiredDataSources
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineFindPathByEntityIDRequiredDataSources.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineFindPathByEntityIDResponse
    attr_accessor :entities
    attr_accessor :entity_paths
    attr_accessor :entity_path_links

    def self.from_json_data(data)
      out = SzEngineFindPathByEntityIDResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[Entity], data["ENTITIES"])
      out.entity_paths = SenzingTypedef::from_json_data(Array[EntityPath], data["ENTITY_PATHS"])
      out.entity_path_links = SenzingTypedef::from_json_data(Array[EntityPathLink], data["ENTITY_PATH_LINKS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["ENTITY_PATHS"] = SenzingTypedef::to_json_data(entity_paths)
      data["ENTITY_PATH_LINKS"] = SenzingTypedef::to_json_data(entity_path_links)
      data
    end
  end

  class SzEngineFindPathByRecordIDAvoidRecordKeys
    # A list of (data source code, record id) pairs.
    attr_accessor :records

    def self.from_json_data(data)
      out = SzEngineFindPathByRecordIDAvoidRecordKeys.new
      out.records = SenzingTypedef::from_json_data(Array[RecordKey], data["RECORDS"])
      out
    end

    def to_json_data
      data = {}
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data
    end
  end

  class SzEngineFindPathByRecordIDRequiredDataSources
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineFindPathByRecordIDRequiredDataSources.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineFindPathByRecordIDResponse
    attr_accessor :entities
    attr_accessor :entity_paths
    attr_accessor :entity_path_links

    def self.from_json_data(data)
      out = SzEngineFindPathByRecordIDResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[Entity], data["ENTITIES"])
      out.entity_paths = SenzingTypedef::from_json_data(Array[EntityPath], data["ENTITY_PATHS"])
      out.entity_path_links = SenzingTypedef::from_json_data(Array[EntityPathLink], data["ENTITY_PATH_LINKS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["ENTITY_PATHS"] = SenzingTypedef::to_json_data(entity_paths)
      data["ENTITY_PATH_LINKS"] = SenzingTypedef::to_json_data(entity_path_links)
      data
    end
  end

  class SzEngineGetEntityByEntityIDResponse
    attr_accessor :related_entities
    attr_accessor :resolved_entity

    def self.from_json_data(data)
      out = SzEngineGetEntityByEntityIDResponse.new
      out.related_entities = SenzingTypedef::from_json_data(Array[RelatedEntity], data["RELATED_ENTITIES"])
      out.resolved_entity = SenzingTypedef::from_json_data(ResolvedEntityForGetEntity, data["RESOLVED_ENTITY"])
      out
    end

    def to_json_data
      data = {}
      data["RELATED_ENTITIES"] = SenzingTypedef::to_json_data(related_entities)
      data["RESOLVED_ENTITY"] = SenzingTypedef::to_json_data(resolved_entity)
      data
    end
  end

  class SzEngineGetEntityByRecordIDResponse
    attr_accessor :related_entities
    attr_accessor :resolved_entity

    def self.from_json_data(data)
      out = SzEngineGetEntityByRecordIDResponse.new
      out.related_entities = SenzingTypedef::from_json_data(Array[RelatedEntity], data["RELATED_ENTITIES"])
      out.resolved_entity = SenzingTypedef::from_json_data(ResolvedEntityForGetEntity, data["RESOLVED_ENTITY"])
      out
    end

    def to_json_data
      data = {}
      data["RELATED_ENTITIES"] = SenzingTypedef::to_json_data(related_entities)
      data["RESOLVED_ENTITY"] = SenzingTypedef::to_json_data(resolved_entity)
      data
    end
  end

  class SzEngineGetRecordPreviewResponse
    attr_accessor :features
    attr_accessor :feature_ids
    attr_accessor :json_data
    attr_accessor :unmapped_data

    def self.from_json_data(data)
      out = SzEngineGetRecordPreviewResponse.new
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureForAttributes]], data["FEATURES"])
      out.feature_ids = SenzingTypedef::from_json_data(Array[FeatureID], data["FEATURE_IDS"])
      out.json_data = SenzingTypedef::from_json_data(Hash[String, Object], data["JSON_DATA"])
      out.unmapped_data = SenzingTypedef::from_json_data(Hash[String, Object], data["UNMAPPED_DATA"])
      out
    end

    def to_json_data
      data = {}
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["FEATURE_IDS"] = SenzingTypedef::to_json_data(feature_ids)
      data["JSON_DATA"] = SenzingTypedef::to_json_data(json_data)
      data["UNMAPPED_DATA"] = SenzingTypedef::to_json_data(unmapped_data)
      data
    end
  end

  class SzEngineGetRecordResponse
    # A label identifying the provenance of the record.
    attr_accessor :data_source
    attr_accessor :features
    attr_accessor :feature_ids
    attr_accessor :first_seen_dt
    attr_accessor :json_data
    attr_accessor :last_seen_dt

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id
    attr_accessor :unmapped_data
    attr_accessor :xxx_address_data
    attr_accessor :xxx_attribute_data
    attr_accessor :xxx_entity_data
    attr_accessor :xxx_entity_desc
    attr_accessor :xxx_entity_key
    attr_accessor :xxx_entity_type

    # Identifier of the entity resolution rule that was triggered.
    attr_accessor :xxx_errule_code
    attr_accessor :xxx_identifier_data

    # Internal identifier for the record.
    attr_accessor :xxx_internal_id

    # Representation of matched source record features.
    attr_accessor :xxx_match_key
    attr_accessor :xxx_match_level

    # The type of match that occurred for the record.
    attr_accessor :xxx_match_level_code
    attr_accessor :xxx_name_data
    attr_accessor :xxx_other_data
    attr_accessor :xxx_phone_data
    attr_accessor :xxx_relationship_data

    def self.from_json_data(data)
      out = SzEngineGetRecordResponse.new
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.features = SenzingTypedef::from_json_data(Hash[String, Array[FeatureForAttributes]], data["FEATURES"])
      out.feature_ids = SenzingTypedef::from_json_data(Array[FeatureID], data["FEATURE_IDS"])
      out.first_seen_dt = SenzingTypedef::from_json_data(DateTime, data["FIRST_SEEN_DT"])
      out.json_data = SenzingTypedef::from_json_data(Hash[String, Object], data["JSON_DATA"])
      out.last_seen_dt = SenzingTypedef::from_json_data(DateTime, data["LAST_SEEN_DT"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out.unmapped_data = SenzingTypedef::from_json_data(Hash[String, Object], data["UNMAPPED_DATA"])
      out.xxx_address_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ADDRESS_DATA"])
      out.xxx_attribute_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ATTRIBUTE_DATA"])
      out.xxx_entity_data = SenzingTypedef::from_json_data(Array[String], data["XXX_ENTITY_DATA"])
      out.xxx_entity_desc = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_DESC"])
      out.xxx_entity_key = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_KEY"])
      out.xxx_entity_type = SenzingTypedef::from_json_data(String, data["XXX_ENTITY_TYPE"])
      out.xxx_errule_code = SenzingTypedef::from_json_data(String, data["XXX_ERRULE_CODE"])
      out.xxx_identifier_data = SenzingTypedef::from_json_data(Array[String], data["XXX_IDENTIFIER_DATA"])
      out.xxx_internal_id = SenzingTypedef::from_json_data(Integer, data["XXX_INTERNAL_ID"])
      out.xxx_match_key = SenzingTypedef::from_json_data(String, data["XXX_MATCH_KEY"])
      out.xxx_match_level = SenzingTypedef::from_json_data(Integer, data["XXX_MATCH_LEVEL"])
      out.xxx_match_level_code = SenzingTypedef::from_json_data(String, data["XXX_MATCH_LEVEL_CODE"])
      out.xxx_name_data = SenzingTypedef::from_json_data(Array[String], data["XXX_NAME_DATA"])
      out.xxx_other_data = SenzingTypedef::from_json_data(Array[String], data["XXX_OTHER_DATA"])
      out.xxx_phone_data = SenzingTypedef::from_json_data(Array[String], data["XXX_PHONE_DATA"])
      out.xxx_relationship_data = SenzingTypedef::from_json_data(Array[String], data["XXX_RELATIONSHIP_DATA"])
      out
    end

    def to_json_data
      data = {}
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["FEATURES"] = SenzingTypedef::to_json_data(features)
      data["FEATURE_IDS"] = SenzingTypedef::to_json_data(feature_ids)
      data["FIRST_SEEN_DT"] = SenzingTypedef::to_json_data(first_seen_dt)
      data["JSON_DATA"] = SenzingTypedef::to_json_data(json_data)
      data["LAST_SEEN_DT"] = SenzingTypedef::to_json_data(last_seen_dt)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data["UNMAPPED_DATA"] = SenzingTypedef::to_json_data(unmapped_data)
      data["XXX_ADDRESS_DATA"] = SenzingTypedef::to_json_data(xxx_address_data)
      data["XXX_ATTRIBUTE_DATA"] = SenzingTypedef::to_json_data(xxx_attribute_data)
      data["XXX_ENTITY_DATA"] = SenzingTypedef::to_json_data(xxx_entity_data)
      data["XXX_ENTITY_DESC"] = SenzingTypedef::to_json_data(xxx_entity_desc)
      data["XXX_ENTITY_KEY"] = SenzingTypedef::to_json_data(xxx_entity_key)
      data["XXX_ENTITY_TYPE"] = SenzingTypedef::to_json_data(xxx_entity_type)
      data["XXX_ERRULE_CODE"] = SenzingTypedef::to_json_data(xxx_errule_code)
      data["XXX_IDENTIFIER_DATA"] = SenzingTypedef::to_json_data(xxx_identifier_data)
      data["XXX_INTERNAL_ID"] = SenzingTypedef::to_json_data(xxx_internal_id)
      data["XXX_MATCH_KEY"] = SenzingTypedef::to_json_data(xxx_match_key)
      data["XXX_MATCH_LEVEL"] = SenzingTypedef::to_json_data(xxx_match_level)
      data["XXX_MATCH_LEVEL_CODE"] = SenzingTypedef::to_json_data(xxx_match_level_code)
      data["XXX_NAME_DATA"] = SenzingTypedef::to_json_data(xxx_name_data)
      data["XXX_OTHER_DATA"] = SenzingTypedef::to_json_data(xxx_other_data)
      data["XXX_PHONE_DATA"] = SenzingTypedef::to_json_data(xxx_phone_data)
      data["XXX_RELATIONSHIP_DATA"] = SenzingTypedef::to_json_data(xxx_relationship_data)
      data
    end
  end

  class SzEngineGetRedoRecordResponse
    attr_accessor :umf_proc

    def self.from_json_data(data)
      out = SzEngineGetRedoRecordResponse.new
      out.umf_proc = SenzingTypedef::from_json_data(UmfProc, data["UMF_PROC"])
      out
    end

    def to_json_data
      data = {}
      data["UMF_PROC"] = SenzingTypedef::to_json_data(umf_proc)
      data
    end
  end

  class SzEngineGetStatsResponse
    attr_accessor :workload

    def self.from_json_data(data)
      out = SzEngineGetStatsResponse.new
      out.workload = SenzingTypedef::from_json_data(Workload, data["workload"])
      out
    end

    def to_json_data
      data = {}
      data["workload"] = SenzingTypedef::to_json_data(workload)
      data
    end
  end

  class SzEngineGetVirtualEntityByRecordIDRecordKeys
    # A list of (data source code, record id) pairs.
    attr_accessor :records

    def self.from_json_data(data)
      out = SzEngineGetVirtualEntityByRecordIDRecordKeys.new
      out.records = SenzingTypedef::from_json_data(Array[RecordKey], data["RECORDS"])
      out
    end

    def to_json_data
      data = {}
      data["RECORDS"] = SenzingTypedef::to_json_data(records)
      data
    end
  end

  class SzEngineGetVirtualEntityByRecordIDResponse
    attr_accessor :resolved_entity

    def self.from_json_data(data)
      out = SzEngineGetVirtualEntityByRecordIDResponse.new
      out.resolved_entity = SenzingTypedef::from_json_data(ResolvedEntity, data["RESOLVED_ENTITY"])
      out
    end

    def to_json_data
      data = {}
      data["RESOLVED_ENTITY"] = SenzingTypedef::to_json_data(resolved_entity)
      data
    end
  end

  class SzEngineHowEntityByEntityIDResponse
    attr_accessor :how_results

    def self.from_json_data(data)
      out = SzEngineHowEntityByEntityIDResponse.new
      out.how_results = SenzingTypedef::from_json_data(HowResults, data["HOW_RESULTS"])
      out
    end

    def to_json_data
      data = {}
      data["HOW_RESULTS"] = SenzingTypedef::to_json_data(how_results)
      data
    end
  end

  class SzEngineProcessRedoRecordResponse
    attr_accessor :affected_entities

    # A label identifying the provenance of the record.
    attr_accessor :data_source

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id
    attr_accessor :umf_proc
    attr_accessor :xxx_interesting_entities

    def self.from_json_data(data)
      out = SzEngineProcessRedoRecordResponse.new
      out.affected_entities = SenzingTypedef::from_json_data(Array[AffectedEntity], data["AFFECTED_ENTITIES"])
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out.umf_proc = SenzingTypedef::from_json_data(UmfProc, data["UMF_PROC"])
      out.xxx_interesting_entities = SenzingTypedef::from_json_data(InterestingEntities, data["XXX_INTERESTING_ENTITIES"])
      out
    end

    def to_json_data
      data = {}
      data["AFFECTED_ENTITIES"] = SenzingTypedef::to_json_data(affected_entities)
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data["UMF_PROC"] = SenzingTypedef::to_json_data(umf_proc)
      data["XXX_INTERESTING_ENTITIES"] = SenzingTypedef::to_json_data(xxx_interesting_entities)
      data
    end
  end

  class SzEngineReevaluateEntityResponse
    attr_accessor :affected_entities
    attr_accessor :interesting_entities

    # A label identifying the provenance of the record.
    attr_accessor :xxx_data_source

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :xxx_record_id

    def self.from_json_data(data)
      out = SzEngineReevaluateEntityResponse.new
      out.affected_entities = SenzingTypedef::from_json_data(Array[AffectedEntity], data["AFFECTED_ENTITIES"])
      out.interesting_entities = SenzingTypedef::from_json_data(InterestingEntities, data["INTERESTING_ENTITIES"])
      out.xxx_data_source = SenzingTypedef::from_json_data(String, data["XXX_DATA_SOURCE"])
      out.xxx_record_id = SenzingTypedef::from_json_data(String, data["XXX_RECORD_ID"])
      out
    end

    def to_json_data
      data = {}
      data["AFFECTED_ENTITIES"] = SenzingTypedef::to_json_data(affected_entities)
      data["INTERESTING_ENTITIES"] = SenzingTypedef::to_json_data(interesting_entities)
      data["XXX_DATA_SOURCE"] = SenzingTypedef::to_json_data(xxx_data_source)
      data["XXX_RECORD_ID"] = SenzingTypedef::to_json_data(xxx_record_id)
      data
    end
  end

  class SzEngineReevaluateRecordResponse
    attr_accessor :affected_entities

    # A label identifying the provenance of the record.
    attr_accessor :data_source

    # The unique identifier within the set of records in the DATA_SOURCE.
    attr_accessor :record_id
    attr_accessor :xxx_interesting_entities

    def self.from_json_data(data)
      out = SzEngineReevaluateRecordResponse.new
      out.affected_entities = SenzingTypedef::from_json_data(Array[AffectedEntity], data["AFFECTED_ENTITIES"])
      out.data_source = SenzingTypedef::from_json_data(String, data["DATA_SOURCE"])
      out.record_id = SenzingTypedef::from_json_data(String, data["RECORD_ID"])
      out.xxx_interesting_entities = SenzingTypedef::from_json_data(InterestingEntities, data["XXX_INTERESTING_ENTITIES"])
      out
    end

    def to_json_data
      data = {}
      data["AFFECTED_ENTITIES"] = SenzingTypedef::to_json_data(affected_entities)
      data["DATA_SOURCE"] = SenzingTypedef::to_json_data(data_source)
      data["RECORD_ID"] = SenzingTypedef::to_json_data(record_id)
      data["XXX_INTERESTING_ENTITIES"] = SenzingTypedef::to_json_data(xxx_interesting_entities)
      data
    end
  end

  class SzEngineSearchByAttributesAttributes
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineSearchByAttributesAttributes.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineSearchByAttributesResponse
    attr_accessor :related_entities_mjd
    attr_accessor :resolved_entities
    attr_accessor :search_entity
    attr_accessor :search_request
    attr_accessor :search_statistics

    def self.from_json_data(data)
      out = SzEngineSearchByAttributesResponse.new
      out.related_entities_mjd = SenzingTypedef::from_json_data(Array[RelatedEntity], data["RELATED_ENTITIES_MJD"])
      out.resolved_entities = SenzingTypedef::from_json_data(Array[ResolvedEntityAndMatchInfo], data["RESOLVED_ENTITIES"])
      out.search_entity = SenzingTypedef::from_json_data(SearchEntity, data["SEARCH_ENTITY"])
      out.search_request = SenzingTypedef::from_json_data(SearchRequest, data["SEARCH_REQUEST"])
      out.search_statistics = SenzingTypedef::from_json_data(Array[SearchStatistic], data["SEARCH_STATISTICS"])
      out
    end

    def to_json_data
      data = {}
      data["RELATED_ENTITIES_MJD"] = SenzingTypedef::to_json_data(related_entities_mjd)
      data["RESOLVED_ENTITIES"] = SenzingTypedef::to_json_data(resolved_entities)
      data["SEARCH_ENTITY"] = SenzingTypedef::to_json_data(search_entity)
      data["SEARCH_REQUEST"] = SenzingTypedef::to_json_data(search_request)
      data["SEARCH_STATISTICS"] = SenzingTypedef::to_json_data(search_statistics)
      data
    end
  end

  class SzEngineSearchByAttributesSearchProfile
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineSearchByAttributesSearchProfile.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineStreamExportJSONEntityReportResponse
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineStreamExportJSONEntityReportResponse.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineWhyEntitiesResponse
    attr_accessor :entities
    attr_accessor :why_results

    def self.from_json_data(data)
      out = SzEngineWhyEntitiesResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[Entity], data["ENTITIES"])
      out.why_results = SenzingTypedef::from_json_data(Array[WhyResult], data["WHY_RESULTS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["WHY_RESULTS"] = SenzingTypedef::to_json_data(why_results)
      data
    end
  end

  class SzEngineWhyRecordInEntityResponse
    attr_accessor :entities
    attr_accessor :why_results

    def self.from_json_data(data)
      out = SzEngineWhyRecordInEntityResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[Entity], data["ENTITIES"])
      out.why_results = SenzingTypedef::from_json_data(Array[WhyResult], data["WHY_RESULTS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["WHY_RESULTS"] = SenzingTypedef::to_json_data(why_results)
      data
    end
  end

  class SzEngineWhyRecordsResponse
    attr_accessor :entities
    attr_accessor :why_results

    def self.from_json_data(data)
      out = SzEngineWhyRecordsResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[Entity], data["ENTITIES"])
      out.why_results = SenzingTypedef::from_json_data(Array[WhyResult], data["WHY_RESULTS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["WHY_RESULTS"] = SenzingTypedef::to_json_data(why_results)
      data
    end
  end

  class SzEngineWhySearchAttributes
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineWhySearchAttributes.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzEngineWhySearchResponse
    attr_accessor :entities
    attr_accessor :search_entity
    attr_accessor :search_request
    attr_accessor :search_statistics
    attr_accessor :why_results

    def self.from_json_data(data)
      out = SzEngineWhySearchResponse.new
      out.entities = SenzingTypedef::from_json_data(Array[EntityForWhySearch], data["ENTITIES"])
      out.search_entity = SenzingTypedef::from_json_data(SearchEntity, data["SEARCH_ENTITY"])
      out.search_request = SenzingTypedef::from_json_data(SearchRequest, data["SEARCH_REQUEST"])
      out.search_statistics = SenzingTypedef::from_json_data(Array[SearchStatistic], data["SEARCH_STATISTICS"])
      out.why_results = SenzingTypedef::from_json_data(Array[WhyResult], data["WHY_RESULTS"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITIES"] = SenzingTypedef::to_json_data(entities)
      data["SEARCH_ENTITY"] = SenzingTypedef::to_json_data(search_entity)
      data["SEARCH_REQUEST"] = SenzingTypedef::to_json_data(search_request)
      data["SEARCH_STATISTICS"] = SenzingTypedef::to_json_data(search_statistics)
      data["WHY_RESULTS"] = SenzingTypedef::to_json_data(why_results)
      data
    end
  end

  class SzEngineWhySearchSearchProfile
    attr_accessor :xxx_fixme

    def self.from_json_data(data)
      out = SzEngineWhySearchSearchProfile.new
      out.xxx_fixme = SenzingTypedef::from_json_data(Fixme, data["XXX_FIXME"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_FIXME"] = SenzingTypedef::to_json_data(xxx_fixme)
      data
    end
  end

  class SzProductGetLicenseResponse
    attr_accessor :adv_search
    attr_accessor :billing
    attr_accessor :contract
    attr_accessor :customer
    attr_accessor :expire_date
    attr_accessor :issue_date
    attr_accessor :license_level
    attr_accessor :license_type
    attr_accessor :record_limit

    def self.from_json_data(data)
      out = SzProductGetLicenseResponse.new
      out.adv_search = SenzingTypedef::from_json_data(Integer, data["advSearch"])
      out.billing = SenzingTypedef::from_json_data(String, data["billing"])
      out.contract = SenzingTypedef::from_json_data(String, data["contract"])
      out.customer = SenzingTypedef::from_json_data(String, data["customer"])
      out.expire_date = SenzingTypedef::from_json_data(String, data["expireDate"])
      out.issue_date = SenzingTypedef::from_json_data(String, data["issueDate"])
      out.license_level = SenzingTypedef::from_json_data(String, data["licenseLevel"])
      out.license_type = SenzingTypedef::from_json_data(String, data["licenseType"])
      out.record_limit = SenzingTypedef::from_json_data(Integer, data["recordLimit"])
      out
    end

    def to_json_data
      data = {}
      data["advSearch"] = SenzingTypedef::to_json_data(adv_search)
      data["billing"] = SenzingTypedef::to_json_data(billing)
      data["contract"] = SenzingTypedef::to_json_data(contract)
      data["customer"] = SenzingTypedef::to_json_data(customer)
      data["expireDate"] = SenzingTypedef::to_json_data(expire_date)
      data["issueDate"] = SenzingTypedef::to_json_data(issue_date)
      data["licenseLevel"] = SenzingTypedef::to_json_data(license_level)
      data["licenseType"] = SenzingTypedef::to_json_data(license_type)
      data["recordLimit"] = SenzingTypedef::to_json_data(record_limit)
      data
    end
  end

  class SzProductGetVersionResponse
    attr_accessor :build_date
    attr_accessor :build_number
    attr_accessor :build_version
    attr_accessor :compatibility_version
    attr_accessor :product_name
    attr_accessor :schema_version
    attr_accessor :version

    def self.from_json_data(data)
      out = SzProductGetVersionResponse.new
      out.build_date = SenzingTypedef::from_json_data(String, data["BUILD_DATE"])
      out.build_number = SenzingTypedef::from_json_data(String, data["BUILD_NUMBER"])
      out.build_version = SenzingTypedef::from_json_data(String, data["BUILD_VERSION"])
      out.compatibility_version = SenzingTypedef::from_json_data(CompatibilityVersion, data["COMPATIBILITY_VERSION"])
      out.product_name = SenzingTypedef::from_json_data(String, data["PRODUCT_NAME"])
      out.schema_version = SenzingTypedef::from_json_data(SchemaVersion, data["SCHEMA_VERSION"])
      out.version = SenzingTypedef::from_json_data(String, data["VERSION"])
      out
    end

    def to_json_data
      data = {}
      data["BUILD_DATE"] = SenzingTypedef::to_json_data(build_date)
      data["BUILD_NUMBER"] = SenzingTypedef::to_json_data(build_number)
      data["BUILD_VERSION"] = SenzingTypedef::to_json_data(build_version)
      data["COMPATIBILITY_VERSION"] = SenzingTypedef::to_json_data(compatibility_version)
      data["PRODUCT_NAME"] = SenzingTypedef::to_json_data(product_name)
      data["SCHEMA_VERSION"] = SenzingTypedef::to_json_data(schema_version)
      data["VERSION"] = SenzingTypedef::to_json_data(version)
      data
    end
  end

  class UmfProc
    attr_accessor :name
    attr_accessor :params

    def self.from_json_data(data)
      out = UmfProc.new
      out.name = SenzingTypedef::from_json_data(String, data["NAME"])
      out.params = SenzingTypedef::from_json_data(Array[UmfProcParams], data["PARAMS"])
      out
    end

    def to_json_data
      data = {}
      data["NAME"] = SenzingTypedef::to_json_data(name)
      data["PARAMS"] = SenzingTypedef::to_json_data(params)
      data
    end
  end

  class UmfProcParamDetails
    attr_accessor :name
    attr_accessor :value

    def self.from_json_data(data)
      out = UmfProcParamDetails.new
      out.name = SenzingTypedef::from_json_data(String, data["NAME"])
      out.value = SenzingTypedef::from_json_data(Object, data["VALUE"])
      out
    end

    def to_json_data
      data = {}
      data["NAME"] = SenzingTypedef::to_json_data(name)
      data["VALUE"] = SenzingTypedef::to_json_data(value)
      data
    end
  end

  class UmfProcParams
    attr_accessor :param

    def self.from_json_data(data)
      out = UmfProcParams.new
      out.param = SenzingTypedef::from_json_data(UmfProcParamDetails, data["PARAM"])
      out
    end

    def to_json_data
      data = {}
      data["PARAM"] = SenzingTypedef::to_json_data(param)
      data
    end
  end

  class VirtualEntitySynopsis
    attr_accessor :member_records
    attr_accessor :virtual_entity_id

    def self.from_json_data(data)
      out = VirtualEntitySynopsis.new
      out.member_records = SenzingTypedef::from_json_data(Array[MemberRecord], data["MEMBER_RECORDS"])
      out.virtual_entity_id = SenzingTypedef::from_json_data(String, data["VIRTUAL_ENTITY_ID"])
      out
    end

    def to_json_data
      data = {}
      data["MEMBER_RECORDS"] = SenzingTypedef::to_json_data(member_records)
      data["VIRTUAL_ENTITY_ID"] = SenzingTypedef::to_json_data(virtual_entity_id)
      data
    end
  end

  class WhyKeyDetails
    attr_accessor :confirmations
    attr_accessor :denials
    attr_accessor :disclosed_relations

    def self.from_json_data(data)
      out = WhyKeyDetails.new
      out.confirmations = SenzingTypedef::from_json_data(Array[Confirmation], data["CONFIRMATIONS"])
      out.denials = SenzingTypedef::from_json_data(Array[Confirmation], data["DENIALS"])
      out.disclosed_relations = SenzingTypedef::from_json_data(Array[DisclosedRelationsForWhyKeyDetails], data["DISCLOSED_RELATIONS"])
      out
    end

    def to_json_data
      data = {}
      data["CONFIRMATIONS"] = SenzingTypedef::to_json_data(confirmations)
      data["DENIALS"] = SenzingTypedef::to_json_data(denials)
      data["DISCLOSED_RELATIONS"] = SenzingTypedef::to_json_data(disclosed_relations)
      data
    end
  end

  class WhyResult
    # The ENTITY_ID is the Senzing-generated identifier for the discovered
    # entity. It may change when new information is added.
    attr_accessor :entity_id
    attr_accessor :entity_id0
    attr_accessor :focus_records
    attr_accessor :focus_records0

    # Internal identifier for the record.
    attr_accessor :internal_id

    # Internal identifier for the record.
    attr_accessor :internal_id0
    attr_accessor :match_info

    def self.from_json_data(data)
      out = WhyResult.new
      out.entity_id = SenzingTypedef::from_json_data(Integer, data["ENTITY_ID"])
      out.entity_id0 = SenzingTypedef::from_json_data(Integer, data["ENTITY_ID_2"])
      out.focus_records = SenzingTypedef::from_json_data(Array[FocusRecord], data["FOCUS_RECORDS"])
      out.focus_records0 = SenzingTypedef::from_json_data(Array[FocusRecord], data["FOCUS_RECORDS_2"])
      out.internal_id = SenzingTypedef::from_json_data(Integer, data["INTERNAL_ID"])
      out.internal_id0 = SenzingTypedef::from_json_data(Integer, data["INTERNAL_ID_2"])
      out.match_info = SenzingTypedef::from_json_data(MatchInfoForWhy, data["MATCH_INFO"])
      out
    end

    def to_json_data
      data = {}
      data["ENTITY_ID"] = SenzingTypedef::to_json_data(entity_id)
      data["ENTITY_ID_2"] = SenzingTypedef::to_json_data(entity_id0)
      data["FOCUS_RECORDS"] = SenzingTypedef::to_json_data(focus_records)
      data["FOCUS_RECORDS_2"] = SenzingTypedef::to_json_data(focus_records0)
      data["INTERNAL_ID"] = SenzingTypedef::to_json_data(internal_id)
      data["INTERNAL_ID_2"] = SenzingTypedef::to_json_data(internal_id0)
      data["MATCH_INFO"] = SenzingTypedef::to_json_data(match_info)
      data
    end
  end

  class Workload
    attr_accessor :api_version
    attr_accessor :caches
    attr_accessor :candidates
    attr_accessor :contention
    attr_accessor :datetimestamp
    attr_accessor :expressed_features
    attr_accessor :generic_detect
    attr_accessor :license
    attr_accessor :loaded_records
    attr_accessor :lock_waits
    attr_accessor :processing
    attr_accessor :redo_triggers
    attr_accessor :repair_diagnosis
    attr_accessor :reresolve
    attr_accessor :scoring
    attr_accessor :system_resources
    attr_accessor :thread_state
    attr_accessor :unresolve

    def self.from_json_data(data)
      out = Workload.new
      out.api_version = SenzingTypedef::from_json_data(String, data["apiVersion"])
      out.caches = SenzingTypedef::from_json_data(WorkloadCaches, data["caches"])
      out.candidates = SenzingTypedef::from_json_data(WorkloadCandidates, data["candidates"])
      out.contention = SenzingTypedef::from_json_data(WorkloadContention, data["contention"])
      out.datetimestamp = SenzingTypedef::from_json_data(String, data["datetimestamp"])
      out.expressed_features = SenzingTypedef::from_json_data(WorkloadExpressedFeatures, data["expressedFeatures"])
      out.generic_detect = SenzingTypedef::from_json_data(Fixme, data["genericDetect"])
      out.license = SenzingTypedef::from_json_data(WorkloadLicense, data["license"])
      out.loaded_records = SenzingTypedef::from_json_data(Integer, data["loadedRecords"])
      out.lock_waits = SenzingTypedef::from_json_data(WorkloadLockWaits, data["lockWaits"])
      out.processing = SenzingTypedef::from_json_data(WorkloadProcessing, data["processing"])
      out.redo_triggers = SenzingTypedef::from_json_data(Hash[String, Integer], data["redoTriggers"])
      out.repair_diagnosis = SenzingTypedef::from_json_data(WorkloadRepairDiagnosis, data["repairDiagnosis"])
      out.reresolve = SenzingTypedef::from_json_data(WorkloadReresolve, data["reresolve"])
      out.scoring = SenzingTypedef::from_json_data(WorkloadScoring, data["scoring"])
      out.system_resources = SenzingTypedef::from_json_data(WorkloadSystemResources, data["systemResources"])
      out.thread_state = SenzingTypedef::from_json_data(WorkloadThreadState, data["threadState"])
      out.unresolve = SenzingTypedef::from_json_data(WorkloadUnresolve, data["unresolve"])
      out
    end

    def to_json_data
      data = {}
      data["apiVersion"] = SenzingTypedef::to_json_data(api_version)
      data["caches"] = SenzingTypedef::to_json_data(caches)
      data["candidates"] = SenzingTypedef::to_json_data(candidates)
      data["contention"] = SenzingTypedef::to_json_data(contention)
      data["datetimestamp"] = SenzingTypedef::to_json_data(datetimestamp)
      data["expressedFeatures"] = SenzingTypedef::to_json_data(expressed_features)
      data["genericDetect"] = SenzingTypedef::to_json_data(generic_detect)
      data["license"] = SenzingTypedef::to_json_data(license)
      data["loadedRecords"] = SenzingTypedef::to_json_data(loaded_records)
      data["lockWaits"] = SenzingTypedef::to_json_data(lock_waits)
      data["processing"] = SenzingTypedef::to_json_data(processing)
      data["redoTriggers"] = SenzingTypedef::to_json_data(redo_triggers)
      data["repairDiagnosis"] = SenzingTypedef::to_json_data(repair_diagnosis)
      data["reresolve"] = SenzingTypedef::to_json_data(reresolve)
      data["scoring"] = SenzingTypedef::to_json_data(scoring)
      data["systemResources"] = SenzingTypedef::to_json_data(system_resources)
      data["threadState"] = SenzingTypedef::to_json_data(thread_state)
      data["unresolve"] = SenzingTypedef::to_json_data(unresolve)
      data
    end
  end

  class WorkloadCaches
    attr_accessor :lib_feat_cache_hit
    attr_accessor :lib_feat_cache_miss
    attr_accessor :lib_feat_insert
    attr_accessor :res_feat_stat_cache_hit
    attr_accessor :res_feat_stat_cache_miss
    attr_accessor :res_feat_stat_insert
    attr_accessor :res_feat_stat_update_attempt
    attr_accessor :res_feat_stat_update_fail

    def self.from_json_data(data)
      out = WorkloadCaches.new
      out.lib_feat_cache_hit = SenzingTypedef::from_json_data(Integer, data["libFeatCacheHit"])
      out.lib_feat_cache_miss = SenzingTypedef::from_json_data(Integer, data["libFeatCacheMiss"])
      out.lib_feat_insert = SenzingTypedef::from_json_data(Integer, data["libFeatInsert"])
      out.res_feat_stat_cache_hit = SenzingTypedef::from_json_data(Integer, data["resFeatStatCacheHit"])
      out.res_feat_stat_cache_miss = SenzingTypedef::from_json_data(Integer, data["resFeatStatCacheMiss"])
      out.res_feat_stat_insert = SenzingTypedef::from_json_data(Integer, data["resFeatStatInsert"])
      out.res_feat_stat_update_attempt = SenzingTypedef::from_json_data(Integer, data["resFeatStatUpdateAttempt"])
      out.res_feat_stat_update_fail = SenzingTypedef::from_json_data(Integer, data["resFeatStatUpdateFail"])
      out
    end

    def to_json_data
      data = {}
      data["libFeatCacheHit"] = SenzingTypedef::to_json_data(lib_feat_cache_hit)
      data["libFeatCacheMiss"] = SenzingTypedef::to_json_data(lib_feat_cache_miss)
      data["libFeatInsert"] = SenzingTypedef::to_json_data(lib_feat_insert)
      data["resFeatStatCacheHit"] = SenzingTypedef::to_json_data(res_feat_stat_cache_hit)
      data["resFeatStatCacheMiss"] = SenzingTypedef::to_json_data(res_feat_stat_cache_miss)
      data["resFeatStatInsert"] = SenzingTypedef::to_json_data(res_feat_stat_insert)
      data["resFeatStatUpdateAttempt"] = SenzingTypedef::to_json_data(res_feat_stat_update_attempt)
      data["resFeatStatUpdateFail"] = SenzingTypedef::to_json_data(res_feat_stat_update_fail)
      data
    end
  end

  class WorkloadCandidates
    attr_accessor :candidate_builders
    attr_accessor :suppressed_candidate_builders

    def self.from_json_data(data)
      out = WorkloadCandidates.new
      out.candidate_builders = SenzingTypedef::from_json_data(Hash[String, Integer], data["candidateBuilders"])
      out.suppressed_candidate_builders = SenzingTypedef::from_json_data(Hash[String, Integer], data["suppressedCandidateBuilders"])
      out
    end

    def to_json_data
      data = {}
      data["candidateBuilders"] = SenzingTypedef::to_json_data(candidate_builders)
      data["suppressedCandidateBuilders"] = SenzingTypedef::to_json_data(suppressed_candidate_builders)
      data
    end
  end

  class WorkloadContention
    attr_accessor :feature
    attr_accessor :res_ent
    attr_accessor :valuelatch

    def self.from_json_data(data)
      out = WorkloadContention.new
      out.feature = SenzingTypedef::from_json_data(Fixme, data["feature"])
      out.res_ent = SenzingTypedef::from_json_data(Fixme, data["resEnt"])
      out.valuelatch = SenzingTypedef::from_json_data(Fixme, data["valuelatch"])
      out
    end

    def to_json_data
      data = {}
      data["feature"] = SenzingTypedef::to_json_data(feature)
      data["resEnt"] = SenzingTypedef::to_json_data(res_ent)
      data["valuelatch"] = SenzingTypedef::to_json_data(valuelatch)
      data
    end
  end

  class WorkloadCurrResources
    attr_accessor :active_threads
    attr_accessor :available_memory
    attr_accessor :process_memory
    attr_accessor :worker_threads

    def self.from_json_data(data)
      out = WorkloadCurrResources.new
      out.active_threads = SenzingTypedef::from_json_data(Integer, data["activeThreads"])
      out.available_memory = SenzingTypedef::from_json_data(String, data["availableMemory"])
      out.process_memory = SenzingTypedef::from_json_data(String, data["processMemory"])
      out.worker_threads = SenzingTypedef::from_json_data(Integer, data["workerThreads"])
      out
    end

    def to_json_data
      data = {}
      data["activeThreads"] = SenzingTypedef::to_json_data(active_threads)
      data["availableMemory"] = SenzingTypedef::to_json_data(available_memory)
      data["processMemory"] = SenzingTypedef::to_json_data(process_memory)
      data["workerThreads"] = SenzingTypedef::to_json_data(worker_threads)
      data
    end
  end

  class WorkloadExpressedFeatures
    attr_accessor :calls
    attr_accessor :created

    def self.from_json_data(data)
      out = WorkloadExpressedFeatures.new
      out.calls = SenzingTypedef::from_json_data(Array[WorkloadExpressedFeaturesCall], data["calls"])
      out.created = SenzingTypedef::from_json_data(Hash[String, Integer], data["created"])
      out
    end

    def to_json_data
      data = {}
      data["calls"] = SenzingTypedef::to_json_data(calls)
      data["created"] = SenzingTypedef::to_json_data(created)
      data
    end
  end

  class WorkloadExpressedFeaturesCall
    attr_accessor :efcall_id
    attr_accessor :efunc_code
    attr_accessor :num_calls

    def self.from_json_data(data)
      out = WorkloadExpressedFeaturesCall.new
      out.efcall_id = SenzingTypedef::from_json_data(Integer, data["EFCALL_ID"])
      out.efunc_code = SenzingTypedef::from_json_data(String, data["EFUNC_CODE"])
      out.num_calls = SenzingTypedef::from_json_data(Integer, data["numCalls"])
      out
    end

    def to_json_data
      data = {}
      data["EFCALL_ID"] = SenzingTypedef::to_json_data(efcall_id)
      data["EFUNC_CODE"] = SenzingTypedef::to_json_data(efunc_code)
      data["numCalls"] = SenzingTypedef::to_json_data(num_calls)
      data
    end
  end

  class WorkloadInitResources
    attr_accessor :xxx_physical_cores
    attr_accessor :available_memory
    attr_accessor :logical_cores
    attr_accessor :total_memory

    def self.from_json_data(data)
      out = WorkloadInitResources.new
      out.xxx_physical_cores = SenzingTypedef::from_json_data(Integer, data["XXX_physicalCores"])
      out.available_memory = SenzingTypedef::from_json_data(String, data["availableMemory"])
      out.logical_cores = SenzingTypedef::from_json_data(Integer, data["logicalCores"])
      out.total_memory = SenzingTypedef::from_json_data(String, data["totalMemory"])
      out
    end

    def to_json_data
      data = {}
      data["XXX_physicalCores"] = SenzingTypedef::to_json_data(xxx_physical_cores)
      data["availableMemory"] = SenzingTypedef::to_json_data(available_memory)
      data["logicalCores"] = SenzingTypedef::to_json_data(logical_cores)
      data["totalMemory"] = SenzingTypedef::to_json_data(total_memory)
      data
    end
  end

  class WorkloadLicense
    attr_accessor :dsr_limit
    attr_accessor :status
    attr_accessor :type

    def self.from_json_data(data)
      out = WorkloadLicense.new
      out.dsr_limit = SenzingTypedef::from_json_data(String, data["dsrLimit"])
      out.status = SenzingTypedef::from_json_data(String, data["status"])
      out.type = SenzingTypedef::from_json_data(String, data["type"])
      out
    end

    def to_json_data
      data = {}
      data["dsrLimit"] = SenzingTypedef::to_json_data(dsr_limit)
      data["status"] = SenzingTypedef::to_json_data(status)
      data["type"] = SenzingTypedef::to_json_data(type)
      data
    end
  end

  class WorkloadLockWaits
    attr_accessor :refresh_locks

    def self.from_json_data(data)
      out = WorkloadLockWaits.new
      out.refresh_locks = SenzingTypedef::from_json_data(WorkloadRefreshLocks, data["refreshLocks"])
      out
    end

    def to_json_data
      data = {}
      data["refreshLocks"] = SenzingTypedef::to_json_data(refresh_locks)
      data
    end
  end

  class WorkloadProcessing
    attr_accessor :added_records
    attr_accessor :ambiguous
    attr_accessor :batch_added_records
    attr_accessor :deleted_records
    attr_accessor :details
    attr_accessor :reevaluations
    attr_accessor :repaired_entities

    def self.from_json_data(data)
      out = WorkloadProcessing.new
      out.added_records = SenzingTypedef::from_json_data(Integer, data["addedRecords"])
      out.ambiguous = SenzingTypedef::from_json_data(WorkloadProcessingAmbiguous, data["ambiguous"])
      out.batch_added_records = SenzingTypedef::from_json_data(Integer, data["batchAddedRecords"])
      out.deleted_records = SenzingTypedef::from_json_data(Integer, data["deletedRecords"])
      out.details = SenzingTypedef::from_json_data(WorkloadProcessingDetails, data["details"])
      out.reevaluations = SenzingTypedef::from_json_data(Integer, data["reevaluations"])
      out.repaired_entities = SenzingTypedef::from_json_data(Integer, data["repairedEntities"])
      out
    end

    def to_json_data
      data = {}
      data["addedRecords"] = SenzingTypedef::to_json_data(added_records)
      data["ambiguous"] = SenzingTypedef::to_json_data(ambiguous)
      data["batchAddedRecords"] = SenzingTypedef::to_json_data(batch_added_records)
      data["deletedRecords"] = SenzingTypedef::to_json_data(deleted_records)
      data["details"] = SenzingTypedef::to_json_data(details)
      data["reevaluations"] = SenzingTypedef::to_json_data(reevaluations)
      data["repairedEntities"] = SenzingTypedef::to_json_data(repaired_entities)
      data
    end
  end

  class WorkloadProcessingAmbiguous
    attr_accessor :actual_test
    attr_accessor :cached_test

    def self.from_json_data(data)
      out = WorkloadProcessingAmbiguous.new
      out.actual_test = SenzingTypedef::from_json_data(Integer, data["actualTest"])
      out.cached_test = SenzingTypedef::from_json_data(Integer, data["cachedTest"])
      out
    end

    def to_json_data
      data = {}
      data["actualTest"] = SenzingTypedef::to_json_data(actual_test)
      data["cachedTest"] = SenzingTypedef::to_json_data(cached_test)
      data
    end
  end

  class WorkloadProcessingDetails
    attr_accessor :added_records
    attr_accessor :candidates
    attr_accessor :change_deletes
    attr_accessor :duration
    attr_accessor :filtered_obs_feat
    attr_accessor :new_obs_ent
    attr_accessor :obs_ent_hash_diff
    attr_accessor :obs_ent_hash_same
    attr_accessor :optimized_out
    attr_accessor :optimized_out_skipped
    attr_accessor :partially_resolved
    attr_accessor :retries

    def self.from_json_data(data)
      out = WorkloadProcessingDetails.new
      out.added_records = SenzingTypedef::from_json_data(Integer, data["addedRecords"])
      out.candidates = SenzingTypedef::from_json_data(Integer, data["candidates"])
      out.change_deletes = SenzingTypedef::from_json_data(Integer, data["changeDeletes"])
      out.duration = SenzingTypedef::from_json_data(Integer, data["duration"])
      out.filtered_obs_feat = SenzingTypedef::from_json_data(Integer, data["filteredObsFeat"])
      out.new_obs_ent = SenzingTypedef::from_json_data(Integer, data["newObsEnt"])
      out.obs_ent_hash_diff = SenzingTypedef::from_json_data(Integer, data["obsEntHashDiff"])
      out.obs_ent_hash_same = SenzingTypedef::from_json_data(Integer, data["obsEntHashSame"])
      out.optimized_out = SenzingTypedef::from_json_data(Integer, data["optimizedOut"])
      out.optimized_out_skipped = SenzingTypedef::from_json_data(Integer, data["optimizedOutSkipped"])
      out.partially_resolved = SenzingTypedef::from_json_data(Integer, data["partiallyResolved"])
      out.retries = SenzingTypedef::from_json_data(Integer, data["retries"])
      out
    end

    def to_json_data
      data = {}
      data["addedRecords"] = SenzingTypedef::to_json_data(added_records)
      data["candidates"] = SenzingTypedef::to_json_data(candidates)
      data["changeDeletes"] = SenzingTypedef::to_json_data(change_deletes)
      data["duration"] = SenzingTypedef::to_json_data(duration)
      data["filteredObsFeat"] = SenzingTypedef::to_json_data(filtered_obs_feat)
      data["newObsEnt"] = SenzingTypedef::to_json_data(new_obs_ent)
      data["obsEntHashDiff"] = SenzingTypedef::to_json_data(obs_ent_hash_diff)
      data["obsEntHashSame"] = SenzingTypedef::to_json_data(obs_ent_hash_same)
      data["optimizedOut"] = SenzingTypedef::to_json_data(optimized_out)
      data["optimizedOutSkipped"] = SenzingTypedef::to_json_data(optimized_out_skipped)
      data["partiallyResolved"] = SenzingTypedef::to_json_data(partially_resolved)
      data["retries"] = SenzingTypedef::to_json_data(retries)
      data
    end
  end

  class WorkloadRefreshLocks
    attr_accessor :count
    attr_accessor :max_ms
    attr_accessor :total_ms

    def self.from_json_data(data)
      out = WorkloadRefreshLocks.new
      out.count = SenzingTypedef::from_json_data(Integer, data["count"])
      out.max_ms = SenzingTypedef::from_json_data(Integer, data["maxMS"])
      out.total_ms = SenzingTypedef::from_json_data(Integer, data["totalMS"])
      out
    end

    def to_json_data
      data = {}
      data["count"] = SenzingTypedef::to_json_data(count)
      data["maxMS"] = SenzingTypedef::to_json_data(max_ms)
      data["totalMS"] = SenzingTypedef::to_json_data(total_ms)
      data
    end
  end

  class WorkloadRepairDiagnosis
    attr_accessor :types

    def self.from_json_data(data)
      out = WorkloadRepairDiagnosis.new
      out.types = SenzingTypedef::from_json_data(Integer, data["types"])
      out
    end

    def to_json_data
      data = {}
      data["types"] = SenzingTypedef::to_json_data(types)
      data
    end
  end

  class WorkloadReresolve
    attr_accessor :new_feature_ftypes
    attr_accessor :suppressed_candidate_builders_for_reresolve
    attr_accessor :suppressed_scored_feature_type_for_reresolve
    attr_accessor :triggers

    def self.from_json_data(data)
      out = WorkloadReresolve.new
      out.new_feature_ftypes = SenzingTypedef::from_json_data(Hash[String, Integer], data["newFeatureFTypes"])
      out.suppressed_candidate_builders_for_reresolve = SenzingTypedef::from_json_data(Fixme, data["suppressedCandidateBuildersForReresolve"])
      out.suppressed_scored_feature_type_for_reresolve = SenzingTypedef::from_json_data(Fixme, data["suppressedScoredFeatureTypeForReresolve"])
      out.triggers = SenzingTypedef::from_json_data(WorkloadReresolveTriggers, data["triggers"])
      out
    end

    def to_json_data
      data = {}
      data["newFeatureFTypes"] = SenzingTypedef::to_json_data(new_feature_ftypes)
      data["suppressedCandidateBuildersForReresolve"] = SenzingTypedef::to_json_data(suppressed_candidate_builders_for_reresolve)
      data["suppressedScoredFeatureTypeForReresolve"] = SenzingTypedef::to_json_data(suppressed_scored_feature_type_for_reresolve)
      data["triggers"] = SenzingTypedef::to_json_data(triggers)
      data
    end
  end

  class WorkloadReresolveTriggers
    attr_accessor :abort_retry
    attr_accessor :multiple_resolvable_candidates
    attr_accessor :resolve_new_features
    attr_accessor :skipped
    attr_accessor :unresolve_movement

    def self.from_json_data(data)
      out = WorkloadReresolveTriggers.new
      out.abort_retry = SenzingTypedef::from_json_data(Integer, data["abortRetry"])
      out.multiple_resolvable_candidates = SenzingTypedef::from_json_data(Integer, data["multipleResolvableCandidates"])
      out.resolve_new_features = SenzingTypedef::from_json_data(Integer, data["resolveNewFeatures"])
      out.skipped = SenzingTypedef::from_json_data(Integer, data["skipped"])
      out.unresolve_movement = SenzingTypedef::from_json_data(Integer, data["unresolveMovement"])
      out
    end

    def to_json_data
      data = {}
      data["abortRetry"] = SenzingTypedef::to_json_data(abort_retry)
      data["multipleResolvableCandidates"] = SenzingTypedef::to_json_data(multiple_resolvable_candidates)
      data["resolveNewFeatures"] = SenzingTypedef::to_json_data(resolve_new_features)
      data["skipped"] = SenzingTypedef::to_json_data(skipped)
      data["unresolveMovement"] = SenzingTypedef::to_json_data(unresolve_movement)
      data
    end
  end

  class WorkloadScoring
    attr_accessor :cache_hit
    attr_accessor :cache_miss
    attr_accessor :scored_pairs
    attr_accessor :suppressed_disclosed_relationship_domain_count
    attr_accessor :suppressed_scored_feature_type

    def self.from_json_data(data)
      out = WorkloadScoring.new
      out.cache_hit = SenzingTypedef::from_json_data(Hash[String, Integer], data["cacheHit"])
      out.cache_miss = SenzingTypedef::from_json_data(Hash[String, Integer], data["cacheMiss"])
      out.scored_pairs = SenzingTypedef::from_json_data(Hash[String, Integer], data["scoredPairs"])
      out.suppressed_disclosed_relationship_domain_count = SenzingTypedef::from_json_data(Integer, data["suppressedDisclosedRelationshipDomainCount"])
      out.suppressed_scored_feature_type = SenzingTypedef::from_json_data(Fixme, data["suppressedScoredFeatureType"])
      out
    end

    def to_json_data
      data = {}
      data["cacheHit"] = SenzingTypedef::to_json_data(cache_hit)
      data["cacheMiss"] = SenzingTypedef::to_json_data(cache_miss)
      data["scoredPairs"] = SenzingTypedef::to_json_data(scored_pairs)
      data["suppressedDisclosedRelationshipDomainCount"] = SenzingTypedef::to_json_data(suppressed_disclosed_relationship_domain_count)
      data["suppressedScoredFeatureType"] = SenzingTypedef::to_json_data(suppressed_scored_feature_type)
      data
    end
  end

  class WorkloadSystemLoad
    attr_accessor :cpu_idle
    attr_accessor :cpu_system
    attr_accessor :cpu_user
    attr_accessor :cpu_wait

    def self.from_json_data(data)
      out = WorkloadSystemLoad.new
      out.cpu_idle = SenzingTypedef::from_json_data(String, data["cpuIdle"])
      out.cpu_system = SenzingTypedef::from_json_data(String, data["cpuSystem"])
      out.cpu_user = SenzingTypedef::from_json_data(String, data["cpuUser"])
      out.cpu_wait = SenzingTypedef::from_json_data(String, data["cpuWait"])
      out
    end

    def to_json_data
      data = {}
      data["cpuIdle"] = SenzingTypedef::to_json_data(cpu_idle)
      data["cpuSystem"] = SenzingTypedef::to_json_data(cpu_system)
      data["cpuUser"] = SenzingTypedef::to_json_data(cpu_user)
      data["cpuWait"] = SenzingTypedef::to_json_data(cpu_wait)
      data
    end
  end

  class WorkloadSystemResources
    attr_accessor :curr_resources
    attr_accessor :init_resources
    attr_accessor :system_load

    def self.from_json_data(data)
      out = WorkloadSystemResources.new
      out.curr_resources = SenzingTypedef::from_json_data(WorkloadCurrResources, data["currResources"])
      out.init_resources = SenzingTypedef::from_json_data(WorkloadInitResources, data["initResources"])
      out.system_load = SenzingTypedef::from_json_data(WorkloadSystemLoad, data["systemLoad"])
      out
    end

    def to_json_data
      data = {}
      data["currResources"] = SenzingTypedef::to_json_data(curr_resources)
      data["initResources"] = SenzingTypedef::to_json_data(init_resources)
      data["systemLoad"] = SenzingTypedef::to_json_data(system_load)
      data
    end
  end

  class WorkloadThreadState
    attr_accessor :active
    attr_accessor :data_latch_contention
    attr_accessor :governor_contention
    attr_accessor :idle
    attr_accessor :loader
    attr_accessor :obs_ent_contention
    attr_accessor :res_ent_contention
    attr_accessor :resolver
    attr_accessor :scoring
    attr_accessor :sql_executing

    def self.from_json_data(data)
      out = WorkloadThreadState.new
      out.active = SenzingTypedef::from_json_data(Integer, data["active"])
      out.data_latch_contention = SenzingTypedef::from_json_data(Integer, data["dataLatchContention"])
      out.governor_contention = SenzingTypedef::from_json_data(Integer, data["governorContention"])
      out.idle = SenzingTypedef::from_json_data(Integer, data["idle"])
      out.loader = SenzingTypedef::from_json_data(Integer, data["loader"])
      out.obs_ent_contention = SenzingTypedef::from_json_data(Integer, data["obsEntContention"])
      out.res_ent_contention = SenzingTypedef::from_json_data(Integer, data["resEntContention"])
      out.resolver = SenzingTypedef::from_json_data(Integer, data["resolver"])
      out.scoring = SenzingTypedef::from_json_data(Integer, data["scoring"])
      out.sql_executing = SenzingTypedef::from_json_data(Integer, data["sqlExecuting"])
      out
    end

    def to_json_data
      data = {}
      data["active"] = SenzingTypedef::to_json_data(active)
      data["dataLatchContention"] = SenzingTypedef::to_json_data(data_latch_contention)
      data["governorContention"] = SenzingTypedef::to_json_data(governor_contention)
      data["idle"] = SenzingTypedef::to_json_data(idle)
      data["loader"] = SenzingTypedef::to_json_data(loader)
      data["obsEntContention"] = SenzingTypedef::to_json_data(obs_ent_contention)
      data["resEntContention"] = SenzingTypedef::to_json_data(res_ent_contention)
      data["resolver"] = SenzingTypedef::to_json_data(resolver)
      data["scoring"] = SenzingTypedef::to_json_data(scoring)
      data["sqlExecuting"] = SenzingTypedef::to_json_data(sql_executing)
      data
    end
  end

  class WorkloadUnresolve
    attr_accessor :aborted_unresolve
    attr_accessor :triggers
    attr_accessor :unresolve_test

    def self.from_json_data(data)
      out = WorkloadUnresolve.new
      out.aborted_unresolve = SenzingTypedef::from_json_data(Integer, data["abortedUnresolve"])
      out.triggers = SenzingTypedef::from_json_data(WorkloadUnresolveTriggers, data["triggers"])
      out.unresolve_test = SenzingTypedef::from_json_data(Integer, data["unresolveTest"])
      out
    end

    def to_json_data
      data = {}
      data["abortedUnresolve"] = SenzingTypedef::to_json_data(aborted_unresolve)
      data["triggers"] = SenzingTypedef::to_json_data(triggers)
      data["unresolveTest"] = SenzingTypedef::to_json_data(unresolve_test)
      data
    end
  end

  class WorkloadUnresolveTriggers
    attr_accessor :ambiguous_multi_resolve
    attr_accessor :ambiguous_no_resolve
    attr_accessor :extensive_resolve
    attr_accessor :normal_resolve
    attr_accessor :rel_link
    attr_accessor :update

    def self.from_json_data(data)
      out = WorkloadUnresolveTriggers.new
      out.ambiguous_multi_resolve = SenzingTypedef::from_json_data(Integer, data["ambiguousMultiResolve"])
      out.ambiguous_no_resolve = SenzingTypedef::from_json_data(Integer, data["ambiguousNoResolve"])
      out.extensive_resolve = SenzingTypedef::from_json_data(Integer, data["extensiveResolve"])
      out.normal_resolve = SenzingTypedef::from_json_data(Integer, data["normalResolve"])
      out.rel_link = SenzingTypedef::from_json_data(Integer, data["relLink"])
      out.update = SenzingTypedef::from_json_data(Integer, data["update"])
      out
    end

    def to_json_data
      data = {}
      data["ambiguousMultiResolve"] = SenzingTypedef::to_json_data(ambiguous_multi_resolve)
      data["ambiguousNoResolve"] = SenzingTypedef::to_json_data(ambiguous_no_resolve)
      data["extensiveResolve"] = SenzingTypedef::to_json_data(extensive_resolve)
      data["normalResolve"] = SenzingTypedef::to_json_data(normal_resolve)
      data["relLink"] = SenzingTypedef::to_json_data(rel_link)
      data["update"] = SenzingTypedef::to_json_data(update)
      data
    end
  end

  private

  def self.from_json_data(type, data)
    if data.nil? || [Object, TrueClass, Integer, Float, String].include?(type)
      data
    elsif type == DateTime
      DateTime.rfc3339(data)
    elsif type.is_a?(Array)
      data.map { |elem| from_json_data(type.first, elem) }
    elsif type.is_a?(Hash)
      data.transform_values { |elem| from_json_data(type.values.first, elem) }
    else
      type.from_json_data(data)
    end
  end

  def self.to_json_data(data)
    if data.nil? || [TrueClass, FalseClass, Integer, Float, String].include?(data.class)
      data
    elsif data.is_a?(DateTime)
      data.rfc3339
    elsif data.is_a?(Array)
      data.map { |elem| to_json_data(elem) }
    elsif data.is_a?(Hash)
      data.transform_values { |elem| to_json_data(elem) }
    else
      data.to_json_data
    end
  end
end
