
class Universe {
    public String name;
    public int galaxiesCount;
    
    public Universe(String name, int galaxiesCount) {
        super();
        this.name = name;
        this.galaxiesCount = galaxiesCount;
    }
    
    public String toString() {
        return "Universe" + name + " of " + galaxiesCount + " galaxies";
    }
    
    class Galaxy {
        String name;
        private int starsCount;
        
        Galaxy(String name, int starsCount) {
            super();
            this.name = name;
            this.starsCount = starsCount;
        }
        
        public String toString() {
            return "galaxy " + name + " of " + starsCount + " solar systems";
        }
        
        int starsCount() {
            return starsCount;
        }
        
        private String name() {
            return name;
        }
        
        class SolarSystem {
            String name;
            int planetsCount;
            
            SolarSystem(String name, int planetsCount) {
                super();
                this.name = name;
                this.planetsCount = planetsCount;
            }
            
            public String toString() {
                return "Solar System of " + name + " with " + planetsCount + " planets";
            }
            
            int planetsCount() {
                return planetsCount;
            }
            
            SolarSystem copy(SolarSystem s) {
                return s;
            }
            
            class Planet {
                String name;
                int moonsCount;
                
                Planet(String name, int moonsCount, Runnable r) {
                    super();
                    this.name = name;
                    this.moonsCount = moonsCount;
                    r.run();
                }
                
                Planet(String name, int moonsCount) {
                    this(name, moonsCount, java.lang.invoke.LambdaMetafactory.metafactory(name, Universe.Galaxy.this, Universe.Galaxy.SolarSystem.this));
                }
                static final String output = "This planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the galaxy Mily way with 23456789 stars\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system Sun with 9 planets\nThis planet belongs to the solar system SUN with 9 planets\nThis planet belongs to the solar system SUN with 9 planets\n";
                
                public String toString() {
                    return "Planet " + name + " with " + moonsCount + " moon(s)";
                }
                
                /*synthetic*/ private static void lambda$new$0(/*synthetic*/ final String name, /*synthetic*/ final Universe.Galaxy Universe$Galaxy$this, /*synthetic*/ final Universe.Galaxy.SolarSystem Universe$Galaxy$SolarSystem$this) {
                    String n = name;
                    StringBuffer buf = new StringBuffer();
                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name + " with " + Universe$Galaxy$this.starsCount + " stars\n");
                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name + " with " + Universe$Galaxy$this.starsCount() + " stars\n");
                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name() + " with " + Universe$Galaxy$this.starsCount() + " stars\n");
                    buf.append("This planet belongs to the galaxy " + Universe$Galaxy$this.name() + " with " + (Universe$Galaxy$this).starsCount() + " stars\n");
                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount() + " planets\n");
                    buf.append("This planet belongs to the solar system " + (Universe$Galaxy$SolarSystem$this).name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.name.toLowerCase().toUpperCase() + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
                    buf.append("This planet belongs to the solar system " + Universe$Galaxy$SolarSystem$this.copy(Universe$Galaxy$SolarSystem$this).name.toLowerCase().toUpperCase() + " with " + Universe$Galaxy$SolarSystem$this.planetsCount + " planets\n");
                    if (!buf.toString().equals(output)) throw new AssertionError("Unexpected value\n" + buf);
                }
            }
        }
    }
}
