// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка;
взяти визначення мавка/розбирач;

простір мавка {
  дія надрукувати_інформацію_падіння(
    М: *Машина,
    інформація_падіння: ІнформаціяПадіння
  ) {
    вивести_кольорово(М, КолірВиводуЧервоний, "Помилка");

    якщо інформація_падіння.місцезнаходження.шлях != пусто {
      вивести_кд(М, " в ");

      вивести_шлях(М, інформація_падіння.місцезнаходження.шлях.розмір, інформація_падіння.місцезнаходження.шлях.дані);

      якщо інформація_падіння.місцезнаходження.рядок > 0 {
        вивести_кд(М, ":");
        вивести_п64(М, п64(інформація_падіння.місцезнаходження.рядок));
      }

      вивести_кд(М, "");
    }

    надрукувати_значення(М, інформація_падіння.значення, 2, 0);

    змінна п: природне = 0;

    якщо інформація_падіння.розмір_історії > 0 {
      надрукувати_кд(М, "Історія здійснення:");
    }

    поки п < інформація_падіння.розмір_історії {
      змінна елемент_історії = інформація_падіння.історія[п];

      змінна назва = "(безіменна)";

      якщо елемент_історії.назва != пусто {
        назва = елемент_історії.назва.значення;
      }

      вивести_кд(М, "  ");
      вивести_кольорово(М, КолірВиводуСиній, назва);

      якщо елемент_історії.місцезнаходження.шлях == пусто {
        вивести_кд(М, "");
      } інакше {
        вивести_кд(М, " в ");
        вивести_шлях(М, елемент_історії.місцезнаходження.шлях.розмір, елемент_історії.місцезнаходження.шлях.дані);

        якщо елемент_історії.місцезнаходження.рядок > 0 {
          вивести_кд(М, ":");
          вивести_п64(М, п64(елемент_історії.місцезнаходження.рядок));
        }

        вивести_кд(М, "");
      }

      п += 1;
    }
  }

  внутрішня дія вивести_пропуски(М: *Машина, кількість: природне) {
    змінна п: природне = 0;

    поки п < кількість {
      вивести_кд(М, " ");

      п += 1;
    }
  }

  внутрішня дія вивести_вбудований_предмет(
    М: *Машина,
    виведені_предмети: *Накопичувач<*Предмет>,
    предмет: *Предмет,
    розмір_відступу: природне,
    глибина: природне
  );
  внутрішня дія вивести_предмет(
    М: *Машина,
    виведені_предмети: *Накопичувач<*Предмет>,
    предмет: *Предмет,
    розмір_відступу: природне,
    глибина: природне
  );
  внутрішня дія вивести_значення_1(
    М: *Машина,
    виведені_предмети: *Накопичувач<*Предмет>,
    значення: Значення,
    розмір_відступу: природне,
    глибина: природне
  );

  внутрішня дія зберегти_стан_виведених_предметів(
    виведені_предмети: *Накопичувач<*Предмет>
  ) -> природне {
    вернути виведені_предмети.розмір;
  }

  внутрішня дія відновити_стан_виведених_предметів(
    виведені_предмети: *Накопичувач<*Предмет>,
    стан: природне
  ) {
    виведені_предмети.розмір = стан;
  }

  внутрішня дія покласти_виведений_предмет(
    М: *Машина,
    виведені_предмети: *Накопичувач<*Предмет>,
    предмет: *Предмет
  ) {
    виведені_предмети.покласти(М,
      предмет
    );
  }

  внутрішня дія предмет_вже_виведено(
    виведені_предмети: *Накопичувач<*Предмет>,
    предмет: *Предмет
  ) -> логічне {
    змінна п: природне = 0;

    поки п < виведені_предмети.розмір {
      якщо виведені_предмети.дані[п] == предмет {
        вернути так;
      }

      п += 1;
    }

    вернути ні;
  }

  внутрішня дія вивести_вбудований_предмет(
    М: *Машина,
    виведені_предмети: *Накопичувач<*Предмет>,
    предмет: *Предмет,
    розмір_відступу: природне,
    глибина: природне
  ) {
    якщо предмет.клас == М.клас_Клас {
      змінна властивості = предмет як *ПредметКласу;

      якщо властивості.назва == пусто {
        вивести_кольорово(М, КолірВиводуСиній, "<клас>");
      } інакше {
        вивести_кольорово(М, КолірВиводуСиній, "<клас ");

        вивести_кольорово(М, КолірВиводуСиній, властивості.назва.значення);

        вивести_кольорово(М, КолірВиводуСиній, ">");
      }

      вернути;
    }

    якщо предмет.клас == М.клас_Модуль {
      змінна властивості_модуля = предмет як *ПредметМодуля;

      якщо властивості_модуля.назва == пусто {
        вивести_кольорово(М, КолірВиводуСиній, "<модуль");
      } інакше {
        вивести_кольорово(М, КолірВиводуСиній, "<модуль ");

        вивести_кольорово(М, КолірВиводуСиній, властивості_модуля.назва.значення);
      }

      якщо властивості_модуля.властивості.вмісткість > 0 {
        вивести_кольорово(М, КолірВиводуСиній, "[");
        змінна п: природне = 0;
        змінна виведено_першу = ні;

        поки п < властивості_модуля.властивості.вмісткість {
          змінна призначене = властивості_модуля.властивості.дані[п];

          поки призначене != пусто {
            якщо виведено_першу {
              вивести_кольорово(М, КолірВиводуСиній, ", ");
            }

            виведено_першу = так;

            вивести_кольорово(М, КолірВиводуСиній, призначене.назва.значення);

            призначене = призначене.наступний;
          }

          п += 1;
        }
        вивести_кольорово(М, КолірВиводуСиній, "]");
      }

      вивести_кольорово(М, КолірВиводуСиній, ">");

      вернути;
    }

    якщо предмет.клас == М.клас_Текст {
      змінна властивості = предмет як *ПредметТексту;

      якщо глибина != 0 {
        вивести_кольорово(М, КолірВиводуЗелений, "\"");
      }

      якщо глибина == 0 {
        якщо глибина == 0 {
          вивести_кд(М, властивості.значення);
        } інакше {
          вивести_кольорово(М, КолірВиводуЗелений, властивості.значення);
        }
      } інакше {
        змінна п: природне = 0;
        поки п < властивості.значення.розмір {
          змінна символ = властивості.значення.дані[п];

          якщо символ == КД::символи::Міжряд {
            якщо глибина == 0 {
              вивести_кд(М, "\\р");
            } інакше {
                вивести_кольорово(М, КолірВиводуЗелений, "\\р");
            }
          } інакше якщо символ == КД::символи::Дволапка {
            якщо глибина == 0 {
              вивести_кд(М, "\\\"");
            } інакше {
                вивести_кольорово(М, КолірВиводуЗелений, "\\\"");
            }
          } інакше якщо символ == КД::символи::Обернена_похила {
            якщо глибина == 0 {
              вивести_кд(М, "\\\\");
            } інакше {
                вивести_кольорово(М, КолірВиводуЗелений, "\\\\");
            }
          } інакше якщо символ == КД::символи::Дія {
            якщо глибина == 0 {
              вивести_кд(М, "\\д");
            } інакше {
                вивести_кольорово(М, КолірВиводуЗелений, "\\д");
            }
          } інакше {
            якщо глибина == 0 {
              вивести_кд(М, кд { символ::адреса як *п8, 1 });
            } інакше {
              вивести_кольорово(М, КолірВиводуЗелений, кд { символ::адреса як *п8, 1 });
            }
          }

          п += 1;
        }
      }

      якщо глибина != 0 {
        вивести_кольорово(М, КолірВиводуЗелений, "\"");
      }

      вернути;
    }

    якщо предмет.клас == М.клас_Дія {
      змінна властивості = предмет як *ПредметДії;

      якщо властивості.назва == пусто {
        вивести_кольорово(М, КолірВиводуСиній, "<дія>");
      } інакше {
        вивести_кольорово(М, КолірВиводуСиній, "<дія ");

        вивести_кольорово(М, КолірВиводуСиній, властивості.назва.значення);

        вивести_кольорово(М, КолірВиводуСиній, ">");
      }

      вернути;
    }

    якщо предмет.клас == М.клас_Параметр {
      змінна предмет_параметра = предмет як *ПредметПараметра;
      вивести_кольорово(М, КолірВиводуСиній, "Параметр");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "назва=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_параметра.назва), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "тип=");
      якщо предмет_параметра.тип == пусто {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      } інакше {
        вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_параметра.тип), розмір_відступу, глибина + 1);
      }
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      вивести_значення_1(М, виведені_предмети, предмет_параметра.значення, розмір_відступу, глибина + 1);
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_Ознака {
      змінна предмет_ознаки = предмет як *ПредметОзнаки;
      вивести_кольорово(М, КолірВиводуСиній, "Ознака");
      вивести_кд(М, "(");
      якщо розмір_відступу > 0 {
        вивести_кд(М, "");
      }

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "назва=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_ознаки.назва), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");
      якщо розмір_відступу > 0 {
        вивести_кд(М, "");
      } інакше {
        вивести_кд(М, " ");
      }

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "тип=");
      якщо предмет_ознаки.тип == пусто {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      } інакше {
        вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_ознаки.тип), розмір_відступу, глибина + 1);
      }
      вивести_кд(М, ",");
      якщо розмір_відступу > 0 {
        вивести_кд(М, "");
      } інакше {
        вивести_кд(М, " ");
      }

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      вивести_значення_1(М, виведені_предмети, предмет_ознаки.значення, розмір_відступу, глибина + 1);
      якщо розмір_відступу > 0 {
        вивести_кд(М, "");
      }

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_Код {
      змінна предмет_коду = предмет як *ПредметКоду;
      вивести_кольорово(М, КолірВиводуСиній, "Код");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "константи=");
      якщо предмет_коду.константи == пусто {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      } інакше {
        вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_коду.константи), розмір_відступу, глибина + 1);
      }
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "вказівки=");
      якщо предмет_коду.вказівки == пусто {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      } інакше {
        вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_коду.вказівки), розмір_відступу, глибина + 1);
      }
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "шлях=");
      якщо предмет_коду.шлях == пусто {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      } інакше {
        вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_коду.шлях), розмір_відступу, глибина + 1);
      }
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "місцезнаходження_вказівок=");
      вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_Список {
      змінна властивості_списку = предмет як *ПредметСписку;

      якщо предмет_вже_виведено(виведені_предмети, предмет) {
        вивести_кд(М, "[...]");
        вернути;
      }

      змінна свп = зберегти_стан_виведених_предметів(виведені_предмети);
      покласти_виведений_предмет(М, виведені_предмети, предмет);

      вивести_кд(М, "[");

      якщо властивості_списку.розмір > 0 {
        якщо розмір_відступу > 0 {
          вивести_кд(М, "");
        }

        змінна п: природне = 0;
        поки п < властивості_списку.розмір {
          змінна елемент = властивості_списку.елементи[п];
          вивести_пропуски(М, розмір_відступу * (глибина + 1));
          вивести_значення_1(М, виведені_предмети, елемент, розмір_відступу, глибина + 1);
          вивести_кд(М, ",");
          якщо розмір_відступу > 0 {
            вивести_кд(М, "");
          } інакше {
            вивести_кд(М, " ");
          }

          п += 1;
        }

        вивести_пропуски(М, розмір_відступу * глибина);
      }

      вивести_кд(М, "]");

      відновити_стан_виведених_предметів(виведені_предмети, свп);

      вернути;
    }

    якщо предмет.клас == М.клас_Словник {
      змінна властивості_словника = предмет як *ПредметСловника;

      якщо предмет_вже_виведено(виведені_предмети, предмет) {
        вивести_кд(М, "{...}");
        вернути;
      }

      змінна свп = зберегти_стан_виведених_предметів(виведені_предмети);
      покласти_виведений_предмет(М, виведені_предмети, предмет);

      вивести_кд(М, "{");

      якщо властивості_словника.розмір > 0 {
        якщо розмір_відступу > 0 {
          вивести_кд(М, "");
        }

        змінна п: природне = 0;
        поки п < властивості_словника.розмір {
          змінна пара = властивості_словника.елементи[п];
          вивести_пропуски(М, розмір_відступу * (глибина + 1));
          вивести_значення_1(М, виведені_предмети, пара.ключ, розмір_відступу, глибина + 1);
          вивести_кд(М, " => ");
          вивести_значення_1(М, виведені_предмети, пара.значення, розмір_відступу, глибина + 1);
          вивести_кд(М, ",");
          якщо розмір_відступу > 0 {
            вивести_кд(М, "");
          } інакше {
            вивести_кд(М, " ");
          }

          п += 1;
        }

        вивести_пропуски(М, розмір_відступу * глибина);
      }

      вивести_кд(М, "}");

      відновити_стан_виведених_предметів(виведені_предмети, свп);

      вернути;
    }

    якщо предмет.клас == М.клас_Дані {
      змінна предмет_даних = предмет як *ПредметДаних;
      вивести_кольорово(М, КолірВиводуСиній, "Дані");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "розмір=");
      вивести_значення_1(М, виведені_предмети, ЧИСЛО(р64(предмет_даних.розмір)), розмір_відступу, глибина + 1);
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_ПроміжокЧисел {
      змінна предмет_проміжка_чисел = предмет як *ПредметПроміжкаЧисел;
      вивести_кольорово(М, КолірВиводуСиній, "ПроміжокЧисел");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "від=");
      вивести_значення_1(М, виведені_предмети, ЧИСЛО(р64(предмет_проміжка_чисел.від)), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "до=");
      вивести_значення_1(М, виведені_предмети, ЧИСЛО(р64(предмет_проміжка_чисел.до)), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "включно=");
      якщо предмет_проміжка_чисел.включно {
        вивести_кольорово(М, КолірВиводуЖовтий, "дійсне");
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_ПеребірПроміжкаЧисел {
      змінна предмет_перебору_проміжка_чисел = предмет як *ПредметПереборуПроміжкаЧисел;
      вивести_кольорово(М, КолірВиводуСиній, "ПеребірПроміжкаЧисел");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "проміжок=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_перебору_проміжка_чисел.предмет_проміжка), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      якщо предмет_перебору_проміжка_чисел.почато {
        вивести_значення_1(М, виведені_предмети, ЧИСЛО(предмет_перебору_проміжка_чисел.поточне_значення), розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_ПеребірДаних {
      змінна предмет_перебору_даних = предмет як *ПредметПереборуДаних;
      вивести_кольорово(М, КолірВиводуСиній, "ПеребірДаних");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "дані=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_перебору_даних.предмет_даних), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      якщо предмет_перебору_даних.почато {
        вивести_значення_1(М, виведені_предмети, ЧИСЛО(предмет_перебору_даних.поточне_значення), розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "позиція=");
      якщо предмет_перебору_даних.почато {
        вивести_значення_1(М, виведені_предмети, ЧИСЛО(р64(предмет_перебору_даних.позиція)), розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_ПеребірПослідовності {
      змінна предмет_перебору_послідовності = предмет як *ПредметПереборуПослідовності;
      вивести_кольорово(М, КолірВиводуСиній, "ПеребірПослідовності");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "послідовність=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_перебору_послідовності.предмет_послідовності), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      якщо предмет_перебору_послідовності.почато {
        вивести_значення_1(М, виведені_предмети, предмет_перебору_послідовності.поточне_значення, розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "позиція=");
      якщо предмет_перебору_послідовності.почато {
        вивести_значення_1(М, виведені_предмети, ЧИСЛО(р64(предмет_перебору_послідовності.позиція)), розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_ПеребірСловника {
      змінна предмет_перебору_словника = предмет як *ПредметПереборуСловника;
      вивести_кольорово(М, КолірВиводуСиній, "ПеребірСловника");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "словник=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_перебору_словника.предмет_словника), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      якщо предмет_перебору_словника.почато {
        вивести_значення_1(М, виведені_предмети, предмет_перебору_словника.поточне_значення, розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_ПеребірСписку {
      змінна предмет_перебору_списку = предмет як *ПредметПереборуСписку;
      вивести_кольорово(М, КолірВиводуСиній, "ПеребірСписку");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "список=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_перебору_списку.предмет_списку), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      якщо предмет_перебору_списку.почато {
        вивести_значення_1(М, виведені_предмети, предмет_перебору_списку.поточне_значення, розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "позиція=");
      якщо предмет_перебору_списку.почато {
        вивести_значення_1(М, виведені_предмети, ЧИСЛО(р64(предмет_перебору_списку.позиція)), розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_ПеребірТексту {
      змінна предмет_перебору_тексту = предмет як *ПредметПереборуТексту;
      вивести_кольорово(М, КолірВиводуСиній, "ПеребірТексту");
      вивести_кд(М, "(");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "текст=");
      вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_перебору_тексту.предмет_тексту), розмір_відступу, глибина + 1);
      вивести_кд(М, ",");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "значення=");
      якщо предмет_перебору_тексту.почато {
        вивести_значення_1(М, виведені_предмети, ЧИСЛО(предмет_перебору_тексту.поточне_значення), розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * (глибина + 1));
      вивести_кд(М, "позиція=");
      якщо предмет_перебору_тексту.почато {
        вивести_значення_1(М, виведені_предмети, ЧИСЛО(р64(предмет_перебору_тексту.позиція)), розмір_відступу, глибина + 1);
      } інакше {
        вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");
      }
      вивести_кд(М, "");

      вивести_пропуски(М, розмір_відступу * глибина);
      вивести_кд(М, ")");
      вернути;
    }

    якщо предмет.клас == М.клас_Послідовність {
      змінна предмет_послідовності = предмет як *ПредметПослідовності;

      якщо предмет_вже_виведено(виведені_предмети, предмет) {
        вивести_кд(М, "(...)");
        вернути;
      }

      змінна свп = зберегти_стан_виведених_предметів(виведені_предмети);
      покласти_виведений_предмет(М, виведені_предмети, предмет);

      вивести_кд(М, "(");

      якщо предмет_послідовності.розмір > 0 {
        якщо розмір_відступу > 0 {
          вивести_кд(М, "");
        }

        змінна п: природне = 0;
        поки п < предмет_послідовності.розмір {
          змінна елемент = предмет_послідовності.елементи[п];
          вивести_пропуски(М, розмір_відступу * (глибина + 1));
          вивести_значення_1(М, виведені_предмети, елемент, розмір_відступу, глибина + 1);
          вивести_кд(М, ",");
          якщо п + 1 < предмет_послідовності.розмір {
            якщо розмір_відступу > 0 {
              вивести_кд(М, "");
            } інакше {
              вивести_кд(М, " ");
            }
          }

          п += 1;
        }

        якщо розмір_відступу > 0 {
          вивести_кд(М, "");
        }
        вивести_пропуски(М, розмір_відступу * глибина);
      }

      вивести_кд(М, ")");

      відновити_стан_виведених_предметів(виведені_предмети, свп);

      вернути;
    }

    вивести_кд(М, "<невідомо>");
  }

  структура ДаніДіїПереборуВиводуВластивостейПредмета {
    предмет: *Предмет;
    виведені_предмети: *Накопичувач<*Предмет>;
    виведені_властивості: *Накопичувач<*ПредметТексту>;
    розмір_відступу: природне;
    глибина: природне;
    щось_виведено: *логічне;
  }

  внутрішня дія дія_перебору_виводу_властивостей_предмета(
    М: *Машина,
    призначення: Призначення,
    назва: *ПредметТексту,
    значення: Значення,
    аргумент: адреса
  ) -> логічне {
    змінна дані = аргумент як *ДаніДіїПереборуВиводуВластивостейПредмета;
    змінна предмет = дані.предмет;
    змінна виведені_предмети = дані.виведені_предмети;
    змінна виведені_властивості = дані.виведені_властивості;
    змінна розмір_відступу = дані.розмір_відступу;
    змінна глибина = дані.глибина;

    змінна п: природне = 0;

    поки п < виведені_властивості.розмір {
      якщо порівняти_тексти(М, назва, виведені_властивості.дані[п]) {
        вернути так;
      }

      п += 1;
    }

    якщо не дані.щось_виведено::вміст {
      якщо розмір_відступу > 0 {
        вивести_кд(М, "");
      }
    }

    дані.щось_виведено::вміст = так;

    вивести_пропуски(М, розмір_відступу * (глибина + 1));
    вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(назва), 0, 0);
    вивести_кд(М, "=");
    вивести_значення_1(М, виведені_предмети, значення, розмір_відступу, глибина + 1);
    вивести_кд(М, ",");
    якщо розмір_відступу > 0 {
      вивести_кд(М, "");
    } інакше {
      вивести_кд(М, " ");
    }

    вернути так;
  }


  внутрішня дія вивести_предмет(
    М: *Машина,
    виведені_предмети: *Накопичувач<*Предмет>,
    предмет: *Предмет,
    розмір_відступу: природне,
    глибина: природне
  ) {
    якщо предмет.клас.вбудований {
      вивести_вбудований_предмет(
        М,
        виведені_предмети,
        предмет,
        розмір_відступу,
        глибина
      );
      вернути;
    }

    якщо предмет.клас.назва == пусто {
      вивести_кольорово(М, КолірВиводуСиній, "<без_назви>");
    } інакше {
      вивести_кольорово(М, КолірВиводуСиній, предмет.клас.назва.значення);
    }

    якщо предмет_вже_виведено(виведені_предмети, предмет) {
      вивести_кд(М, "(...)");
      вернути;
    }

    змінна свп = зберегти_стан_виведених_предметів(виведені_предмети);
    покласти_виведений_предмет(М, виведені_предмети, предмет);

    вивести_кд(М, "(");

    змінна щось_виведено = ні;
    змінна виведені_властивості = зробити_накопичувач<*ПредметТексту>(М, предмет.клас.ознаки.розмір);

    якщо предмет.клас.ознаки.розмір > 0 {
      якщо розмір_відступу > 0 {
        вивести_кд(М, "");
      }

      змінна п: природне = 0;
      поки п < предмет.клас.ознаки.розмір {
        змінна ознака = предмет.клас.ознаки.елементи[п];
        змінна предмет_ознаки = ознака.дані як *Предмет як *ПредметОзнаки;

        виведені_властивості.покласти(М, предмет_ознаки.назва);

        змінна значення_властивості = отримати_властивість(М, ПРЕДМЕТ(предмет), предмет_ознаки.назва, Місцезнаходження { пусто, 0});
        вивести_пропуски(М, розмір_відступу * (глибина + 1));
        вивести_значення_1(М, виведені_предмети, ПРЕДМЕТ(предмет_ознаки.назва), 0, 0);
        вивести_кд(М, "=");
        вивести_значення_1(М, виведені_предмети, значення_властивості, розмір_відступу, глибина + 1);
        вивести_кд(М, ",");
        якщо розмір_відступу > 0 {
          вивести_кд(М, "");
        } інакше {
          вивести_кд(М, " ");
        }

        щось_виведено = так;

        п += 1;
      }
    }

    змінна дані_дпввп = ДаніДіїПереборуВиводуВластивостейПредмета {
      предмет,
      виведені_предмети,
      виведені_властивості::адреса,
      розмір_відступу,
      глибина,
      щось_виведено::адреса
    };

    перебрати_призначення(
      М,
      (предмет як *СкладенийПредмет).властивості,
      дія_перебору_виводу_властивостей_предмета,
      дані_дпввп::адреса
    );

    звільнити(М, виведені_властивості.дані);

    якщо щось_виведено {
      вивести_пропуски(М, розмір_відступу * глибина);
    }

    вивести_кд(М, ")");

    відновити_стан_виведених_предметів(виведені_предмети, свп);
  }

  // позначка: прохід по типах предметів
  внутрішня дія вивести_значення_1(
    М: *Машина,
    виведені_предмети: *Накопичувач<*Предмет>,
    значення: Значення,
    розмір_відступу: природне,
    глибина: природне
  ) {
    якщо значення.вид == ЗНедійсне {
      вивести_кольорово(М, КолірВиводуЖовтий, "недійсне");

      вернути;
    }

    якщо значення.вид == ЗДійсне {
      вивести_кольорово(М, КолірВиводуЖовтий, "дійсне");

      вернути;
    }

    якщо значення.вид == ЗЧисло {
      змінна значення_кд: кд;

      якщо перетворити_р64_в_кд(М, значення.дані як р64, значення_кд::адреса) {
        вивести_кольорово(М, КолірВиводуЖовтий, значення_кд);
      }

      звільнити(М, значення_кд.дані);

      вернути;
    }

    вивести_предмет(
      М,
      виведені_предмети,
      значення.дані як *Предмет,
      розмір_відступу,
      глибина
    );
  }

  // позначка: прохід по типах предметів
  дія вивести_значення(
    М: *Машина,
    значення: Значення,
    розмір_відступу: природне,
    глибина: природне
  ) {
    змінна виведені_предмети = зробити_накопичувач<*Предмет>(М, 32);

    вивести_значення_1(
      М,
      виведені_предмети::адреса,
      значення,
      розмір_відступу,
      глибина
    );

    звільнити(М, виведені_предмети.дані);
  }

  дія надрукувати_значення(М: *Машина, значення: Значення, розмір_відступу: природне, глибина: природне) {
    вивести_значення(
      М,
      значення,
      розмір_відступу,
      глибина
    );

    вивести_кд(М, "");
  }
}