ICC profile, version 4: JavaScript parsing library

File extension

["icc", "icm"]

KS implementation details

License: CC0-1.0

References

This page hosts a formal specification of ICC profile, version 4 using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

Usage

Runtime library

All parsing code for JavaScript generated by Kaitai Struct depends on the JavaScript runtime library. You have to install it before you can parse data.

The JavaScript runtime library is available at npm:

npm install kaitai-struct

Code

See the usage examples in the JavaScript notes.

Parse structure from an ArrayBuffer:

var arrayBuffer = ...;
var data = new Icc4(new KaitaiStream(arrayBuffer));

After that, one can get various attributes from the structure by accessing fields or properties like:

data.header // => get header

JavaScript source code to parse ICC profile, version 4

Icc4.js

// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild

(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(['exports', 'kaitai-struct/KaitaiStream'], factory);
  } else if (typeof exports === 'object' && exports !== null && typeof exports.nodeType !== 'number') {
    factory(exports, require('kaitai-struct/KaitaiStream'));
  } else {
    factory(root.Icc4 || (root.Icc4 = {}), root.KaitaiStream);
  }
})(typeof self !== 'undefined' ? self : this, function (Icc4_, KaitaiStream) {
var Icc4 = (function() {
  function Icc4(_io, _parent, _root) {
    this._io = _io;
    this._parent = _parent;
    this._root = _root || this;

    this._read();
  }
  Icc4.prototype._read = function() {
    this.header = new ProfileHeader(this._io, this, this._root);
    this.tagTable = new TagTable(this._io, this, this._root);
  }

  var DateTimeNumber = Icc4.DateTimeNumber = (function() {
    function DateTimeNumber(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    DateTimeNumber.prototype._read = function() {
      this.year = this._io.readU2be();
      this.month = this._io.readU2be();
      this.day = this._io.readU2be();
      this.hour = this._io.readU2be();
      this.minute = this._io.readU2be();
      this.second = this._io.readU2be();
    }

    return DateTimeNumber;
  })();

  var DeviceAttributes = Icc4.DeviceAttributes = (function() {
    DeviceAttributes.DeviceAttributesColourOrBlackAndWhiteMedia = Object.freeze({
      COLOUR_MEDIA: 0,
      BLACK_AND_WHITE_MEDIA: 1,

      0: "COLOUR_MEDIA",
      1: "BLACK_AND_WHITE_MEDIA",
    });

    DeviceAttributes.DeviceAttributesGlossyOrMatte = Object.freeze({
      GLOSSY: 0,
      MATTE: 1,

      0: "GLOSSY",
      1: "MATTE",
    });

    DeviceAttributes.DeviceAttributesPositiveOrNegativeMediaPolarity = Object.freeze({
      POSITIVE_MEDIA_POLARITY: 0,
      NEGATIVE_MEDIA_POLARITY: 1,

      0: "POSITIVE_MEDIA_POLARITY",
      1: "NEGATIVE_MEDIA_POLARITY",
    });

    DeviceAttributes.DeviceAttributesReflectiveOrTransparency = Object.freeze({
      REFLECTIVE: 0,
      TRANSPARENCY: 1,

      0: "REFLECTIVE",
      1: "TRANSPARENCY",
    });

    function DeviceAttributes(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    DeviceAttributes.prototype._read = function() {
      this.reflectiveOrTransparency = this._io.readBitsIntBe(1);
      this.glossyOrMatte = this._io.readBitsIntBe(1);
      this.positiveOrNegativeMediaPolarity = this._io.readBitsIntBe(1);
      this.colourOrBlackAndWhiteMedia = this._io.readBitsIntBe(1);
      this.reserved = this._io.readBitsIntBe(28);
      this.vendorSpecific = this._io.readBitsIntBe(32);
    }

    return DeviceAttributes;
  })();

  var DeviceManufacturer = Icc4.DeviceManufacturer = (function() {
    DeviceManufacturer.DeviceManufacturers = Object.freeze({
      ERDT_SYSTEMS_GMBH_AND_CO_KG: 878981744,
      AAMAZING_TECHNOLOGIES_INC: 1094798657,
      ACER_PERIPHERALS: 1094927698,
      ACOLYTE_COLOR_RESEARCH: 1094929492,
      ACTIX_SYTEMS_INC: 1094931529,
      ADARA_TECHNOLOGY_INC: 1094992210,
      ADOBE_SYSTEMS_INCORPORATED: 1094992453,
      ADI_SYSTEMS_INC: 1094994208,
      AGFA_GRAPHICS_NV: 1095190081,
      ALPS_ELECTRIC_USA_INC: 1095519556,
      ALPS_ELECTRIC_USA_INC_2: 1095520339,
      ALWAN_COLOR_EXPERTISE: 1095522126,
      AMIABLE_TECHNOLOGIES_INC: 1095586889,
      AOC_INTERNATIONAL_USA_LTD: 1095713568,
      APAGO: 1095778631,
      APPLE_COMPUTER_INC: 1095782476,
      AST: 1095980064,
      ATANDT_COMPUTER_SYSTEMS: 1096033876,
      BARBIERI_ELECTRONIC: 1111573836,
      BARCO_NV: 1112687439,
      BREAKPOINT_PTY_LIMITED: 1112689488,
      BROTHER_INDUSTRIES_LTD: 1112690516,
      BULL: 1112886348,
      BUS_COMPUTER_SYSTEMS: 1112888096,
      C_ITOH: 1127041364,
      INTEL_CORPORATION: 1128353106,
      CANON_INC_CANON_DEVELOPMENT_AMERICAS_INC: 1128353359,
      CARROLL_TOUCH: 1128354386,
      CASIO_COMPUTER_CO_LTD: 1128354633,
      COLORBUS_PL: 1128420691,
      CROSSFIELD: 1128614944,
      CROSSFIELD_2: 1128615032,
      CGS_PUBLISHING_TECHNOLOGIES_INTERNATIONAL_GMBH: 1128747808,
      ROCHESTER_ROBOTICS: 1128811808,
      COLOUR_IMAGING_GROUP_LONDON: 1128875852,
      CITIZEN: 1128879177,
      CANDELA_LTD: 1129066544,
      COLOR_IQ: 1129072977,
      CHROMACO_INC: 1129136975,
      CHROMIX: 1129146712,
      COLORGRAPHIC_COMMUNICATIONS_CORPORATION: 1129270351,
      COMPAQ_COMPUTER_CORPORATION: 1129270608,
      COMPEQ_USA_FOCUS_TECHNOLOGY: 1129270640,
      CONRAC_DISPLAY_PRODUCTS: 1129270866,
      CORDATA_TECHNOLOGIES_INC: 1129271876,
      COMPAQ_COMPUTER_CORPORATION_2: 1129337120,
      COLORPRO: 1129337423,
      CORNERSTONE: 1129467424,
      CTX_INTERNATIONAL_INC: 1129601056,
      COLORVISION: 1129728339,
      FUJITSU_LABORATORIES_LTD: 1129792288,
      DARIUS_TECHNOLOGY_LTD: 1145131593,
      DATAPRODUCTS: 1145132097,
      DRY_CREEK_PHOTO: 1145262112,
      DIGITAL_CONTENTS_RESOURCE_CENTER_CHUNG_ANG_UNIVERSITY: 1145262659,
      DELL_COMPUTER_CORPORATION: 1145392204,
      DAINIPPON_INK_AND_CHEMICALS: 1145652000,
      DICONIX: 1145652047,
      DIGITAL: 1145653065,
      DIGITAL_LIGHT_AND_COLOR: 1145841219,
      DOPPELGANGER_LLC: 1146113095,
      DAINIPPON_SCREEN: 1146298400,
      DOOSOL: 1146310476,
      DUPONT: 1146441806,
      EPSON: 1162892111,
      ESKO_GRAPHICS: 1163086671,
      ELECTRONICS_AND_TELECOMMUNICATIONS_RESEARCH_INSTITUTE: 1163153993,
      EVEREX_SYSTEMS_INC: 1163281746,
      EXACTCODE_GMBH: 1163411779,
      EIZO_NANAO_CORPORATION: 1164540527,
      FALCO_DATA_PRODUCTS_INC: 1178684483,
      FUJI_PHOTO_FILM_COLTD: 1179000864,
      FUJIFILM_ELECTRONIC_IMAGING_LTD: 1179010377,
      FNORD_SOFTWARE: 1179537988,
      FORA_INC: 1179603521,
      FOREFRONT_TECHNOLOGY_CORPORATION: 1179603525,
      FUJITSU: 1179658794,
      WAYTECH_DEVELOPMENT_INC: 1179664672,
      FUJITSU_2: 1179994697,
      FUJI_XEROX_CO_LTD: 1180180512,
      GCC_TECHNOLOGIES_INC: 1195590432,
      GLOBAL_GRAPHICS_SOFTWARE_LIMITED: 1195856716,
      GRETAGMACBETH: 1196245536,
      GMG_GMBH_AND_CO_KG: 1196246816,
      GOLDSTAR_TECHNOLOGY_INC: 1196379204,
      GIANTPRINT_PTY_LTD: 1196446292,
      GRETAGMACBETH_2: 1196707138,
      WAYTECH_DEVELOPMENT_INC_2: 1196835616,
      SONY_CORPORATION: 1196896843,
      HCI: 1212369184,
      HEIDELBERGER_DRUCKMASCHINEN_AG: 1212435744,
      HERMES: 1212502605,
      HITACHI_AMERICA_LTD: 1212765249,
      HEWLETT_PACKARD: 1213210656,
      HITACHI_LTD: 1213481760,
      HITI_DIGITAL_INC: 1214862441,
      IBM_CORPORATION: 1229081888,
      SCITEX_CORPORATION_LTD: 1229213268,
      HEWLETT_PACKARD_2: 1229275936,
      IIYAMA_NORTH_AMERICA_INC: 1229543745,
      IKEGAMI_ELECTRONICS_INC: 1229669703,
      IMAGE_SYSTEMS_CORPORATION: 1229799751,
      INGRAM_MICRO_INC: 1229801760,
      INTEL_CORPORATION_2: 1229870147,
      INTL: 1229870156,
      INTRA_ELECTRONICS_USA_INC: 1229870162,
      IOCOMM_INTERNATIONAL_TECHNOLOGY_CORPORATION: 1229931343,
      INFOPRINT_SOLUTIONS_COMPANY: 1230000928,
      SCITEX_CORPORATION_LTD_3: 1230129491,
      ICHIKAWA_SOFT_LABORATORY: 1230195744,
      ITNL: 1230261836,
      IVM: 1230392608,
      IWATSU_ELECTRIC_CO_LTD: 1230455124,
      SCITEX_CORPORATION_LTD_2: 1231318644,
      INCA_DIGITAL_PRINTERS_LTD: 1231971169,
      SCITEX_CORPORATION_LTD_4: 1232234867,
      JETSOFT_DEVELOPMENT: 1246971476,
      JVC_INFORMATION_PRODUCTS_CO: 1247167264,
      SCITEX_CORPORATION_LTD_6: 1262572116,
      KFC_COMPUTEK_COMPONENTS_CORPORATION: 1262895904,
      KLH_COMPUTERS: 1263290400,
      KONICA_MINOLTA_HOLDINGS_INC: 1263355972,
      KONICA_CORPORATION: 1263420225,
      KODAK: 1263486017,
      KYOCERA: 1264144195,
      SCITEX_CORPORATION_LTD_7: 1264677492,
      LEICA_CAMERA_AG: 1279476039,
      LEEDS_COLOUR: 1279476548,
      LEFT_DAKOTA: 1279541579,
      LEADING_TECHNOLOGY_INC: 1279607108,
      LEXMARK_INTERNATIONAL_INC: 1279613005,
      LINK_COMPUTER_INC: 1279872587,
      LINOTRONIC: 1279872591,
      LITE_ON_INC: 1279874117,
      MAG_COMPUTRONIC_USA_INC: 1296123715,
      MAG_INNOVISION_INC: 1296123721,
      MANNESMANN: 1296125518,
      MICRON_TECHNOLOGY_INC: 1296646990,
      MICROTEK: 1296646994,
      MICROVITEC_INC: 1296646998,
      MINOLTA: 1296649807,
      MITSUBISHI_ELECTRONICS_AMERICA_INC: 1296651347,
      MITSUBA_CORPORATION: 1296651379,
      MINOLTA_2: 1296976980,
      MODGRAPH_INC: 1297040455,
      MONITRONIX_INC: 1297043017,
      MONACO_SYSTEMS_INC: 1297043027,
      MORSE_TECHNOLOGY_INC: 1297044051,
      MOTIVE_SYSTEMS: 1297044553,
      MICROSOFT_CORPORATION: 1297303124,
      MUTOH_INDUSTRIES_LTD: 1297437775,
      MITSUBISHI_ELECTRIC_CORPORATION_KYOTO_WORKS: 1298756723,
      NANAO_USA_CORPORATION: 1312902721,
      NEC_CORPORATION: 1313162016,
      NEXPRESS_SOLUTIONS_LLC: 1313167440,
      NISSEI_SANGYO_AMERICA_LTD: 1313428307,
      NIKON_CORPORATION: 1313558350,
      OCE_TECHNOLOGIES_BV: 1329808672,
      OCECOLOR: 1329808707,
      OKI: 1330333984,
      OKIDATA: 1330334020,
      OKIDATA_2: 1330334032,
      OLIVETTI: 1330399574,
      OLYMPUS_OPTICAL_CO_LTD: 1330403661,
      ONYX_GRAPHICS: 1330534744,
      OPTIQUEST: 1330664521,
      PACKARD_BELL: 1346454347,
      MATSUSHITA_ELECTRIC_INDUSTRIAL_CO_LTD: 1346457153,
      PANTONE_INC: 1346457172,
      PACKARD_BELL_2: 1346522656,
      PFU_LIMITED: 1346786592,
      PHILIPS_CONSUMER_ELECTRONICS_CO: 1346914636,
      HOYA_CORPORATION_PENTAX_IMAGING_SYSTEMS_DIVISION: 1347310680,
      PHASE_ONE_A_S: 1347382885,
      PREMIER_COMPUTER_INNOVATIONS: 1347568973,
      PRINCETON_GRAPHIC_SYSTEMS: 1347569998,
      PRINCETON_PUBLISHING_LABS: 1347570000,
      QLUX: 1363957080,
      QMS_INC: 1364022048,
      QPCARD_AB: 1364214596,
      QUADLASER: 1364541764,
      QUME_CORPORATION: 1364544837,
      RADIUS_INC: 1380009033,
      INTEGRATED_COLOR_SOLUTIONS_INC_2: 1380205688,
      ROLAND_DG_CORPORATION: 1380206368,
      REDMS_GROUP_INC: 1380271181,
      RELISYS: 1380273225,
      ROLF_GIERLING_MULTITOOLS: 1380404563,
      RICOH_CORPORATION: 1380533071,
      EDMUND_RONALD: 1380863044,
      ROYAL: 1380931905,
      RICOH_PRINTING_SYSTEMSLTD: 1380991776,
      ROYAL_INFORMATION_ELECTRONICS_CO_LTD: 1381256224,
      SAMPO_CORPORATION_OF_AMERICA: 1396788560,
      SAMSUNG_INC: 1396788563,
      JAIME_SANTANA_POMARES: 1396788820,
      SCITEX_CORPORATION_LTD_9: 1396918612,
      DAINIPPON_SCREEN_3: 1396920910,
      SCITEX_CORPORATION_LTD_12: 1396985888,
      SAMSUNG_ELECTRONICS_COLTD: 1397048096,
      SEIKO_INSTRUMENTS_USA_INC: 1397049675,
      SEIKOSHA: 1397049707,
      SCANGUYCOM: 1397183833,
      SHARP_LABORATORIES: 1397244242,
      INTERNATIONAL_COLOR_CONSORTIUM: 1397310275,
      SONY_CORPORATION_2: 1397706329,
      SPECTRACAL: 1397769036,
      STAR: 1398030674,
      SAMPO_TECHNOLOGY_CORPORATION: 1398031136,
      SCITEX_CORPORATION_LTD_10: 1399023988,
      SCITEX_CORPORATION_LTD_13: 1399091232,
      SONY_CORPORATION_3: 1399811705,
      TALON_TECHNOLOGY_CORPORATION: 1413565519,
      TANDY: 1413566020,
      TATUNG_CO_OF_AMERICA_INC: 1413567573,
      TAXAN_AMERICA_INC: 1413568577,
      TOKYO_DENSHI_SEKEI_KK: 1413763872,
      TECO_INFORMATION_SYSTEMS_INC: 1413825359,
      TEGRA: 1413826386,
      TEKTRONIX_INC: 1413827412,
      TEXAS_INSTRUMENTS: 1414078496,
      TYPEMAKER_LTD: 1414351698,
      TOSHIBA_CORP: 1414484802,
      TOSHIBA_INC: 1414484808,
      TOTOKU_ELECTRIC_CO_LTD: 1414485067,
      TRIUMPH: 1414678869,
      TOSHIBA_TEC_CORPORATION: 1414742612,
      TTX_COMPUTER_PRODUCTS_INC: 1414813728,
      TVM_PROFESSIONAL_MONITOR_CORPORATION: 1414941984,
      TW_CASPER_CORPORATION: 1414996000,
      ULEAD_SYSTEMS: 1431065432,
      UNISYS: 1431193939,
      UTZ_FEHLAU_AND_SOHN: 1431591494,
      VARITYPER: 1447121481,
      VIEWSONIC: 1447642455,
      VISUAL_COMMUNICATION: 1447646028,
      WANG: 1463897671,
      WILBUR_IMAGING: 1464615506,
      WARE_TO_GO: 1465141042,
      WYSE_TECHNOLOGY: 1465471813,
      XEROX_CORPORATION: 1480938072,
      X_RITE: 1481787732,
      LAVANYAS_TEST_COMPANY: 1513173555,
      ZORAN_CORPORATION: 1515340110,
      ZEBRA_TECHNOLOGIES_INC: 1516593778,
      BASICCOLOR_GMBH: 1648968515,
      BERGDESIGN_INCORPORATED: 1650815591,
      INTEGRATED_COLOR_SOLUTIONS_INC: 1667594596,
      MACDERMID_COLORSPAN_INC: 1668051824,
      DAINIPPON_SCREEN_2: 1685266464,
      DUPONT_2: 1685418094,
      FUJIFILM_ELECTRONIC_IMAGING_LTD_2: 1717986665,
      FLUXDATA_CORPORATION: 1718383992,
      SCITEX_CORPORATION_LTD_5: 1769105779,
      SCITEX_CORPORATION_LTD_8: 1801548404,
      ERDT_SYSTEMS_GMBH_AND_CO_KG_2: 1868706916,
      MEDIGRAPH_GMBH: 1868720483,
      QUBYX_SARL: 1903518329,
      SCITEX_CORPORATION_LTD_11: 1935894900,
      DAINIPPON_SCREEN_4: 1935897198,
      SCITEX_CORPORATION_LTD_14: 1935962144,
      SIWI_GRAFIKA_CORPORATION: 1936291689,
      YXYMASTER_GMBH: 2037938541,

      878981744: "ERDT_SYSTEMS_GMBH_AND_CO_KG",
      1094798657: "AAMAZING_TECHNOLOGIES_INC",
      1094927698: "ACER_PERIPHERALS",
      1094929492: "ACOLYTE_COLOR_RESEARCH",
      1094931529: "ACTIX_SYTEMS_INC",
      1094992210: "ADARA_TECHNOLOGY_INC",
      1094992453: "ADOBE_SYSTEMS_INCORPORATED",
      1094994208: "ADI_SYSTEMS_INC",
      1095190081: "AGFA_GRAPHICS_NV",
      1095519556: "ALPS_ELECTRIC_USA_INC",
      1095520339: "ALPS_ELECTRIC_USA_INC_2",
      1095522126: "ALWAN_COLOR_EXPERTISE",
      1095586889: "AMIABLE_TECHNOLOGIES_INC",
      1095713568: "AOC_INTERNATIONAL_USA_LTD",
      1095778631: "APAGO",
      1095782476: "APPLE_COMPUTER_INC",
      1095980064: "AST",
      1096033876: "ATANDT_COMPUTER_SYSTEMS",
      1111573836: "BARBIERI_ELECTRONIC",
      1112687439: "BARCO_NV",
      1112689488: "BREAKPOINT_PTY_LIMITED",
      1112690516: "BROTHER_INDUSTRIES_LTD",
      1112886348: "BULL",
      1112888096: "BUS_COMPUTER_SYSTEMS",
      1127041364: "C_ITOH",
      1128353106: "INTEL_CORPORATION",
      1128353359: "CANON_INC_CANON_DEVELOPMENT_AMERICAS_INC",
      1128354386: "CARROLL_TOUCH",
      1128354633: "CASIO_COMPUTER_CO_LTD",
      1128420691: "COLORBUS_PL",
      1128614944: "CROSSFIELD",
      1128615032: "CROSSFIELD_2",
      1128747808: "CGS_PUBLISHING_TECHNOLOGIES_INTERNATIONAL_GMBH",
      1128811808: "ROCHESTER_ROBOTICS",
      1128875852: "COLOUR_IMAGING_GROUP_LONDON",
      1128879177: "CITIZEN",
      1129066544: "CANDELA_LTD",
      1129072977: "COLOR_IQ",
      1129136975: "CHROMACO_INC",
      1129146712: "CHROMIX",
      1129270351: "COLORGRAPHIC_COMMUNICATIONS_CORPORATION",
      1129270608: "COMPAQ_COMPUTER_CORPORATION",
      1129270640: "COMPEQ_USA_FOCUS_TECHNOLOGY",
      1129270866: "CONRAC_DISPLAY_PRODUCTS",
      1129271876: "CORDATA_TECHNOLOGIES_INC",
      1129337120: "COMPAQ_COMPUTER_CORPORATION_2",
      1129337423: "COLORPRO",
      1129467424: "CORNERSTONE",
      1129601056: "CTX_INTERNATIONAL_INC",
      1129728339: "COLORVISION",
      1129792288: "FUJITSU_LABORATORIES_LTD",
      1145131593: "DARIUS_TECHNOLOGY_LTD",
      1145132097: "DATAPRODUCTS",
      1145262112: "DRY_CREEK_PHOTO",
      1145262659: "DIGITAL_CONTENTS_RESOURCE_CENTER_CHUNG_ANG_UNIVERSITY",
      1145392204: "DELL_COMPUTER_CORPORATION",
      1145652000: "DAINIPPON_INK_AND_CHEMICALS",
      1145652047: "DICONIX",
      1145653065: "DIGITAL",
      1145841219: "DIGITAL_LIGHT_AND_COLOR",
      1146113095: "DOPPELGANGER_LLC",
      1146298400: "DAINIPPON_SCREEN",
      1146310476: "DOOSOL",
      1146441806: "DUPONT",
      1162892111: "EPSON",
      1163086671: "ESKO_GRAPHICS",
      1163153993: "ELECTRONICS_AND_TELECOMMUNICATIONS_RESEARCH_INSTITUTE",
      1163281746: "EVEREX_SYSTEMS_INC",
      1163411779: "EXACTCODE_GMBH",
      1164540527: "EIZO_NANAO_CORPORATION",
      1178684483: "FALCO_DATA_PRODUCTS_INC",
      1179000864: "FUJI_PHOTO_FILM_COLTD",
      1179010377: "FUJIFILM_ELECTRONIC_IMAGING_LTD",
      1179537988: "FNORD_SOFTWARE",
      1179603521: "FORA_INC",
      1179603525: "FOREFRONT_TECHNOLOGY_CORPORATION",
      1179658794: "FUJITSU",
      1179664672: "WAYTECH_DEVELOPMENT_INC",
      1179994697: "FUJITSU_2",
      1180180512: "FUJI_XEROX_CO_LTD",
      1195590432: "GCC_TECHNOLOGIES_INC",
      1195856716: "GLOBAL_GRAPHICS_SOFTWARE_LIMITED",
      1196245536: "GRETAGMACBETH",
      1196246816: "GMG_GMBH_AND_CO_KG",
      1196379204: "GOLDSTAR_TECHNOLOGY_INC",
      1196446292: "GIANTPRINT_PTY_LTD",
      1196707138: "GRETAGMACBETH_2",
      1196835616: "WAYTECH_DEVELOPMENT_INC_2",
      1196896843: "SONY_CORPORATION",
      1212369184: "HCI",
      1212435744: "HEIDELBERGER_DRUCKMASCHINEN_AG",
      1212502605: "HERMES",
      1212765249: "HITACHI_AMERICA_LTD",
      1213210656: "HEWLETT_PACKARD",
      1213481760: "HITACHI_LTD",
      1214862441: "HITI_DIGITAL_INC",
      1229081888: "IBM_CORPORATION",
      1229213268: "SCITEX_CORPORATION_LTD",
      1229275936: "HEWLETT_PACKARD_2",
      1229543745: "IIYAMA_NORTH_AMERICA_INC",
      1229669703: "IKEGAMI_ELECTRONICS_INC",
      1229799751: "IMAGE_SYSTEMS_CORPORATION",
      1229801760: "INGRAM_MICRO_INC",
      1229870147: "INTEL_CORPORATION_2",
      1229870156: "INTL",
      1229870162: "INTRA_ELECTRONICS_USA_INC",
      1229931343: "IOCOMM_INTERNATIONAL_TECHNOLOGY_CORPORATION",
      1230000928: "INFOPRINT_SOLUTIONS_COMPANY",
      1230129491: "SCITEX_CORPORATION_LTD_3",
      1230195744: "ICHIKAWA_SOFT_LABORATORY",
      1230261836: "ITNL",
      1230392608: "IVM",
      1230455124: "IWATSU_ELECTRIC_CO_LTD",
      1231318644: "SCITEX_CORPORATION_LTD_2",
      1231971169: "INCA_DIGITAL_PRINTERS_LTD",
      1232234867: "SCITEX_CORPORATION_LTD_4",
      1246971476: "JETSOFT_DEVELOPMENT",
      1247167264: "JVC_INFORMATION_PRODUCTS_CO",
      1262572116: "SCITEX_CORPORATION_LTD_6",
      1262895904: "KFC_COMPUTEK_COMPONENTS_CORPORATION",
      1263290400: "KLH_COMPUTERS",
      1263355972: "KONICA_MINOLTA_HOLDINGS_INC",
      1263420225: "KONICA_CORPORATION",
      1263486017: "KODAK",
      1264144195: "KYOCERA",
      1264677492: "SCITEX_CORPORATION_LTD_7",
      1279476039: "LEICA_CAMERA_AG",
      1279476548: "LEEDS_COLOUR",
      1279541579: "LEFT_DAKOTA",
      1279607108: "LEADING_TECHNOLOGY_INC",
      1279613005: "LEXMARK_INTERNATIONAL_INC",
      1279872587: "LINK_COMPUTER_INC",
      1279872591: "LINOTRONIC",
      1279874117: "LITE_ON_INC",
      1296123715: "MAG_COMPUTRONIC_USA_INC",
      1296123721: "MAG_INNOVISION_INC",
      1296125518: "MANNESMANN",
      1296646990: "MICRON_TECHNOLOGY_INC",
      1296646994: "MICROTEK",
      1296646998: "MICROVITEC_INC",
      1296649807: "MINOLTA",
      1296651347: "MITSUBISHI_ELECTRONICS_AMERICA_INC",
      1296651379: "MITSUBA_CORPORATION",
      1296976980: "MINOLTA_2",
      1297040455: "MODGRAPH_INC",
      1297043017: "MONITRONIX_INC",
      1297043027: "MONACO_SYSTEMS_INC",
      1297044051: "MORSE_TECHNOLOGY_INC",
      1297044553: "MOTIVE_SYSTEMS",
      1297303124: "MICROSOFT_CORPORATION",
      1297437775: "MUTOH_INDUSTRIES_LTD",
      1298756723: "MITSUBISHI_ELECTRIC_CORPORATION_KYOTO_WORKS",
      1312902721: "NANAO_USA_CORPORATION",
      1313162016: "NEC_CORPORATION",
      1313167440: "NEXPRESS_SOLUTIONS_LLC",
      1313428307: "NISSEI_SANGYO_AMERICA_LTD",
      1313558350: "NIKON_CORPORATION",
      1329808672: "OCE_TECHNOLOGIES_BV",
      1329808707: "OCECOLOR",
      1330333984: "OKI",
      1330334020: "OKIDATA",
      1330334032: "OKIDATA_2",
      1330399574: "OLIVETTI",
      1330403661: "OLYMPUS_OPTICAL_CO_LTD",
      1330534744: "ONYX_GRAPHICS",
      1330664521: "OPTIQUEST",
      1346454347: "PACKARD_BELL",
      1346457153: "MATSUSHITA_ELECTRIC_INDUSTRIAL_CO_LTD",
      1346457172: "PANTONE_INC",
      1346522656: "PACKARD_BELL_2",
      1346786592: "PFU_LIMITED",
      1346914636: "PHILIPS_CONSUMER_ELECTRONICS_CO",
      1347310680: "HOYA_CORPORATION_PENTAX_IMAGING_SYSTEMS_DIVISION",
      1347382885: "PHASE_ONE_A_S",
      1347568973: "PREMIER_COMPUTER_INNOVATIONS",
      1347569998: "PRINCETON_GRAPHIC_SYSTEMS",
      1347570000: "PRINCETON_PUBLISHING_LABS",
      1363957080: "QLUX",
      1364022048: "QMS_INC",
      1364214596: "QPCARD_AB",
      1364541764: "QUADLASER",
      1364544837: "QUME_CORPORATION",
      1380009033: "RADIUS_INC",
      1380205688: "INTEGRATED_COLOR_SOLUTIONS_INC_2",
      1380206368: "ROLAND_DG_CORPORATION",
      1380271181: "REDMS_GROUP_INC",
      1380273225: "RELISYS",
      1380404563: "ROLF_GIERLING_MULTITOOLS",
      1380533071: "RICOH_CORPORATION",
      1380863044: "EDMUND_RONALD",
      1380931905: "ROYAL",
      1380991776: "RICOH_PRINTING_SYSTEMSLTD",
      1381256224: "ROYAL_INFORMATION_ELECTRONICS_CO_LTD",
      1396788560: "SAMPO_CORPORATION_OF_AMERICA",
      1396788563: "SAMSUNG_INC",
      1396788820: "JAIME_SANTANA_POMARES",
      1396918612: "SCITEX_CORPORATION_LTD_9",
      1396920910: "DAINIPPON_SCREEN_3",
      1396985888: "SCITEX_CORPORATION_LTD_12",
      1397048096: "SAMSUNG_ELECTRONICS_COLTD",
      1397049675: "SEIKO_INSTRUMENTS_USA_INC",
      1397049707: "SEIKOSHA",
      1397183833: "SCANGUYCOM",
      1397244242: "SHARP_LABORATORIES",
      1397310275: "INTERNATIONAL_COLOR_CONSORTIUM",
      1397706329: "SONY_CORPORATION_2",
      1397769036: "SPECTRACAL",
      1398030674: "STAR",
      1398031136: "SAMPO_TECHNOLOGY_CORPORATION",
      1399023988: "SCITEX_CORPORATION_LTD_10",
      1399091232: "SCITEX_CORPORATION_LTD_13",
      1399811705: "SONY_CORPORATION_3",
      1413565519: "TALON_TECHNOLOGY_CORPORATION",
      1413566020: "TANDY",
      1413567573: "TATUNG_CO_OF_AMERICA_INC",
      1413568577: "TAXAN_AMERICA_INC",
      1413763872: "TOKYO_DENSHI_SEKEI_KK",
      1413825359: "TECO_INFORMATION_SYSTEMS_INC",
      1413826386: "TEGRA",
      1413827412: "TEKTRONIX_INC",
      1414078496: "TEXAS_INSTRUMENTS",
      1414351698: "TYPEMAKER_LTD",
      1414484802: "TOSHIBA_CORP",
      1414484808: "TOSHIBA_INC",
      1414485067: "TOTOKU_ELECTRIC_CO_LTD",
      1414678869: "TRIUMPH",
      1414742612: "TOSHIBA_TEC_CORPORATION",
      1414813728: "TTX_COMPUTER_PRODUCTS_INC",
      1414941984: "TVM_PROFESSIONAL_MONITOR_CORPORATION",
      1414996000: "TW_CASPER_CORPORATION",
      1431065432: "ULEAD_SYSTEMS",
      1431193939: "UNISYS",
      1431591494: "UTZ_FEHLAU_AND_SOHN",
      1447121481: "VARITYPER",
      1447642455: "VIEWSONIC",
      1447646028: "VISUAL_COMMUNICATION",
      1463897671: "WANG",
      1464615506: "WILBUR_IMAGING",
      1465141042: "WARE_TO_GO",
      1465471813: "WYSE_TECHNOLOGY",
      1480938072: "XEROX_CORPORATION",
      1481787732: "X_RITE",
      1513173555: "LAVANYAS_TEST_COMPANY",
      1515340110: "ZORAN_CORPORATION",
      1516593778: "ZEBRA_TECHNOLOGIES_INC",
      1648968515: "BASICCOLOR_GMBH",
      1650815591: "BERGDESIGN_INCORPORATED",
      1667594596: "INTEGRATED_COLOR_SOLUTIONS_INC",
      1668051824: "MACDERMID_COLORSPAN_INC",
      1685266464: "DAINIPPON_SCREEN_2",
      1685418094: "DUPONT_2",
      1717986665: "FUJIFILM_ELECTRONIC_IMAGING_LTD_2",
      1718383992: "FLUXDATA_CORPORATION",
      1769105779: "SCITEX_CORPORATION_LTD_5",
      1801548404: "SCITEX_CORPORATION_LTD_8",
      1868706916: "ERDT_SYSTEMS_GMBH_AND_CO_KG_2",
      1868720483: "MEDIGRAPH_GMBH",
      1903518329: "QUBYX_SARL",
      1935894900: "SCITEX_CORPORATION_LTD_11",
      1935897198: "DAINIPPON_SCREEN_4",
      1935962144: "SCITEX_CORPORATION_LTD_14",
      1936291689: "SIWI_GRAFIKA_CORPORATION",
      2037938541: "YXYMASTER_GMBH",
    });

    function DeviceManufacturer(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    DeviceManufacturer.prototype._read = function() {
      this.deviceManufacturer = this._io.readU4be();
    }

    return DeviceManufacturer;
  })();

  var PositionNumber = Icc4.PositionNumber = (function() {
    function PositionNumber(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    PositionNumber.prototype._read = function() {
      this.offsetToDataElement = this._io.readU4be();
      this.sizeOfDataElement = this._io.readU4be();
    }

    return PositionNumber;
  })();

  var ProfileHeader = Icc4.ProfileHeader = (function() {
    ProfileHeader.CmmSignatures = Object.freeze({
      THE_IMAGING_FACTORY_CMM: 858931796,
      AGFA_CMM: 1094929747,
      ADOBE_CMM: 1094992453,
      COLOR_GEAR_CMM: 1128484179,
      DEMOICCMAX_CMM: 1145654616,
      LOGOSYNC_CMM: 1147629395,
      EFI_CMM: 1162234144,
      EXACT_SCAN_CMM: 1163411779,
      FUJI_FILM_CMM: 1179000864,
      HARLEQUIN_RIP_CMM: 1212370253,
      HEIDELBERG_CMM: 1212435744,
      KODAK_CMM: 1262701907,
      KONICA_MINOLTA_CMM: 1296256324,
      ONYX_GRAPHICS_CMM: 1330534744,
      DEVICE_LINK_CMM: 1380404563,
      REFICCMAX_CMM: 1380535640,
      SAMPLE_ICC_CMM: 1397310275,
      MUTOH_CMM: 1397311310,
      TOSHIBA_CMM: 1413696845,
      COLOR_GEAR_CMM_LITE: 1430471501,
      COLOR_GEAR_CMM_C: 1430474067,
      WINDOWS_COLOR_SYSTEM_CMM: 1464029984,
      WARE_TO_GO_CMM: 1465141024,
      APPLE_CMM: 1634758764,
      ARGYLL_CMS_CMM: 1634887532,
      LITTLE_CMS_CMM: 1818455411,
      VIVO_CMM: 1986623087,
      ZORAN_CMM: 2053320752,

      858931796: "THE_IMAGING_FACTORY_CMM",
      1094929747: "AGFA_CMM",
      1094992453: "ADOBE_CMM",
      1128484179: "COLOR_GEAR_CMM",
      1145654616: "DEMOICCMAX_CMM",
      1147629395: "LOGOSYNC_CMM",
      1162234144: "EFI_CMM",
      1163411779: "EXACT_SCAN_CMM",
      1179000864: "FUJI_FILM_CMM",
      1212370253: "HARLEQUIN_RIP_CMM",
      1212435744: "HEIDELBERG_CMM",
      1262701907: "KODAK_CMM",
      1296256324: "KONICA_MINOLTA_CMM",
      1330534744: "ONYX_GRAPHICS_CMM",
      1380404563: "DEVICE_LINK_CMM",
      1380535640: "REFICCMAX_CMM",
      1397310275: "SAMPLE_ICC_CMM",
      1397311310: "MUTOH_CMM",
      1413696845: "TOSHIBA_CMM",
      1430471501: "COLOR_GEAR_CMM_LITE",
      1430474067: "COLOR_GEAR_CMM_C",
      1464029984: "WINDOWS_COLOR_SYSTEM_CMM",
      1465141024: "WARE_TO_GO_CMM",
      1634758764: "APPLE_CMM",
      1634887532: "ARGYLL_CMS_CMM",
      1818455411: "LITTLE_CMS_CMM",
      1986623087: "VIVO_CMM",
      2053320752: "ZORAN_CMM",
    });

    ProfileHeader.DataColourSpaces = Object.freeze({
      TWO_COLOUR: 843271250,
      THREE_COLOUR: 860048466,
      FOUR_COLOUR: 876825682,
      FIVE_COLOUR: 893602898,
      SIX_COLOUR: 910380114,
      SEVEN_COLOUR: 927157330,
      EIGHT_COLOUR: 943934546,
      NINE_COLOUR: 960711762,
      TEN_COLOUR: 1094929490,
      ELEVEN_COLOUR: 1111706706,
      TWELVE_COLOUR: 1128483922,
      CMY: 1129142560,
      CMYK: 1129142603,
      THIRTEEN_COLOUR: 1145261138,
      FOURTEEN_COLOUR: 1162038354,
      FIFTEEN_COLOUR: 1178815570,
      GRAY: 1196573017,
      HLS: 1212961568,
      HSV: 1213421088,
      CIELAB_OR_PCSLAB: 1281450528,
      CIELUV: 1282766368,
      RGB: 1380401696,
      NCIEXYZ_OR_PCSXYZ: 1482250784,
      YCBCR: 1497588338,
      CIEYXY: 1501067552,

      843271250: "TWO_COLOUR",
      860048466: "THREE_COLOUR",
      876825682: "FOUR_COLOUR",
      893602898: "FIVE_COLOUR",
      910380114: "SIX_COLOUR",
      927157330: "SEVEN_COLOUR",
      943934546: "EIGHT_COLOUR",
      960711762: "NINE_COLOUR",
      1094929490: "TEN_COLOUR",
      1111706706: "ELEVEN_COLOUR",
      1128483922: "TWELVE_COLOUR",
      1129142560: "CMY",
      1129142603: "CMYK",
      1145261138: "THIRTEEN_COLOUR",
      1162038354: "FOURTEEN_COLOUR",
      1178815570: "FIFTEEN_COLOUR",
      1196573017: "GRAY",
      1212961568: "HLS",
      1213421088: "HSV",
      1281450528: "CIELAB_OR_PCSLAB",
      1282766368: "CIELUV",
      1380401696: "RGB",
      1482250784: "NCIEXYZ_OR_PCSXYZ",
      1497588338: "YCBCR",
      1501067552: "CIEYXY",
    });

    ProfileHeader.PrimaryPlatforms = Object.freeze({
      APPLE_COMPUTER_INC: 1095782476,
      MICROSOFT_CORPORATION: 1297303124,
      SILICON_GRAPHICS_INC: 1397180704,
      SUN_MICROSYSTEMS: 1398099543,

      1095782476: "APPLE_COMPUTER_INC",
      1297303124: "MICROSOFT_CORPORATION",
      1397180704: "SILICON_GRAPHICS_INC",
      1398099543: "SUN_MICROSYSTEMS",
    });

    ProfileHeader.ProfileClasses = Object.freeze({
      ABSTRACT_PROFILE: 1633842036,
      DEVICE_LINK_PROFILE: 1818848875,
      DISPLAY_DEVICE_PROFILE: 1835955314,
      NAMED_COLOR_PROFILE: 1852662636,
      OUTPUT_DEVICE_PROFILE: 1886549106,
      INPUT_DEVICE_PROFILE: 1935896178,
      COLOR_SPACE_PROFILE: 1936744803,

      1633842036: "ABSTRACT_PROFILE",
      1818848875: "DEVICE_LINK_PROFILE",
      1835955314: "DISPLAY_DEVICE_PROFILE",
      1852662636: "NAMED_COLOR_PROFILE",
      1886549106: "OUTPUT_DEVICE_PROFILE",
      1935896178: "INPUT_DEVICE_PROFILE",
      1936744803: "COLOR_SPACE_PROFILE",
    });

    ProfileHeader.RenderingIntents = Object.freeze({
      PERCEPTUAL: 0,
      MEDIA_RELATIVE_COLORIMETRIC: 1,
      SATURATION: 2,
      ICC_ABSOLUTE_COLORIMETRIC: 3,

      0: "PERCEPTUAL",
      1: "MEDIA_RELATIVE_COLORIMETRIC",
      2: "SATURATION",
      3: "ICC_ABSOLUTE_COLORIMETRIC",
    });

    function ProfileHeader(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    ProfileHeader.prototype._read = function() {
      this.size = this._io.readU4be();
      this.preferredCmmType = this._io.readU4be();
      this.version = new VersionField(this._io, this, this._root);
      this.deviceClass = this._io.readU4be();
      this.colorSpace = this._io.readU4be();
      this.pcs = KaitaiStream.bytesToStr(this._io.readBytes(4), "ASCII");
      this.creationDateTime = new DateTimeNumber(this._io, this, this._root);
      this.fileSignature = this._io.readBytes(4);
      if (!((KaitaiStream.byteArrayCompare(this.fileSignature, new Uint8Array([97, 99, 115, 112])) == 0))) {
        throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([97, 99, 115, 112]), this.fileSignature, this._io, "/types/profile_header/seq/7");
      }
      this.primaryPlatform = this._io.readU4be();
      this.profileFlags = new ProfileFlags(this._io, this, this._root);
      this.deviceManufacturer = new DeviceManufacturer(this._io, this, this._root);
      this.deviceModel = KaitaiStream.bytesToStr(this._io.readBytes(4), "ASCII");
      this.deviceAttributes = new DeviceAttributes(this._io, this, this._root);
      this.renderingIntent = this._io.readU4be();
      this.nciexyzValuesOfIlluminantOfPcs = new XyzNumber(this._io, this, this._root);
      this.creator = new DeviceManufacturer(this._io, this, this._root);
      this.identifier = this._io.readBytes(16);
      this.reservedData = this._io.readBytes(28);
    }

    var ProfileFlags = ProfileHeader.ProfileFlags = (function() {
      function ProfileFlags(_io, _parent, _root) {
        this._io = _io;
        this._parent = _parent;
        this._root = _root;

        this._read();
      }
      ProfileFlags.prototype._read = function() {
        this.embeddedProfile = this._io.readBitsIntBe(1) != 0;
        this.profileCanBeUsedIndependentlyOfEmbeddedColourData = this._io.readBitsIntBe(1) != 0;
        this.otherFlags = this._io.readBitsIntBe(30);
      }

      return ProfileFlags;
    })();

    var VersionField = ProfileHeader.VersionField = (function() {
      function VersionField(_io, _parent, _root) {
        this._io = _io;
        this._parent = _parent;
        this._root = _root;

        this._read();
      }
      VersionField.prototype._read = function() {
        this.major = this._io.readBytes(1);
        if (!((KaitaiStream.byteArrayCompare(this.major, new Uint8Array([4])) == 0))) {
          throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([4]), this.major, this._io, "/types/profile_header/types/version_field/seq/0");
        }
        this.minor = this._io.readBitsIntBe(4);
        this.bugFixLevel = this._io.readBitsIntBe(4);
        this._io.alignToByte();
        this.reserved = this._io.readBytes(2);
        if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0])) == 0))) {
          throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0]), this.reserved, this._io, "/types/profile_header/types/version_field/seq/3");
        }
      }

      return VersionField;
    })();

    return ProfileHeader;
  })();

  var Response16Number = Icc4.Response16Number = (function() {
    function Response16Number(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    Response16Number.prototype._read = function() {
      this.number = this._io.readU4be();
      this.reserved = this._io.readBytes(2);
      if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0])) == 0))) {
        throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0]), this.reserved, this._io, "/types/response_16_number/seq/1");
      }
      this.measurementValue = new S15Fixed16Number(this._io, this, this._root);
    }

    return Response16Number;
  })();

  var S15Fixed16Number = Icc4.S15Fixed16Number = (function() {
    function S15Fixed16Number(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    S15Fixed16Number.prototype._read = function() {
      this.number = this._io.readBytes(4);
    }

    return S15Fixed16Number;
  })();

  var StandardIlluminantEncoding = Icc4.StandardIlluminantEncoding = (function() {
    StandardIlluminantEncoding.StandardIlluminantEncodings = Object.freeze({
      UNKNOWN: 0,
      D50: 1,
      D65: 2,
      D93: 3,
      F2: 4,
      D55: 5,
      A: 6,
      EQUI_POWER: 7,
      F8: 8,

      0: "UNKNOWN",
      1: "D50",
      2: "D65",
      3: "D93",
      4: "F2",
      5: "D55",
      6: "A",
      7: "EQUI_POWER",
      8: "F8",
    });

    function StandardIlluminantEncoding(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    StandardIlluminantEncoding.prototype._read = function() {
      this.standardIlluminantEncoding = this._io.readU4be();
    }

    return StandardIlluminantEncoding;
  })();

  var TagTable = Icc4.TagTable = (function() {
    function TagTable(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    TagTable.prototype._read = function() {
      this.tagCount = this._io.readU4be();
      this.tags = [];
      for (var i = 0; i < this.tagCount; i++) {
        this.tags.push(new TagDefinition(this._io, this, this._root));
      }
    }

    var TagDefinition = TagTable.TagDefinition = (function() {
      TagDefinition.MultiProcessElementsTypes = Object.freeze({
        BACS_ELEMENT_TYPE: 1648444243,
        CLUT_ELEMENT_TYPE: 1668052340,
        ONE_DIMENSIONAL_CURVES_TYPE: 1668641382,
        EACS_ELEMENT_TYPE: 1698775891,
        MATRIX_ELEMENT_TYPE: 1835103334,
        CURVE_SET_ELEMENT_TABLE_TYPE: 1835428980,
        FORMULA_CURVE_SEGMENTS_TYPE: 1885434470,
        SAMPLED_CURVE_SEGMENT_TYPE: 1935764838,

        1648444243: "BACS_ELEMENT_TYPE",
        1668052340: "CLUT_ELEMENT_TYPE",
        1668641382: "ONE_DIMENSIONAL_CURVES_TYPE",
        1698775891: "EACS_ELEMENT_TYPE",
        1835103334: "MATRIX_ELEMENT_TYPE",
        1835428980: "CURVE_SET_ELEMENT_TABLE_TYPE",
        1885434470: "FORMULA_CURVE_SEGMENTS_TYPE",
        1935764838: "SAMPLED_CURVE_SEGMENT_TYPE",
      });

      TagDefinition.TagSignatures = Object.freeze({
        A_TO_B_0: 1093812784,
        A_TO_B_1: 1093812785,
        A_TO_B_2: 1093812786,
        B_TO_A_0: 1110589744,
        B_TO_A_1: 1110589745,
        B_TO_A_2: 1110589746,
        B_TO_D_0: 1110590512,
        B_TO_D_1: 1110590513,
        B_TO_D_2: 1110590514,
        B_TO_D_3: 1110590515,
        D_TO_B_0: 1144144432,
        D_TO_B_1: 1144144433,
        D_TO_B_2: 1144144434,
        D_TO_B_3: 1144144435,
        BLUE_TRC: 1649693251,
        BLUE_MATRIX_COLUMN: 1649957210,
        CALIBRATION_DATE_TIME: 1667329140,
        CHROMATIC_ADAPTATION: 1667785060,
        CHROMATICITY: 1667789421,
        COLORIMETRIC_INTENT_IMAGE_STATE: 1667852659,
        COLORANT_TABLE_OUT: 1668050804,
        COLORANT_ORDER: 1668051567,
        COLORANT_TABLE: 1668051572,
        COPYRIGHT: 1668313716,
        PROFILE_DESCRIPTION: 1684370275,
        DEVICE_MODEL_DESC: 1684890724,
        DEVICE_MFG_DESC: 1684893284,
        GREEN_TRC: 1733579331,
        GREEN_MATRIX_COLUMN: 1733843290,
        GAMUT: 1734438260,
        GRAY_TRC: 1800688195,
        LUMINANCE: 1819635049,
        MEASUREMENT: 1835360627,
        NAMED_COLOR_2: 1852009522,
        PREVIEW_0: 1886545200,
        PREVIEW_1: 1886545201,
        PREVIEW_2: 1886545202,
        PROFILE_SEQUENCE: 1886610801,
        PROFILE_SEQUENCE_IDENTIFIER: 1886611812,
        RED_TRC: 1918128707,
        RED_MATRIX_COLUMN: 1918392666,
        OUTPUT_RESPONSE: 1919251312,
        PERCEPTUAL_RENDERING_INTENT_GAMUT: 1919510320,
        SATURATION_RENDERING_INTENT_GAMUT: 1919510322,
        CHAR_TARGET: 1952543335,
        TECHNOLOGY: 1952801640,
        VIEWING_CONDITIONS: 1986618743,
        VIEWING_COND_DESC: 1987405156,
        MEDIA_WHITE_POINT: 2004119668,

        1093812784: "A_TO_B_0",
        1093812785: "A_TO_B_1",
        1093812786: "A_TO_B_2",
        1110589744: "B_TO_A_0",
        1110589745: "B_TO_A_1",
        1110589746: "B_TO_A_2",
        1110590512: "B_TO_D_0",
        1110590513: "B_TO_D_1",
        1110590514: "B_TO_D_2",
        1110590515: "B_TO_D_3",
        1144144432: "D_TO_B_0",
        1144144433: "D_TO_B_1",
        1144144434: "D_TO_B_2",
        1144144435: "D_TO_B_3",
        1649693251: "BLUE_TRC",
        1649957210: "BLUE_MATRIX_COLUMN",
        1667329140: "CALIBRATION_DATE_TIME",
        1667785060: "CHROMATIC_ADAPTATION",
        1667789421: "CHROMATICITY",
        1667852659: "COLORIMETRIC_INTENT_IMAGE_STATE",
        1668050804: "COLORANT_TABLE_OUT",
        1668051567: "COLORANT_ORDER",
        1668051572: "COLORANT_TABLE",
        1668313716: "COPYRIGHT",
        1684370275: "PROFILE_DESCRIPTION",
        1684890724: "DEVICE_MODEL_DESC",
        1684893284: "DEVICE_MFG_DESC",
        1733579331: "GREEN_TRC",
        1733843290: "GREEN_MATRIX_COLUMN",
        1734438260: "GAMUT",
        1800688195: "GRAY_TRC",
        1819635049: "LUMINANCE",
        1835360627: "MEASUREMENT",
        1852009522: "NAMED_COLOR_2",
        1886545200: "PREVIEW_0",
        1886545201: "PREVIEW_1",
        1886545202: "PREVIEW_2",
        1886610801: "PROFILE_SEQUENCE",
        1886611812: "PROFILE_SEQUENCE_IDENTIFIER",
        1918128707: "RED_TRC",
        1918392666: "RED_MATRIX_COLUMN",
        1919251312: "OUTPUT_RESPONSE",
        1919510320: "PERCEPTUAL_RENDERING_INTENT_GAMUT",
        1919510322: "SATURATION_RENDERING_INTENT_GAMUT",
        1952543335: "CHAR_TARGET",
        1952801640: "TECHNOLOGY",
        1986618743: "VIEWING_CONDITIONS",
        1987405156: "VIEWING_COND_DESC",
        2004119668: "MEDIA_WHITE_POINT",
      });

      TagDefinition.TagTypeSignatures = Object.freeze({
        XYZ_TYPE: 1482250784,
        CHROMATICITY_TYPE: 1667789421,
        COLORANT_ORDER_TYPE: 1668051567,
        COLORANT_TABLE_TYPE: 1668051572,
        CURVE_TYPE: 1668641398,
        DATA_TYPE: 1684108385,
        DATE_TIME_TYPE: 1685350765,
        MULTI_FUNCTION_A_TO_B_TABLE_TYPE: 1832993312,
        MULTI_FUNCTION_B_TO_A_TABLE_TYPE: 1833058592,
        MEASUREMENT_TYPE: 1835360627,
        MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE: 1835430961,
        MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE: 1835430962,
        MULTI_LOCALIZED_UNICODE_TYPE: 1835824483,
        MULTI_PROCESS_ELEMENTS_TYPE: 1836082548,
        NAMED_COLOR_2_TYPE: 1852009522,
        PARAMETRIC_CURVE_TYPE: 1885434465,
        PROFILE_SEQUENCE_DESC_TYPE: 1886610801,
        PROFILE_SEQUENCE_IDENTIFIER_TYPE: 1886611812,
        RESPONSE_CURVE_SET_16_TYPE: 1919120178,
        S_15_FIXED_16_ARRAY_TYPE: 1936077618,
        SIGNATURE_TYPE: 1936287520,
        TEXT_TYPE: 1952807028,
        U_16_FIXED_16_ARRAY_TYPE: 1969632050,
        U_INT_8_ARRAY_TYPE: 1969827896,
        U_INT_16_ARRAY_TYPE: 1969828150,
        U_INT_32_ARRAY_TYPE: 1969828658,
        U_INT_64_ARRAY_TYPE: 1969829428,
        VIEWING_CONDITIONS_TYPE: 1986618743,

        1482250784: "XYZ_TYPE",
        1667789421: "CHROMATICITY_TYPE",
        1668051567: "COLORANT_ORDER_TYPE",
        1668051572: "COLORANT_TABLE_TYPE",
        1668641398: "CURVE_TYPE",
        1684108385: "DATA_TYPE",
        1685350765: "DATE_TIME_TYPE",
        1832993312: "MULTI_FUNCTION_A_TO_B_TABLE_TYPE",
        1833058592: "MULTI_FUNCTION_B_TO_A_TABLE_TYPE",
        1835360627: "MEASUREMENT_TYPE",
        1835430961: "MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE",
        1835430962: "MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE",
        1835824483: "MULTI_LOCALIZED_UNICODE_TYPE",
        1836082548: "MULTI_PROCESS_ELEMENTS_TYPE",
        1852009522: "NAMED_COLOR_2_TYPE",
        1885434465: "PARAMETRIC_CURVE_TYPE",
        1886610801: "PROFILE_SEQUENCE_DESC_TYPE",
        1886611812: "PROFILE_SEQUENCE_IDENTIFIER_TYPE",
        1919120178: "RESPONSE_CURVE_SET_16_TYPE",
        1936077618: "S_15_FIXED_16_ARRAY_TYPE",
        1936287520: "SIGNATURE_TYPE",
        1952807028: "TEXT_TYPE",
        1969632050: "U_16_FIXED_16_ARRAY_TYPE",
        1969827896: "U_INT_8_ARRAY_TYPE",
        1969828150: "U_INT_16_ARRAY_TYPE",
        1969828658: "U_INT_32_ARRAY_TYPE",
        1969829428: "U_INT_64_ARRAY_TYPE",
        1986618743: "VIEWING_CONDITIONS_TYPE",
      });

      function TagDefinition(_io, _parent, _root) {
        this._io = _io;
        this._parent = _parent;
        this._root = _root;

        this._read();
      }
      TagDefinition.prototype._read = function() {
        this.tagSignature = this._io.readU4be();
        this.offsetToDataElement = this._io.readU4be();
        this.sizeOfDataElement = this._io.readU4be();
      }

      var AToB0Tag = TagDefinition.AToB0Tag = (function() {
        function AToB0Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        AToB0Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
            this.tagData = new LutAToBType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return AToB0Tag;
      })();

      var AToB1Tag = TagDefinition.AToB1Tag = (function() {
        function AToB1Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        AToB1Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
            this.tagData = new LutAToBType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return AToB1Tag;
      })();

      var AToB2Tag = TagDefinition.AToB2Tag = (function() {
        function AToB2Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        AToB2Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
            this.tagData = new LutAToBType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return AToB2Tag;
      })();

      var BToA0Tag = TagDefinition.BToA0Tag = (function() {
        function BToA0Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BToA0Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
            this.tagData = new LutBToAType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return BToA0Tag;
      })();

      var BToA1Tag = TagDefinition.BToA1Tag = (function() {
        function BToA1Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BToA1Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
            this.tagData = new LutBToAType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return BToA1Tag;
      })();

      var BToA2Tag = TagDefinition.BToA2Tag = (function() {
        function BToA2Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BToA2Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
            this.tagData = new LutBToAType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return BToA2Tag;
      })();

      var BToD0Tag = TagDefinition.BToD0Tag = (function() {
        function BToD0Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BToD0Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return BToD0Tag;
      })();

      var BToD1Tag = TagDefinition.BToD1Tag = (function() {
        function BToD1Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BToD1Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return BToD1Tag;
      })();

      var BToD2Tag = TagDefinition.BToD2Tag = (function() {
        function BToD2Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BToD2Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return BToD2Tag;
      })();

      var BToD3Tag = TagDefinition.BToD3Tag = (function() {
        function BToD3Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BToD3Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return BToD3Tag;
      })();

      var BlueMatrixColumnTag = TagDefinition.BlueMatrixColumnTag = (function() {
        function BlueMatrixColumnTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BlueMatrixColumnTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.XYZ_TYPE:
            this.tagData = new XyzType(this._io, this, this._root);
            break;
          }
        }

        return BlueMatrixColumnTag;
      })();

      var BlueTrcTag = TagDefinition.BlueTrcTag = (function() {
        function BlueTrcTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        BlueTrcTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.CURVE_TYPE:
            this.tagData = new CurveType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.PARAMETRIC_CURVE_TYPE:
            this.tagData = new ParametricCurveType(this._io, this, this._root);
            break;
          }
        }

        return BlueTrcTag;
      })();

      var CalibrationDateTimeTag = TagDefinition.CalibrationDateTimeTag = (function() {
        function CalibrationDateTimeTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        CalibrationDateTimeTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.DATE_TIME_TYPE:
            this.tagData = new DateTimeType(this._io, this, this._root);
            break;
          }
        }

        return CalibrationDateTimeTag;
      })();

      var CharTargetTag = TagDefinition.CharTargetTag = (function() {
        function CharTargetTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        CharTargetTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.TEXT_TYPE:
            this.tagData = new TextType(this._io, this, this._root);
            break;
          }
        }

        return CharTargetTag;
      })();

      var ChromaticAdaptationTag = TagDefinition.ChromaticAdaptationTag = (function() {
        function ChromaticAdaptationTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ChromaticAdaptationTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.S_15_FIXED_16_ARRAY_TYPE:
            this.tagData = new S15Fixed16ArrayType(this._io, this, this._root);
            break;
          }
        }

        return ChromaticAdaptationTag;
      })();

      var ChromaticityTag = TagDefinition.ChromaticityTag = (function() {
        function ChromaticityTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ChromaticityTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.CHROMATICITY_TYPE:
            this.tagData = new ChromaticityType(this._io, this, this._root);
            break;
          }
        }

        return ChromaticityTag;
      })();

      var ChromaticityType = TagDefinition.ChromaticityType = (function() {
        ChromaticityType.ColorantAndPhosphorEncodings = Object.freeze({
          UNKNOWN: 0,
          ITU_R_BT_709_2: 1,
          SMPTE_RP145: 2,
          EBU_TECH_3213_E: 3,
          P22: 4,

          0: "UNKNOWN",
          1: "ITU_R_BT_709_2",
          2: "SMPTE_RP145",
          3: "EBU_TECH_3213_E",
          4: "P22",
        });

        function ChromaticityType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ChromaticityType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/chromaticity_type/seq/0");
          }
          this.numberOfDeviceChannels = this._io.readU2be();
          this.colorantAndPhosphorEncoding = this._io.readU2be();
          this.ciexyCoordinatesPerChannel = [];
          for (var i = 0; i < this.numberOfDeviceChannels; i++) {
            this.ciexyCoordinatesPerChannel.push(new CiexyCoordinateValues(this._io, this, this._root));
          }
        }

        var CiexyCoordinateValues = ChromaticityType.CiexyCoordinateValues = (function() {
          function CiexyCoordinateValues(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          CiexyCoordinateValues.prototype._read = function() {
            this.xCoordinate = this._io.readU2be();
            this.yCoordinate = this._io.readU2be();
          }

          return CiexyCoordinateValues;
        })();

        return ChromaticityType;
      })();

      var ColorantOrderTag = TagDefinition.ColorantOrderTag = (function() {
        function ColorantOrderTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ColorantOrderTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.COLORANT_ORDER_TYPE:
            this.tagData = new ColorantOrderType(this._io, this, this._root);
            break;
          }
        }

        return ColorantOrderTag;
      })();

      var ColorantOrderType = TagDefinition.ColorantOrderType = (function() {
        function ColorantOrderType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ColorantOrderType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/colorant_order_type/seq/0");
          }
          this.countOfColorants = this._io.readU4be();
          this.numbersOfColorantsInOrderOfPrinting = [];
          for (var i = 0; i < this.countOfColorants; i++) {
            this.numbersOfColorantsInOrderOfPrinting.push(this._io.readU1());
          }
        }

        return ColorantOrderType;
      })();

      var ColorantTableOutTag = TagDefinition.ColorantTableOutTag = (function() {
        function ColorantTableOutTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ColorantTableOutTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.COLORANT_TABLE_TYPE:
            this.tagData = new ColorantTableType(this._io, this, this._root);
            break;
          }
        }

        return ColorantTableOutTag;
      })();

      var ColorantTableTag = TagDefinition.ColorantTableTag = (function() {
        function ColorantTableTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ColorantTableTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.COLORANT_TABLE_TYPE:
            this.tagData = new ColorantTableType(this._io, this, this._root);
            break;
          }
        }

        return ColorantTableTag;
      })();

      var ColorantTableType = TagDefinition.ColorantTableType = (function() {
        function ColorantTableType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ColorantTableType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/colorant_table_type/seq/0");
          }
          this.countOfColorants = this._io.readU4be();
          this.colorants = [];
          for (var i = 0; i < this.countOfColorants; i++) {
            this.colorants.push(new Colorant(this._io, this, this._root));
          }
        }

        var Colorant = ColorantTableType.Colorant = (function() {
          function Colorant(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          Colorant.prototype._read = function() {
            this.name = KaitaiStream.bytesToStr(this._io.readBytesTerm(0, false, true, true), "ASCII");
            this.padding = [];
            for (var i = 0; i < 32 - this.name.length; i++) {
              this.padding.push(this._io.readBytes(1));
              if (!((KaitaiStream.byteArrayCompare(this.padding[i], new Uint8Array([0])) == 0))) {
                throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0]), this.padding[i], this._io, "/types/tag_table/types/tag_definition/types/colorant_table_type/types/colorant/seq/1");
              }
            }
            this.pcsValues = this._io.readBytes(6);
          }

          return Colorant;
        })();

        return ColorantTableType;
      })();

      var ColorimetricIntentImageStateTag = TagDefinition.ColorimetricIntentImageStateTag = (function() {
        function ColorimetricIntentImageStateTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ColorimetricIntentImageStateTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.SIGNATURE_TYPE:
            this.tagData = new SignatureType(this._io, this, this._root);
            break;
          }
        }

        return ColorimetricIntentImageStateTag;
      })();

      var CopyrightTag = TagDefinition.CopyrightTag = (function() {
        function CopyrightTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        CopyrightTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_LOCALIZED_UNICODE_TYPE:
            this.tagData = new MultiLocalizedUnicodeType(this._io, this, this._root);
            break;
          }
        }

        return CopyrightTag;
      })();

      var CurveType = TagDefinition.CurveType = (function() {
        function CurveType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        CurveType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/curve_type/seq/0");
          }
          this.numberOfEntries = this._io.readU4be();
          if (this.numberOfEntries > 1) {
            this.curveValues = [];
            for (var i = 0; i < this.numberOfEntries; i++) {
              this.curveValues.push(this._io.readU2be());
            }
          }
          if (this.numberOfEntries == 1) {
            this.curveValue = this._io.readU1();
          }
        }

        return CurveType;
      })();

      var DToB0Tag = TagDefinition.DToB0Tag = (function() {
        function DToB0Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DToB0Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return DToB0Tag;
      })();

      var DToB1Tag = TagDefinition.DToB1Tag = (function() {
        function DToB1Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DToB1Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return DToB1Tag;
      })();

      var DToB2Tag = TagDefinition.DToB2Tag = (function() {
        function DToB2Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DToB2Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return DToB2Tag;
      })();

      var DToB3Tag = TagDefinition.DToB3Tag = (function() {
        function DToB3Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DToB3Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_PROCESS_ELEMENTS_TYPE:
            this.tagData = new MultiProcessElementsType(this._io, this, this._root);
            break;
          }
        }

        return DToB3Tag;
      })();

      var DataType = TagDefinition.DataType = (function() {
        DataType.DataTypes = Object.freeze({
          ASCII_DATA: 0,
          BINARY_DATA: 1,

          0: "ASCII_DATA",
          1: "BINARY_DATA",
        });

        function DataType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DataType.prototype._read = function() {
          this.dataFlag = this._io.readU4be();
        }

        return DataType;
      })();

      var DateTimeType = TagDefinition.DateTimeType = (function() {
        function DateTimeType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DateTimeType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/date_time_type/seq/0");
          }
          this.dateAndTime = new DateTimeNumber(this._io, this, this._root);
        }

        return DateTimeType;
      })();

      var DeviceMfgDescTag = TagDefinition.DeviceMfgDescTag = (function() {
        function DeviceMfgDescTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DeviceMfgDescTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_LOCALIZED_UNICODE_TYPE:
            this.tagData = new MultiLocalizedUnicodeType(this._io, this, this._root);
            break;
          }
        }

        return DeviceMfgDescTag;
      })();

      var DeviceModelDescTag = TagDefinition.DeviceModelDescTag = (function() {
        function DeviceModelDescTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        DeviceModelDescTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_LOCALIZED_UNICODE_TYPE:
            this.tagData = new MultiLocalizedUnicodeType(this._io, this, this._root);
            break;
          }
        }

        return DeviceModelDescTag;
      })();

      var GamutTag = TagDefinition.GamutTag = (function() {
        function GamutTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        GamutTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
            this.tagData = new LutBToAType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return GamutTag;
      })();

      var GrayTrcTag = TagDefinition.GrayTrcTag = (function() {
        function GrayTrcTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        GrayTrcTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.CURVE_TYPE:
            this.tagData = new CurveType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.PARAMETRIC_CURVE_TYPE:
            this.tagData = new ParametricCurveType(this._io, this, this._root);
            break;
          }
        }

        return GrayTrcTag;
      })();

      var GreenMatrixColumnTag = TagDefinition.GreenMatrixColumnTag = (function() {
        function GreenMatrixColumnTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        GreenMatrixColumnTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.XYZ_TYPE:
            this.tagData = new XyzType(this._io, this, this._root);
            break;
          }
        }

        return GreenMatrixColumnTag;
      })();

      var GreenTrcTag = TagDefinition.GreenTrcTag = (function() {
        function GreenTrcTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        GreenTrcTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.CURVE_TYPE:
            this.tagData = new CurveType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.PARAMETRIC_CURVE_TYPE:
            this.tagData = new ParametricCurveType(this._io, this, this._root);
            break;
          }
        }

        return GreenTrcTag;
      })();

      var LuminanceTag = TagDefinition.LuminanceTag = (function() {
        function LuminanceTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        LuminanceTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.XYZ_TYPE:
            this.tagData = new XyzType(this._io, this, this._root);
            break;
          }
        }

        return LuminanceTag;
      })();

      var Lut16Type = TagDefinition.Lut16Type = (function() {
        function Lut16Type(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        Lut16Type.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/lut_16_type/seq/0");
          }
          this.numberOfInputChannels = this._io.readU1();
          this.numberOfOutputChannels = this._io.readU1();
          this.numberOfClutGridPoints = this._io.readU1();
          this.padding = this._io.readBytes(1);
          if (!((KaitaiStream.byteArrayCompare(this.padding, new Uint8Array([0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0]), this.padding, this._io, "/types/tag_table/types/tag_definition/types/lut_16_type/seq/4");
          }
          this.encodedEParameters = [];
          for (var i = 0; i < 9; i++) {
            this.encodedEParameters.push(this._io.readS4be());
          }
          this.numberOfInputTableEntries = this._io.readU2be();
          this.numberOfOutputTableEntries = this._io.readU2be();
          this.inputTables = this._io.readBytes((2 * this.numberOfInputChannels) * this.numberOfInputTableEntries);
          this.clutValues = this._io.readBytes((2 * (this.numberOfClutGridPoints ^ this.numberOfInputChannels)) * this.numberOfOutputChannels);
          this.outputTables = this._io.readBytes((2 * this.numberOfOutputChannels) * this.numberOfOutputTableEntries);
        }

        return Lut16Type;
      })();

      var Lut8Type = TagDefinition.Lut8Type = (function() {
        function Lut8Type(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        Lut8Type.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/lut_8_type/seq/0");
          }
          this.numberOfInputChannels = this._io.readU1();
          this.numberOfOutputChannels = this._io.readU1();
          this.numberOfClutGridPoints = this._io.readU1();
          this.padding = this._io.readBytes(1);
          if (!((KaitaiStream.byteArrayCompare(this.padding, new Uint8Array([0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0]), this.padding, this._io, "/types/tag_table/types/tag_definition/types/lut_8_type/seq/4");
          }
          this.encodedEParameters = [];
          for (var i = 0; i < 9; i++) {
            this.encodedEParameters.push(this._io.readS4be());
          }
          this.numberOfInputTableEntries = this._io.readU4be();
          this.numberOfOutputTableEntries = this._io.readU4be();
          this.inputTables = this._io.readBytes(256 * this.numberOfInputChannels);
          this.clutValues = this._io.readBytes((this.numberOfClutGridPoints ^ this.numberOfInputChannels) * this.numberOfOutputChannels);
          this.outputTables = this._io.readBytes(256 * this.numberOfOutputChannels);
        }

        return Lut8Type;
      })();

      var LutAToBType = TagDefinition.LutAToBType = (function() {
        function LutAToBType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        LutAToBType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/lut_a_to_b_type/seq/0");
          }
          this.numberOfInputChannels = this._io.readU1();
          this.numberOfOutputChannels = this._io.readU1();
          this.padding = this._io.readBytes(2);
          if (!((KaitaiStream.byteArrayCompare(this.padding, new Uint8Array([0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0]), this.padding, this._io, "/types/tag_table/types/tag_definition/types/lut_a_to_b_type/seq/3");
          }
          this.offsetToFirstBCurve = this._io.readU4be();
          this.offsetToMatrix = this._io.readU4be();
          this.offsetToFirstMCurve = this._io.readU4be();
          this.offsetToClut = this._io.readU4be();
          this.offsetToFirstACurve = this._io.readU4be();
          this.data = this._io.readBytesFull();
        }

        return LutAToBType;
      })();

      var LutBToAType = TagDefinition.LutBToAType = (function() {
        function LutBToAType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        LutBToAType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/lut_b_to_a_type/seq/0");
          }
          this.numberOfInputChannels = this._io.readU1();
          this.numberOfOutputChannels = this._io.readU1();
          this.padding = this._io.readBytes(2);
          if (!((KaitaiStream.byteArrayCompare(this.padding, new Uint8Array([0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0]), this.padding, this._io, "/types/tag_table/types/tag_definition/types/lut_b_to_a_type/seq/3");
          }
          this.offsetToFirstBCurve = this._io.readU4be();
          this.offsetToMatrix = this._io.readU4be();
          this.offsetToFirstMCurve = this._io.readU4be();
          this.offsetToClut = this._io.readU4be();
          this.offsetToFirstACurve = this._io.readU4be();
          this.data = this._io.readBytesFull();
        }

        return LutBToAType;
      })();

      var MeasurementTag = TagDefinition.MeasurementTag = (function() {
        function MeasurementTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        MeasurementTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MEASUREMENT_TYPE:
            this.tagData = new MeasurementType(this._io, this, this._root);
            break;
          }
        }

        return MeasurementTag;
      })();

      var MeasurementType = TagDefinition.MeasurementType = (function() {
        MeasurementType.MeasurementFlareEncodings = Object.freeze({
          ZERO_PERCENT: 0,
          ONE_HUNDRED_PERCENT: 65536,

          0: "ZERO_PERCENT",
          65536: "ONE_HUNDRED_PERCENT",
        });

        MeasurementType.MeasurementGeometryEncodings = Object.freeze({
          UNKNOWN: 0,
          ZERO_DEGREES_TO_45_DEGREES_OR_45_DEGREES_TO_ZERO_DEGREES: 1,
          ZERO_DEGREES_TO_D_DEGREES_OR_D_DEGREES_TO_ZERO_DEGREES: 2,

          0: "UNKNOWN",
          1: "ZERO_DEGREES_TO_45_DEGREES_OR_45_DEGREES_TO_ZERO_DEGREES",
          2: "ZERO_DEGREES_TO_D_DEGREES_OR_D_DEGREES_TO_ZERO_DEGREES",
        });

        MeasurementType.StandardObserverEncodings = Object.freeze({
          UNKNOWN: 0,
          CIE_1931_STANDARD_COLORIMETRIC_OBSERVER: 1,
          CIE_1964_STANDARD_COLORIMETRIC_OBSERVER: 2,

          0: "UNKNOWN",
          1: "CIE_1931_STANDARD_COLORIMETRIC_OBSERVER",
          2: "CIE_1964_STANDARD_COLORIMETRIC_OBSERVER",
        });

        function MeasurementType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        MeasurementType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/measurement_type/seq/0");
          }
          this.standardObserverEncoding = this._io.readU4be();
          this.nciexyzTristimulusValuesForMeasurementBacking = new XyzNumber(this._io, this, this._root);
          this.measurementGeometryEncoding = this._io.readU4be();
          this.measurementFlareEncoding = this._io.readU4be();
          this.standardIlluminantEncoding = new StandardIlluminantEncoding(this._io, this, this._root);
        }

        return MeasurementType;
      })();

      var MediaWhitePointTag = TagDefinition.MediaWhitePointTag = (function() {
        function MediaWhitePointTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        MediaWhitePointTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.XYZ_TYPE:
            this.tagData = new XyzType(this._io, this, this._root);
            break;
          }
        }

        return MediaWhitePointTag;
      })();

      var MultiLocalizedUnicodeType = TagDefinition.MultiLocalizedUnicodeType = (function() {
        function MultiLocalizedUnicodeType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        MultiLocalizedUnicodeType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/multi_localized_unicode_type/seq/0");
          }
          this.numberOfRecords = this._io.readU4be();
          this.recordSize = this._io.readU4be();
          this.records = [];
          for (var i = 0; i < this.numberOfRecords; i++) {
            this.records.push(new Record(this._io, this, this._root));
          }
        }

        var Record = MultiLocalizedUnicodeType.Record = (function() {
          function Record(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          Record.prototype._read = function() {
            this.languageCode = this._io.readU2be();
            this.countryCode = this._io.readU2be();
            this.stringLength = this._io.readU4be();
            this.stringOffset = this._io.readU4be();
          }
          Object.defineProperty(Record.prototype, 'stringData', {
            get: function() {
              if (this._m_stringData !== undefined)
                return this._m_stringData;
              var _pos = this._io.pos;
              this._io.seek(this.stringOffset);
              this._m_stringData = KaitaiStream.bytesToStr(this._io.readBytes(this.stringLength), "UTF-16BE");
              this._io.seek(_pos);
              return this._m_stringData;
            }
          });

          return Record;
        })();

        return MultiLocalizedUnicodeType;
      })();

      var MultiProcessElementsType = TagDefinition.MultiProcessElementsType = (function() {
        function MultiProcessElementsType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        MultiProcessElementsType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/multi_process_elements_type/seq/0");
          }
          this.numberOfInputChannels = this._io.readU2be();
          this.numberOfOutputChannels = this._io.readU2be();
          this.numberOfProcessingElements = this._io.readU4be();
          this.processElementPositionsTable = [];
          for (var i = 0; i < this.numberOfProcessingElements; i++) {
            this.processElementPositionsTable.push(new PositionNumber(this._io, this, this._root));
          }
          this.data = this._io.readBytesFull();
        }

        return MultiProcessElementsType;
      })();

      var NamedColor2Tag = TagDefinition.NamedColor2Tag = (function() {
        function NamedColor2Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        NamedColor2Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.NAMED_COLOR_2_TYPE:
            this.tagData = new NamedColor2Type(this._io, this, this._root);
            break;
          }
        }

        return NamedColor2Tag;
      })();

      var NamedColor2Type = TagDefinition.NamedColor2Type = (function() {
        function NamedColor2Type(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        NamedColor2Type.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/named_color_2_type/seq/0");
          }
          this.vendorSpecificFlag = this._io.readU4be();
          this.countOfNamedColours = this._io.readU4be();
          this.numberOfDeviceCoordinatesForEachNamedColour = this._io.readU4be();
          this.prefixForEachColourName = KaitaiStream.bytesToStr(this._io.readBytesTerm(0, false, true, true), "ASCII");
          this.prefixForEachColourNamePadding = [];
          for (var i = 0; i < 32 - this.prefixForEachColourName.length; i++) {
            this.prefixForEachColourNamePadding.push(this._io.readBytes(1));
            if (!((KaitaiStream.byteArrayCompare(this.prefixForEachColourNamePadding[i], new Uint8Array([0])) == 0))) {
              throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0]), this.prefixForEachColourNamePadding[i], this._io, "/types/tag_table/types/tag_definition/types/named_color_2_type/seq/5");
            }
          }
          this.suffixForEachColourName = KaitaiStream.bytesToStr(this._io.readBytesTerm(0, false, true, true), "ASCII");
          this.suffixForEachColourNamePadding = [];
          for (var i = 0; i < 32 - this.suffixForEachColourName.length; i++) {
            this.suffixForEachColourNamePadding.push(this._io.readBytes(1));
            if (!((KaitaiStream.byteArrayCompare(this.suffixForEachColourNamePadding[i], new Uint8Array([0])) == 0))) {
              throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0]), this.suffixForEachColourNamePadding[i], this._io, "/types/tag_table/types/tag_definition/types/named_color_2_type/seq/7");
            }
          }
          this.namedColourDefinitions = [];
          for (var i = 0; i < this.countOfNamedColours; i++) {
            this.namedColourDefinitions.push(new NamedColourDefinition(this._io, this, this._root));
          }
        }

        var NamedColourDefinition = NamedColor2Type.NamedColourDefinition = (function() {
          function NamedColourDefinition(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          NamedColourDefinition.prototype._read = function() {
            this.rootName = KaitaiStream.bytesToStr(this._io.readBytesTerm(0, false, true, true), "ASCII");
            this.rootNamePadding = [];
            for (var i = 0; i < 32 - this.rootName.length; i++) {
              this.rootNamePadding.push(this._io.readBytes(1));
              if (!((KaitaiStream.byteArrayCompare(this.rootNamePadding[i], new Uint8Array([0])) == 0))) {
                throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0]), this.rootNamePadding[i], this._io, "/types/tag_table/types/tag_definition/types/named_color_2_type/types/named_colour_definition/seq/1");
              }
            }
            this.pcsCoordinates = this._io.readBytes(6);
            if (this._parent.numberOfDeviceCoordinatesForEachNamedColour > 0) {
              this.deviceCoordinates = [];
              for (var i = 0; i < this._parent.numberOfDeviceCoordinatesForEachNamedColour; i++) {
                this.deviceCoordinates.push(this._io.readU2be());
              }
            }
          }

          return NamedColourDefinition;
        })();

        return NamedColor2Type;
      })();

      var OutputResponseTag = TagDefinition.OutputResponseTag = (function() {
        function OutputResponseTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        OutputResponseTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.RESPONSE_CURVE_SET_16_TYPE:
            this.tagData = new ResponseCurveSet16Type(this._io, this, this._root);
            break;
          }
        }

        return OutputResponseTag;
      })();

      var ParametricCurveType = TagDefinition.ParametricCurveType = (function() {
        ParametricCurveType.ParametricCurveTypeFunctions = Object.freeze({
          Y_EQUALS_X_TO_POWER_OF_G: 0,
          CIE_122_1996: 1,
          IEC_61966_3: 2,
          IEC_61966_2_1: 3,
          Y_EQUALS_OB_AX_PLUS_B_CB_TO_POWER_OF_G_PLUS_C: 4,

          0: "Y_EQUALS_X_TO_POWER_OF_G",
          1: "CIE_122_1996",
          2: "IEC_61966_3",
          3: "IEC_61966_2_1",
          4: "Y_EQUALS_OB_AX_PLUS_B_CB_TO_POWER_OF_G_PLUS_C",
        });

        function ParametricCurveType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ParametricCurveType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/parametric_curve_type/seq/0");
          }
          this.functionType = this._io.readU2be();
          this.reserved2 = this._io.readBytes(2);
          if (!((KaitaiStream.byteArrayCompare(this.reserved2, new Uint8Array([0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0]), this.reserved2, this._io, "/types/tag_table/types/tag_definition/types/parametric_curve_type/seq/2");
          }
          switch (this.functionType) {
          case Icc4.TagTable.TagDefinition.ParametricCurveType.ParametricCurveTypeFunctions.CIE_122_1996:
            this.parameters = new ParamsCie1221996(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.ParametricCurveType.ParametricCurveTypeFunctions.IEC_61966_2_1:
            this.parameters = new ParamsIec6196621(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.ParametricCurveType.ParametricCurveTypeFunctions.IEC_61966_3:
            this.parameters = new ParamsIec619663(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.ParametricCurveType.ParametricCurveTypeFunctions.Y_EQUALS_OB_AX_PLUS_B_CB_TO_POWER_OF_G_PLUS_C:
            this.parameters = new ParamsYEqualsObAxPlusBCbToPowerOfGPlusC(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.ParametricCurveType.ParametricCurveTypeFunctions.Y_EQUALS_X_TO_POWER_OF_G:
            this.parameters = new ParamsYEqualsXToPowerOfG(this._io, this, this._root);
            break;
          }
        }

        var ParamsCie1221996 = ParametricCurveType.ParamsCie1221996 = (function() {
          function ParamsCie1221996(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          ParamsCie1221996.prototype._read = function() {
            this.g = this._io.readS4be();
            this.a = this._io.readS4be();
            this.b = this._io.readS4be();
          }

          return ParamsCie1221996;
        })();

        var ParamsIec6196621 = ParametricCurveType.ParamsIec6196621 = (function() {
          function ParamsIec6196621(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          ParamsIec6196621.prototype._read = function() {
            this.g = this._io.readS4be();
            this.a = this._io.readS4be();
            this.b = this._io.readS4be();
            this.c = this._io.readS4be();
            this.d = this._io.readS4be();
          }

          return ParamsIec6196621;
        })();

        var ParamsIec619663 = ParametricCurveType.ParamsIec619663 = (function() {
          function ParamsIec619663(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          ParamsIec619663.prototype._read = function() {
            this.g = this._io.readS4be();
            this.a = this._io.readS4be();
            this.b = this._io.readS4be();
            this.c = this._io.readS4be();
          }

          return ParamsIec619663;
        })();

        var ParamsYEqualsObAxPlusBCbToPowerOfGPlusC = ParametricCurveType.ParamsYEqualsObAxPlusBCbToPowerOfGPlusC = (function() {
          function ParamsYEqualsObAxPlusBCbToPowerOfGPlusC(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          ParamsYEqualsObAxPlusBCbToPowerOfGPlusC.prototype._read = function() {
            this.g = this._io.readS4be();
            this.a = this._io.readS4be();
            this.b = this._io.readS4be();
            this.c = this._io.readS4be();
            this.d = this._io.readS4be();
            this.e = this._io.readS4be();
            this.f = this._io.readS4be();
          }

          return ParamsYEqualsObAxPlusBCbToPowerOfGPlusC;
        })();

        var ParamsYEqualsXToPowerOfG = ParametricCurveType.ParamsYEqualsXToPowerOfG = (function() {
          function ParamsYEqualsXToPowerOfG(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          ParamsYEqualsXToPowerOfG.prototype._read = function() {
            this.g = this._io.readS4be();
          }

          return ParamsYEqualsXToPowerOfG;
        })();

        return ParametricCurveType;
      })();

      var PerceptualRenderingIntentGamutTag = TagDefinition.PerceptualRenderingIntentGamutTag = (function() {
        function PerceptualRenderingIntentGamutTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        PerceptualRenderingIntentGamutTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.SIGNATURE_TYPE:
            this.tagData = new SignatureType(this._io, this, this._root);
            break;
          }
        }

        return PerceptualRenderingIntentGamutTag;
      })();

      var Preview0Tag = TagDefinition.Preview0Tag = (function() {
        function Preview0Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        Preview0Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
            this.tagData = new LutAToBType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
            this.tagData = new LutBToAType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return Preview0Tag;
      })();

      var Preview1Tag = TagDefinition.Preview1Tag = (function() {
        function Preview1Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        Preview1Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
            this.tagData = new LutBToAType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return Preview1Tag;
      })();

      var Preview2Tag = TagDefinition.Preview2Tag = (function() {
        function Preview2Tag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        Preview2Tag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
            this.tagData = new LutBToAType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
            this.tagData = new Lut8Type(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
            this.tagData = new Lut16Type(this._io, this, this._root);
            break;
          }
        }

        return Preview2Tag;
      })();

      var ProfileDescriptionTag = TagDefinition.ProfileDescriptionTag = (function() {
        function ProfileDescriptionTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ProfileDescriptionTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_LOCALIZED_UNICODE_TYPE:
            this.tagData = new MultiLocalizedUnicodeType(this._io, this, this._root);
            break;
          }
        }

        return ProfileDescriptionTag;
      })();

      var ProfileSequenceDescType = TagDefinition.ProfileSequenceDescType = (function() {
        function ProfileSequenceDescType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ProfileSequenceDescType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/profile_sequence_desc_type/seq/0");
          }
          this.numberOfDescriptionStructures = this._io.readU4be();
          this.profileDescriptions = [];
          for (var i = 0; i < this.numberOfDescriptionStructures; i++) {
            this.profileDescriptions.push(new ProfileDescription(this._io, this, this._root));
          }
        }

        var ProfileDescription = ProfileSequenceDescType.ProfileDescription = (function() {
          function ProfileDescription(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          ProfileDescription.prototype._read = function() {
            this.deviceManufacturer = new DeviceManufacturer(this._io, this, this._root);
            this.deviceModel = KaitaiStream.bytesToStr(this._io.readBytes(4), "ASCII");
            this.deviceAttributes = new DeviceAttributes(this._io, this, this._root);
            this.deviceTechnology = new TechnologyTag(this._io, this, this._root);
            this.descriptionOfDeviceManufacturer = new DeviceMfgDescTag(this._io, this, this._root);
            this.descriptionOfDeviceModel = new DeviceModelDescTag(this._io, this, this._root);
          }

          return ProfileDescription;
        })();

        return ProfileSequenceDescType;
      })();

      var ProfileSequenceIdentifierTag = TagDefinition.ProfileSequenceIdentifierTag = (function() {
        function ProfileSequenceIdentifierTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ProfileSequenceIdentifierTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.PROFILE_SEQUENCE_IDENTIFIER_TYPE:
            this.tagData = new ProfileSequenceIdentifierType(this._io, this, this._root);
            break;
          }
        }

        return ProfileSequenceIdentifierTag;
      })();

      var ProfileSequenceIdentifierType = TagDefinition.ProfileSequenceIdentifierType = (function() {
        function ProfileSequenceIdentifierType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ProfileSequenceIdentifierType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/profile_sequence_identifier_type/seq/0");
          }
          this.numberOfStructures = this._io.readU4be();
          this.positionsTable = [];
          for (var i = 0; i < this.numberOfStructures; i++) {
            this.positionsTable.push(new PositionNumber(this._io, this, this._root));
          }
          this.profileIdentifiers = [];
          for (var i = 0; i < this.numberOfStructures; i++) {
            this.profileIdentifiers.push(new ProfileIdentifier(this._io, this, this._root));
          }
        }

        var ProfileIdentifier = ProfileSequenceIdentifierType.ProfileIdentifier = (function() {
          function ProfileIdentifier(_io, _parent, _root) {
            this._io = _io;
            this._parent = _parent;
            this._root = _root;

            this._read();
          }
          ProfileIdentifier.prototype._read = function() {
            this.profileId = this._io.readBytes(16);
            this.profileDescription = new MultiLocalizedUnicodeType(this._io, this, this._root);
          }

          return ProfileIdentifier;
        })();

        return ProfileSequenceIdentifierType;
      })();

      var ProfileSequenceTag = TagDefinition.ProfileSequenceTag = (function() {
        function ProfileSequenceTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ProfileSequenceTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.PROFILE_SEQUENCE_DESC_TYPE:
            this.tagData = new ProfileSequenceDescType(this._io, this, this._root);
            break;
          }
        }

        return ProfileSequenceTag;
      })();

      var RedMatrixColumnTag = TagDefinition.RedMatrixColumnTag = (function() {
        function RedMatrixColumnTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        RedMatrixColumnTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.XYZ_TYPE:
            this.tagData = new XyzType(this._io, this, this._root);
            break;
          }
        }

        return RedMatrixColumnTag;
      })();

      var RedTrcTag = TagDefinition.RedTrcTag = (function() {
        function RedTrcTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        RedTrcTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.CURVE_TYPE:
            this.tagData = new CurveType(this._io, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.PARAMETRIC_CURVE_TYPE:
            this.tagData = new ParametricCurveType(this._io, this, this._root);
            break;
          }
        }

        return RedTrcTag;
      })();

      var ResponseCurveSet16Type = TagDefinition.ResponseCurveSet16Type = (function() {
        function ResponseCurveSet16Type(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ResponseCurveSet16Type.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/response_curve_set_16_type/seq/0");
          }
          this.numberOfChannels = this._io.readU2be();
          this.countOfMeasurementTypes = this._io.readU2be();
          this.responseCurveStructureOffsets = [];
          for (var i = 0; i < this.countOfMeasurementTypes; i++) {
            this.responseCurveStructureOffsets.push(this._io.readU4be());
          }
          this.responseCurveStructures = this._io.readBytesFull();
        }

        return ResponseCurveSet16Type;
      })();

      var S15Fixed16ArrayType = TagDefinition.S15Fixed16ArrayType = (function() {
        function S15Fixed16ArrayType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        S15Fixed16ArrayType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/s_15_fixed_16_array_type/seq/0");
          }
          this.values = [];
          var i = 0;
          while (!this._io.isEof()) {
            this.values.push(new S15Fixed16Number(this._io, this, this._root));
            i++;
          }
        }

        return S15Fixed16ArrayType;
      })();

      var SaturationRenderingIntentGamutTag = TagDefinition.SaturationRenderingIntentGamutTag = (function() {
        function SaturationRenderingIntentGamutTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        SaturationRenderingIntentGamutTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.SIGNATURE_TYPE:
            this.tagData = new SignatureType(this._io, this, this._root);
            break;
          }
        }

        return SaturationRenderingIntentGamutTag;
      })();

      var SignatureType = TagDefinition.SignatureType = (function() {
        function SignatureType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        SignatureType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/signature_type/seq/0");
          }
          this.signature = KaitaiStream.bytesToStr(this._io.readBytes(4), "ASCII");
        }

        return SignatureType;
      })();

      var TechnologyTag = TagDefinition.TechnologyTag = (function() {
        function TechnologyTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        TechnologyTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.SIGNATURE_TYPE:
            this.tagData = new SignatureType(this._io, this, this._root);
            break;
          }
        }

        return TechnologyTag;
      })();

      var TextType = TagDefinition.TextType = (function() {
        function TextType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        TextType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/text_type/seq/0");
          }
          this.value = KaitaiStream.bytesToStr(KaitaiStream.bytesTerminate(this._io.readBytesFull(), 0, false), "ASCII");
        }

        return TextType;
      })();

      var U16Fixed16ArrayType = TagDefinition.U16Fixed16ArrayType = (function() {
        function U16Fixed16ArrayType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        U16Fixed16ArrayType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/u_16_fixed_16_array_type/seq/0");
          }
          this.values = [];
          var i = 0;
          while (!this._io.isEof()) {
            this.values.push(new U16Fixed16Number(this._io, this, this._root));
            i++;
          }
        }

        return U16Fixed16ArrayType;
      })();

      var UInt16ArrayType = TagDefinition.UInt16ArrayType = (function() {
        function UInt16ArrayType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        UInt16ArrayType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/u_int_16_array_type/seq/0");
          }
          this.values = [];
          var i = 0;
          while (!this._io.isEof()) {
            this.values.push(this._io.readU2be());
            i++;
          }
        }

        return UInt16ArrayType;
      })();

      var UInt32ArrayType = TagDefinition.UInt32ArrayType = (function() {
        function UInt32ArrayType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        UInt32ArrayType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/u_int_32_array_type/seq/0");
          }
          this.values = [];
          var i = 0;
          while (!this._io.isEof()) {
            this.values.push(this._io.readU4be());
            i++;
          }
        }

        return UInt32ArrayType;
      })();

      var UInt64ArrayType = TagDefinition.UInt64ArrayType = (function() {
        function UInt64ArrayType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        UInt64ArrayType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/u_int_64_array_type/seq/0");
          }
          this.values = [];
          var i = 0;
          while (!this._io.isEof()) {
            this.values.push(this._io.readU8be());
            i++;
          }
        }

        return UInt64ArrayType;
      })();

      var UInt8ArrayType = TagDefinition.UInt8ArrayType = (function() {
        function UInt8ArrayType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        UInt8ArrayType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/u_int_8_array_type/seq/0");
          }
          this.values = [];
          var i = 0;
          while (!this._io.isEof()) {
            this.values.push(this._io.readU1());
            i++;
          }
        }

        return UInt8ArrayType;
      })();

      var ViewingCondDescTag = TagDefinition.ViewingCondDescTag = (function() {
        function ViewingCondDescTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ViewingCondDescTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.MULTI_LOCALIZED_UNICODE_TYPE:
            this.tagData = new MultiLocalizedUnicodeType(this._io, this, this._root);
            break;
          }
        }

        return ViewingCondDescTag;
      })();

      var ViewingConditionsTag = TagDefinition.ViewingConditionsTag = (function() {
        function ViewingConditionsTag(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ViewingConditionsTag.prototype._read = function() {
          this.tagType = this._io.readU4be();
          switch (this.tagType) {
          case Icc4.TagTable.TagDefinition.TagTypeSignatures.VIEWING_CONDITIONS_TYPE:
            this.tagData = new ViewingConditionsType(this._io, this, this._root);
            break;
          }
        }

        return ViewingConditionsTag;
      })();

      var ViewingConditionsType = TagDefinition.ViewingConditionsType = (function() {
        function ViewingConditionsType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        ViewingConditionsType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/viewing_conditions_type/seq/0");
          }
          this.unNormalizedCiexyzValuesForIlluminant = new XyzNumber(this._io, this, this._root);
          this.unNormalizedCiexyzValuesForSurround = new XyzNumber(this._io, this, this._root);
          this.illuminantType = new StandardIlluminantEncoding(this._io, this, this._root);
        }

        return ViewingConditionsType;
      })();

      var XyzType = TagDefinition.XyzType = (function() {
        function XyzType(_io, _parent, _root) {
          this._io = _io;
          this._parent = _parent;
          this._root = _root;

          this._read();
        }
        XyzType.prototype._read = function() {
          this.reserved = this._io.readBytes(4);
          if (!((KaitaiStream.byteArrayCompare(this.reserved, new Uint8Array([0, 0, 0, 0])) == 0))) {
            throw new KaitaiStream.ValidationNotEqualError(new Uint8Array([0, 0, 0, 0]), this.reserved, this._io, "/types/tag_table/types/tag_definition/types/xyz_type/seq/0");
          }
          this.values = [];
          var i = 0;
          while (!this._io.isEof()) {
            this.values.push(new XyzNumber(this._io, this, this._root));
            i++;
          }
        }

        return XyzType;
      })();
      Object.defineProperty(TagDefinition.prototype, 'tagDataElement', {
        get: function() {
          if (this._m_tagDataElement !== undefined)
            return this._m_tagDataElement;
          var _pos = this._io.pos;
          this._io.seek(this.offsetToDataElement);
          switch (this.tagSignature) {
          case Icc4.TagTable.TagDefinition.TagSignatures.A_TO_B_0:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new AToB0Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.A_TO_B_1:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new AToB1Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.A_TO_B_2:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new AToB2Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.B_TO_A_0:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BToA0Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.B_TO_A_1:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BToA1Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.B_TO_A_2:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BToA2Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.B_TO_D_0:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BToD0Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.B_TO_D_1:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BToD1Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.B_TO_D_2:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BToD2Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.B_TO_D_3:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BToD3Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.BLUE_MATRIX_COLUMN:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BlueMatrixColumnTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.BLUE_TRC:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new BlueTrcTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.CALIBRATION_DATE_TIME:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new CalibrationDateTimeTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.CHAR_TARGET:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new CharTargetTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.CHROMATIC_ADAPTATION:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ChromaticAdaptationTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.CHROMATICITY:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ChromaticityTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.COLORANT_ORDER:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ColorantOrderTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.COLORANT_TABLE:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ColorantTableTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.COLORANT_TABLE_OUT:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ColorantTableOutTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.COLORIMETRIC_INTENT_IMAGE_STATE:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ColorimetricIntentImageStateTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.COPYRIGHT:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new CopyrightTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.D_TO_B_0:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new DToB0Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.D_TO_B_1:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new DToB1Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.D_TO_B_2:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new DToB2Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.D_TO_B_3:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new DToB3Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.DEVICE_MFG_DESC:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new DeviceMfgDescTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.DEVICE_MODEL_DESC:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new DeviceModelDescTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.GAMUT:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new GamutTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.GRAY_TRC:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new GrayTrcTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.GREEN_MATRIX_COLUMN:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new GreenMatrixColumnTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.GREEN_TRC:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new GreenTrcTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.LUMINANCE:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new LuminanceTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.MEASUREMENT:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new MeasurementTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.MEDIA_WHITE_POINT:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new MediaWhitePointTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.NAMED_COLOR_2:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new NamedColor2Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.OUTPUT_RESPONSE:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new OutputResponseTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.PERCEPTUAL_RENDERING_INTENT_GAMUT:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new PerceptualRenderingIntentGamutTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.PREVIEW_0:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new Preview0Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.PREVIEW_1:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new Preview1Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.PREVIEW_2:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new Preview2Tag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.PROFILE_DESCRIPTION:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ProfileDescriptionTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.PROFILE_SEQUENCE:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ProfileSequenceTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.PROFILE_SEQUENCE_IDENTIFIER:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ProfileSequenceIdentifierTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.RED_MATRIX_COLUMN:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new RedMatrixColumnTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.RED_TRC:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new RedTrcTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.SATURATION_RENDERING_INTENT_GAMUT:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new SaturationRenderingIntentGamutTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.TECHNOLOGY:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new TechnologyTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.VIEWING_COND_DESC:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ViewingCondDescTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          case Icc4.TagTable.TagDefinition.TagSignatures.VIEWING_CONDITIONS:
            this._raw__m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            var _io__raw__m_tagDataElement = new KaitaiStream(this._raw__m_tagDataElement);
            this._m_tagDataElement = new ViewingConditionsTag(_io__raw__m_tagDataElement, this, this._root);
            break;
          default:
            this._m_tagDataElement = this._io.readBytes(this.sizeOfDataElement);
            break;
          }
          this._io.seek(_pos);
          return this._m_tagDataElement;
        }
      });

      return TagDefinition;
    })();

    return TagTable;
  })();

  var U16Fixed16Number = Icc4.U16Fixed16Number = (function() {
    function U16Fixed16Number(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    U16Fixed16Number.prototype._read = function() {
      this.number = this._io.readBytes(4);
    }

    return U16Fixed16Number;
  })();

  var U1Fixed15Number = Icc4.U1Fixed15Number = (function() {
    function U1Fixed15Number(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    U1Fixed15Number.prototype._read = function() {
      this.number = this._io.readBytes(2);
    }

    return U1Fixed15Number;
  })();

  var U8Fixed8Number = Icc4.U8Fixed8Number = (function() {
    function U8Fixed8Number(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    U8Fixed8Number.prototype._read = function() {
      this.number = this._io.readBytes(2);
    }

    return U8Fixed8Number;
  })();

  var XyzNumber = Icc4.XyzNumber = (function() {
    function XyzNumber(_io, _parent, _root) {
      this._io = _io;
      this._parent = _parent;
      this._root = _root;

      this._read();
    }
    XyzNumber.prototype._read = function() {
      this.x = this._io.readBytes(4);
      this.y = this._io.readBytes(4);
      this.z = this._io.readBytes(4);
    }

    return XyzNumber;
  })();

  return Icc4;
})();
Icc4_.Icc4 = Icc4;
});