/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 ĠV ic ĠL au Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġorg . sw or de ss . common . location Ċ Ċ import Ġjava . util . HashSet Ċ Ċ data Ġclass ĠAddress ( ĊĠĠĠĠĠĠĠ Ġvar Ġcountry : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġstate : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġcity : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġregion : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġblock : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġstreet : ĠString Ġ= Ġ"") Ċ Ċ sealed Ġclass ĠPlace ( open Ġval Ġname : ĠString , Ġopen Ġval Ġcode : ĠString ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġ!= Ġnull Ġ&& Ġjava Class Ġ=== Ġother . java Class Ġ&& Ġcode Ġ== Ġ( other Ġas ĠPlace ). code ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġcode . hashCode () ĊĊĠĠĠ Ġclass ĠCountry ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġcode : ĠString ) Ġ: ĠPlace ( name , Ġcode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġ_ states : ĠMutable Set < State > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġval Ġstates : ĠSet < State > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ states ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠState ( val Ġcountry : ĠCountry , Ġoverride Ġval Ġname : ĠString , Ġoverride Ġval Ġcode : ĠString ) Ġ: ĠPlace ( name , Ġcode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġ_ cities : ĠMutable Set < City > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġval Ġcities : ĠSet < City > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ cities ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCity ( val Ġstate : ĠState , Ġoverride Ġval Ġname : ĠString , Ġoverride Ġval Ġcode : ĠString ) Ġ: ĠPlace ( name , Ġcode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġ_ regions : ĠMutable Set < Region > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġval Ġregions : ĠSet < Region > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ regions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRegion ( val Ġcity : ĠCity , Ġoverride Ġval Ġname : ĠString , Ġoverride Ġval Ġcode : ĠString ) Ġ: ĠPlace ( name , Ġcode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġ_ blocks : ĠMutable Set < Block > Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġval Ġblocks : ĠSet < Block > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ blocks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBlock ( val Ġregion : ĠRegion , Ġoverride Ġval Ġname : ĠString , Ġoverride Ġval Ġcode : ĠString ) Ġ: ĠPlace ( name , Ġcode ) Ċ Ċ } Ċ Ċ fun ĠPlace . Country . to Address () Ġ= ĠAddress ( country Ġ= Ġname ) Ċ Ċ fun ĠPlace . State . to Address () Ġ= Ġcountry . to Address (). apply Ġ{ Ġstate Ġ= Ġname Ġ} Ċ Ċ fun ĠPlace . City . to Address () Ġ= Ġstate . to Address (). apply Ġ{ Ġcity Ġ= Ġname Ġ} Ċ Ċ fun ĠPlace . Region . to Address () Ġ= Ġcity . to Address (). apply Ġ{ Ġregion Ġ= Ġname Ġ} Ċ Ċ fun ĠPlace . Block . to Address () Ġ= Ġregion . to Address (). apply Ġ{ Ġblock Ġ= Ġname Ġ} Ċ