## Код:
```
MODULE KrlDynRestore;
   IMPORT Views, Services, Robust := KrlRobust, Dates;

   TYPE
      Msg* = RECORD (Views.Message)
         tick-: LONGINT;
         consume*: BOOLEAN
      END;

      Action = POINTER TO RECORD (Services.Action) END;

   VAR
      resolution-: INTEGER;
      refreshInterval*, idleInterval*: INTEGER;

      ac: Action;

      lastT, curT: LONGINT;

      in: BOOLEAN;

      roots: ARRAY 128 OF Views.RootFrame;
      rootsN: INTEGER;

   PROCEDURE ActionTry (VAR msg, par2: ANYREC; IN par3: ANYREC);
   BEGIN
      Views.Omnicast(msg)
   END ActionTry;

   PROCEDURE RestoreRoots;
      VAR i: INTEGER;
         f: Views.RootFrame;
   BEGIN
      FOR i := 0 TO rootsN-1 DO
         f := roots[i];
         Views.ValidateRoot(f);
         roots[i] := NIL
      END;
      rootsN := 0
   END RestoreRoots;

   PROCEDURE (a: Action) Do;
      VAR try: Robust.Trial;
         msg: Msg;
   BEGIN
      try.proc := ActionTry;
      msg.tick := Services.Ticks();
      msg.consume := FALSE;
      curT := msg.tick;
      in := TRUE;
      try.Try(msg, Robust.noRec, Robust.noRec);
      in := FALSE;
      lastT := msg.tick;
      RestoreRoots;
      IF msg.consume THEN
         Services.DoLater(a, refreshInterval)
      ELSE
         Services.DoLater(a, idleInterval)
      END
   END Do;

   PROCEDURE Update* (v: Views.View; f: Views.Frame; keepFrames: BOOLEAN; period: INTEGER);
      VAR i: INTEGER;
         root: Views.RootFrame;
   BEGIN
      ASSERT(in, 20);
      Views.Update(v, keepFrames);
      IF (period = 0) OR (lastT < curT DIV period * period) THEN
         IF rootsN = LEN(roots) THEN
            RestoreRoots
         END;
         root := Views.RootOf(f);
         i := 0;
         WHILE (i < rootsN) & (roots[i] # root) DO
            INC(i)
         END;
         roots[i] := root;
         IF i = rootsN THEN
            INC(rootsN)
         END
      END
   END Update;

BEGIN
   resolution := 1000;
   refreshInterval := Services.now;
   idleInterval := 500;
   NEW(ac);
   Services.DoLater(ac,Services.now)
CLOSE
   Services.RemoveAction(ac)
END KrlDynRestore.
```
