import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
 
class Ideone {
	public static void main 
(String[] args
) { 		ArrayList<Mobile> mobiles = new ArrayList<>();
		mobiles.add(
			Mobile.of(
				Plan.of("P1", "Plan 1"),
				Plan.of("P2", "Plan 2")));
		mobiles.add(Mobile.of(
				Plan.of("P1", "Plan 1"),
				Plan.of("P2", "Plan 2"),
				Plan.of("P3", "Plan 3"),
				Plan.of("P4", "Plan 4")));
		mobiles.add(Mobile.of(
				Plan.of("P1", "Plan 1"),
				Plan.of("P2", "Plan 2"),
				Plan.of("P5", "Plan 5"),
				Plan.of("P6", "Plan 6")));
		Set<Plan> commonPlans = extractCommonPlans(mobiles);
		System.
out.
println(commonPlans
); 	}
 
	public static Set<Plan> extractCommonPlans(List<Mobile> mobiles) {
		if (Objects.isNull(mobiles) || mobiles.isEmpty()) {
		}
 
		HashSet<Plan> initialSet = new HashSet<>(mobiles.get(0).getPlans());
		return mobiles.stream()
			.map(Mobile::getPlans)
			.map(HashSet<Plan>::new)
			.reduce(initialSet, (plan1, plan2) -> { 
				plan1.retainAll(plan2);
				return plan1;
			});
	}
}
 
class Mobile {
    private final List<Plan> plans;
 
    private Mobile(List<Plan> plans) {
    	this.plans = plans;
    }
 
    public static Mobile of(Plan... plans) {
    	return new Mobile
(Arrays.
asList(plans
));     }
 
    public List<Plan> getPlans() {
    	return plans;
    }
}
 
class Plan {
 
    	this.id = id;
    	this.name = name;
    }
 
    	return new Plan(id, name);
    }
 
    @Override 
    public boolean equals
(Object thatObject
) {     	if (this == thatObject) {
    		return true;
    	}
    	if (getClass() != thatObject.getClass()) {
    		return false;
    	}
    	Plan that = (Plan) thatObject;
    	return Objects.equals(id, that.id) 
    			&& Objects.equals(name, that.name);
    }
 
    @Override 
    public int hashCode() {
    	return Objects.hash(id, name);
    }
 
    @Override
    	return String.
