constructor(target, config = {}, eventFunctions) {
    const targetNode = typeof target === 'string' ? document.querySelector(target) : target;
    let highlightOnly = config.highlightOnly ? true
      : targetNode.getAttribute(ATTRIBUTES.HIGHLIGHT_ONLY) === READ_ONLY_TAG
        ? targetNode.getAttribute(ATTRIBUTES.HIGHLIGHT_ONLY)
        : targetNode.hasAttribute(ATTRIBUTES.HIGHLIGHT_ONLY);
    const noneMarkers = targetNode.hasAttribute(ATTRIBUTES.NONE_MARKERS);
    const indent = targetNode.hasAttribute(ATTRIBUTES.INDENT) ? parseInt(targetNode.getAttribute(ATTRIBUTES.INDENT)) : DEFAULT_INDENT;
    const from = targetNode.hasAttribute(ATTRIBUTES.FROM) ? parseInt(targetNode.getAttribute(ATTRIBUTES.FROM)) : null;
    const to = targetNode.hasAttribute(ATTRIBUTES.TO) ? parseInt(targetNode.getAttribute(ATTRIBUTES.TO)) : null;
    const editorTheme = this.getTheme(targetNode);
    const args = targetNode.hasAttribute(ATTRIBUTES.ARGUMENTS) ? targetNode.getAttribute(ATTRIBUTES.ARGUMENTS) : "";
    const hiddenDependencies = this.getHiddenDependencies(targetNode);
    const outputHeight = targetNode.getAttribute(ATTRIBUTES.OUTPUT_HEIGHT) || null;
    const targetPlatform = getTargetById(targetNode.getAttribute(ATTRIBUTES.PLATFORM)) || TargetPlatforms.JAVA;
    const targetNodeStyle = targetNode.getAttribute(ATTRIBUTES.STYLE);
    const jsLibs = this.getJsLibraries(targetNode, targetPlatform);
    const isFoldedButton = targetNode.getAttribute(ATTRIBUTES.FOLDED_BUTTON) !== "false";
    const lines = targetNode.getAttribute(ATTRIBUTES.LINES) === "true";
    const onFlyHighLight = targetNode.getAttribute(ATTRIBUTES.ON_FLY_HIGHLIGHT) === "true";
    const autoComplete = targetNode.getAttribute(ATTRIBUTES.COMPLETE) === "true";
    const matchBrackets = targetNode.getAttribute(ATTRIBUTES.MATCH_BRACKETS) === "true";
    const autoIndent = targetNode.getAttribute(ATTRIBUTES.AUTO_INDENT) === "true";
    const dataTrackRunId = targetNode.getAttribute(ATTRIBUTES.TRACK_RUN_ID);
    const dataShorterHeight = targetNode.getAttribute(ATTRIBUTES.SHORTER_HEIGHT);
    const dataScrollbarStyle = targetNode.getAttribute(ATTRIBUTES.SCROLLBAR_STYLE);
    const mode = this.getMode(targetNode);
    const code = replaceWhiteSpaces(targetNode.textContent);
    const cfg = merge(defaultConfig, config);

    // no run code in none kotlin mode
    if (mode !== MODES.KOTLIN && highlightOnly !== READ_ONLY_TAG) {
      highlightOnly = true;
    }

    let crosslink = null;

    const crosslinkValue = targetNode.getAttribute(ATTRIBUTES.CROSSLINK);

    const isCrosslinkDisabled = (
      crosslinkValue !== 'enabled' && (
        crosslinkValue === 'disabled' || // disabled by developer
        highlightOnly || // highlighted only not worked in...
        ( // Unsupported external deps
          (jsLibs && !!jsLibs.size) ||
          (hiddenDependencies && hiddenDependencies.length > 0)
        )
      )
    );

    if (!isCrosslinkDisabled) crosslink = generateCrosslink(code, {
      code: code,
      targetPlatform: targetPlatform.id,
      // hiddenDependencies, // multi-file support needs
      compilerVersion: cfg.compilerVersion,
    });

    let shorterHeight = parseInt(dataShorterHeight, 10) || 0;

    targetNode.style.display = 'none';
    targetNode.setAttribute(INITED_ATTRIBUTE_NAME, 'true');
    const mountNode = document.createElement('div');
    insertAfter(mountNode, targetNode);

    const view = ExecutableFragment.render(mountNode, {eventFunctions});
    view.update(Object.assign({
      code: code,
      lines: lines,
      theme: editorTheme,
      indent: indent,
      args: args,
      mode: mode,
      crosslink,
      matchBrackets: matchBrackets,
      from: from,
      to: to,
      autoComplete: autoComplete,
      hiddenDependencies: hiddenDependencies,
      compilerVersion: cfg.compilerVersion,
      noneMarkers: noneMarkers,
      onFlyHighLight: onFlyHighLight,
      autoIndent: autoIndent,
      highlightOnly: highlightOnly,
      targetPlatform: targetPlatform,
      jsLibs: jsLibs,
      isFoldedButton: isFoldedButton,
      dataTrackRunId,
      shorterHeight,
      outputHeight,
      scrollbarStyle: dataScrollbarStyle
    }, eventFunctions));

    this.config = cfg;
    this.node = mountNode;
    this.targetNode = targetNode;
    this.targetNodeStyle = targetNodeStyle;
    this.view = view;

    targetNode.KotlinPlayground = this;
    if (eventFunctions && eventFunctions.callback) eventFunctions.callback(targetNode, mountNode);
  }
@param {string|HTMLElement} target
@param {{compilerVersion: *}} [config]
@param {Object} eventFunctions