format("Plan{id=\"%s\", name=\"%s\"}", id, name
);     }
}
				aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwppbXBvcnQgamF2YS51dGlsLlNldDsKCmNsYXNzIElkZW9uZSB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewoJCUFycmF5TGlzdDxNb2JpbGU+IG1vYmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCQltb2JpbGVzLmFkZCgKCQkJTW9iaWxlLm9mKAoJCQkJUGxhbi5vZigiUDEiLCAiUGxhbiAxIiksCgkJCQlQbGFuLm9mKCJQMiIsICJQbGFuIDIiKSkpOwoJCW1vYmlsZXMuYWRkKE1vYmlsZS5vZigKCQkJCVBsYW4ub2YoIlAxIiwgIlBsYW4gMSIpLAoJCQkJUGxhbi5vZigiUDIiLCAiUGxhbiAyIiksCgkJCQlQbGFuLm9mKCJQMyIsICJQbGFuIDMiKSwKCQkJCVBsYW4ub2YoIlA0IiwgIlBsYW4gNCIpKSk7CgkJbW9iaWxlcy5hZGQoTW9iaWxlLm9mKAoJCQkJUGxhbi5vZigiUDEiLCAiUGxhbiAxIiksCgkJCQlQbGFuLm9mKCJQMiIsICJQbGFuIDIiKSwKCQkJCVBsYW4ub2YoIlA1IiwgIlBsYW4gNSIpLAoJCQkJUGxhbi5vZigiUDYiLCAiUGxhbiA2IikpKTsKCQlTZXQ8UGxhbj4gY29tbW9uUGxhbnMgPSBleHRyYWN0Q29tbW9uUGxhbnMobW9iaWxlcyk7CgkJU3lzdGVtLm91dC5wcmludGxuKGNvbW1vblBsYW5zKTsKCX0KCQoJcHVibGljIHN0YXRpYyBTZXQ8UGxhbj4gZXh0cmFjdENvbW1vblBsYW5zKExpc3Q8TW9iaWxlPiBtb2JpbGVzKSB7CgkJaWYgKE9iamVjdHMuaXNOdWxsKG1vYmlsZXMpIHx8IG1vYmlsZXMuaXNFbXB0eSgpKSB7CgkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwoJCX0KCgkJSGFzaFNldDxQbGFuPiBpbml0aWFsU2V0ID0gbmV3IEhhc2hTZXQ8Pihtb2JpbGVzLmdldCgwKS5nZXRQbGFucygpKTsKCQlyZXR1cm4gbW9iaWxlcy5zdHJlYW0oKQoJCQkubWFwKE1vYmlsZTo6Z2V0UGxhbnMpCgkJCS5tYXAoSGFzaFNldDxQbGFuPjo6bmV3KQoJCQkucmVkdWNlKGluaXRpYWxTZXQsIChwbGFuMSwgcGxhbjIpIC0+IHsgCgkJCQlwbGFuMS5yZXRhaW5BbGwocGxhbjIpOwoJCQkJcmV0dXJuIHBsYW4xOwoJCQl9KTsKCX0KfQoKY2xhc3MgTW9iaWxlIHsKICAgIHByaXZhdGUgZmluYWwgTGlzdDxQbGFuPiBwbGFuczsKICAgIAogICAgcHJpdmF0ZSBNb2JpbGUoTGlzdDxQbGFuPiBwbGFucykgewogICAgCXRoaXMucGxhbnMgPSBwbGFuczsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBNb2JpbGUgb2YoUGxhbi4uLiBwbGFucykgewogICAgCXJldHVybiBuZXcgTW9iaWxlKEFycmF5cy5hc0xpc3QocGxhbnMpKTsKICAgIH0KCiAgICBwdWJsaWMgTGlzdDxQbGFuPiBnZXRQbGFucygpIHsKICAgIAlyZXR1cm4gcGxhbnM7CiAgICB9Cn0KCmNsYXNzIFBsYW4gewogICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CiAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogICAgCiAgICBwcml2YXRlIFBsYW4oU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewogICAgCXRoaXMuaWQgPSBpZDsKICAgIAl0aGlzLm5hbWUgPSBuYW1lOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIFBsYW4gb2YoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewogICAgCXJldHVybiBuZXcgUGxhbihpZCwgbmFtZSk7CiAgICB9CiAgICAKICAgIEBPdmVycmlkZSAKICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdE9iamVjdCkgewogICAgCWlmICh0aGlzID09IHRoYXRPYmplY3QpIHsKICAgIAkJcmV0dXJuIHRydWU7CiAgICAJfQogICAgCWlmIChnZXRDbGFzcygpICE9IHRoYXRPYmplY3QuZ2V0Q2xhc3MoKSkgewogICAgCQlyZXR1cm4gZmFsc2U7CiAgICAJfQogICAgCVBsYW4gdGhhdCA9IChQbGFuKSB0aGF0T2JqZWN0OwogICAgCXJldHVybiBPYmplY3RzLmVxdWFscyhpZCwgdGhhdC5pZCkgCiAgICAJCQkmJiBPYmplY3RzLmVxdWFscyhuYW1lLCB0aGF0Lm5hbWUpOwogICAgfQogICAgCiAgICBAT3ZlcnJpZGUgCiAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgCXJldHVybiBPYmplY3RzLmhhc2goaWQsIG5hbWUpOwogICAgfQogICAgCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAJcmV0dXJuIFN0cmluZy5mb3JtYXQoIlBsYW57aWQ9XCIlc1wiLCBuYW1lPVwiJXNcIn0iLCBpZCwgbmFtZSk7CiAgICB9Cn0=