import Ġcom . be ust . kl ax on . JsonArray Ċ import Ġcom . be ust . kl ax on . JsonObject Ċ import Ġcom . be ust . kl ax on . Parser Ċ import Ġcom . be ust . kl ax on . json Ċ Ċ open Ġclass ĠLogical Permissions Ġ: ĠLogical Permissions Interface Ġ{ ĊĠĠĠ Ġoverride Ġvar Ġtypes : ĠMap < String , Ġ( String , ĠMap < String , ĠAny >) Ġ-> ĠBoolean > Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor (( name , Ġ_) Ġin Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġname Ġfor Ġa Ġtype Ġcannot Ġbe Ġempty .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this . core Permission Keys . contains ( name . toUpperCase ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġname Ġfor Ġa Ġtype Ġhas Ġthe Ġillegal Ġvalue Ġ\"$ name \" . ĠIt Ġcannot Ġbe Ġone Ġof Ġthe Ġfollowing Ġvalues : Ġ${ this . core Permission Keys }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġbypass Callback : Ġ(( Map < String , ĠAny >) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġopen Ġprotected Ġval Ġcore Permission Keys Ġ= Ġset Of (" NO _ BY PASS ", Ġ" AND ", Ġ" N AND ", Ġ" OR ", Ġ" NOR ", Ġ" XOR ", Ġ" NOT ", Ġ" TRUE ", Ġ" FALSE ") ĊĊĠĠĠ Ġoverride Ġfun Ġadd Type ( name : ĠString , Ġcallback : Ġ( String , ĠMap < String , ĠAny >) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġ\" name \" Ġparameter Ġcannot Ġbe Ġempty .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( this . core Permission Keys . contains ( name . toUpperCase ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġ\" name \" Ġparameter Ġhas Ġthe Ġillegal Ġvalue Ġ\"$ name \" . ĠIt Ġcannot Ġbe Ġone Ġof Ġthe Ġfollowing Ġvalues : Ġ${ this . core Permission Keys }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( this . type Exists ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPermission Type AlreadyExists Exception (" The Ġpermission Ġtype Ġ\"$ name \" Ġalready Ġexists ! ĠIf Ġyou Ġwant Ġto Ġchange Ġthe Ġcallback Ġfor Ġan Ġexisting Ġtype , Ġplease Ġuse ĠLogical Permissions :: setType Callback (). ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġthis . types . to Mutable Map () ĊĠĠĠĠĠĠĠ Ġtypes [ name ] Ġ= Ġcallback ĊĠĠĠĠĠĠĠ Ġthis . types Ġ= Ġtypes . toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Type ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġ\" name \" Ġparameter Ġcannot Ġbe Ġempty .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif (! this . type Exists ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPermission Type Not Registered Exception (" The Ġpermission Ġtype Ġ\"$ name \" Ġhas Ġnot Ġbeen Ġregistered . ĠPlease Ġuse ĠLogical Permissions :: add Type () Ġor Ġset Ġthe Ġvalue Ġfor ĠLogical Permission :: types Ġto Ġregister Ġpermission Ġtypes .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġthis . types . to Mutable Map () ĊĠĠĠĠĠĠĠ Ġtypes . remove ( name ) ĊĠĠĠĠĠĠĠ Ġthis . types Ġ= Ġtypes . toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtype Exists ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġ\" name \" Ġparameter Ġcannot Ġbe Ġempty .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . types . containsKey ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetType Callback ( name : ĠString ): Ġ( String , ĠMap < String , ĠAny >) Ġ-> ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġ\" name \" Ġparameter Ġcannot Ġbe Ġempty .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġthis . types [ name ] ĊĠĠĠĠĠĠĠ Ġif ( callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPermission Type Not Registered Exception (" The Ġpermission Ġtype Ġ\"$ name \" Ġhas Ġnot Ġbeen Ġregistered . ĠPlease Ġuse ĠLogical Permissions :: add Type () Ġor Ġset Ġthe Ġvalue Ġfor ĠLogical Permission :: types Ġto Ġregister Ġpermission Ġtypes .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcallback ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Type Callback ( name : ĠString , Ġcallback : Ġ( String , ĠMap < String , ĠAny >) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The Ġ\" name \" Ġparameter Ġcannot Ġbe Ġempty .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif (! this . type Exists ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPermission Type Not Registered Exception (" The Ġpermission Ġtype Ġ\"$ name \" Ġhas Ġnot Ġbeen Ġregistered . ĠPlease Ġuse ĠLogical Permissions :: add Type () Ġor Ġset Ġthe Ġvalue Ġfor ĠLogical Permission :: types Ġto Ġregister Ġpermission Ġtypes .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġthis . types . to Mutable Map () ĊĠĠĠĠĠĠĠ Ġtypes [ name ] Ġ= Ġcallback ĊĠĠĠĠĠĠĠ Ġthis . types Ġ= Ġtypes . toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Valid Permission Keys (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . core Permission Keys . union ( this . types . keys ) ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġoverride Ġfun Ġcheck Access ( permissions : ĠJsonObject , Ġcontext : ĠMap < String , ĠAny >, Ġallow By pass : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . check Access Parsed ( permissions Ġ= Ġthis . create Permissions Object ( permissions . toJson String ()), Ġcontext Ġ= Ġcontext , Ġallow By pass Ġ= Ġallow By pass ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġcheck Access ( permissions : ĠJson Array < Any ? >, Ġcontext : ĠMap < String , ĠAny >, Ġallow By pass : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . check Access Parsed ( permissions Ġ= Ġthis . create Permissions Object ( permissions . toJson String ()), Ġcontext Ġ= Ġcontext , Ġallow By pass Ġ= Ġallow By pass ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġcheck Access ( permissions : ĠString , Ġcontext : ĠMap < String , ĠAny >, Ġallow By pass : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrimmed Permissions Ġ= Ġpermissions . trim () ĊĠĠĠĠĠĠĠ Ġif ( trimmed Permissions . length Ġ<= Ġ 5 Ġ&& Ġ( trimmed Permissions . toUpperCase () Ġ== Ġ" TRUE " Ġ|| Ġtrimmed Permissions . toUpperCase () Ġ== Ġ" FALSE ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . check Access Parsed ( permissions Ġ= Ġjson Ġ{ obj (" OR " Ġto Ġarray ( trimmed Permissions )) }, Ġcontext Ġ= Ġcontext , Ġallow By pass Ġ= Ġallow By pass ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . check Access Parsed ( permissions Ġ= Ġthis . create Permissions Object ( trimmed Permissions ), Ġcontext Ġ= Ġcontext , Ġallow By pass Ġ= Ġallow By pass ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġcheck Access ( permissions : ĠBoolean , Ġcontext : ĠMap < String , ĠAny >, Ġallow By pass : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . check Access Parsed ( permissions Ġ= Ġjson Ġ{ obj (" OR " Ġto Ġarray ( permissions )) }, Ġcontext Ġ= Ġcontext , Ġallow By pass Ġ= Ġallow By pass ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġcreate Permissions Object ( json Permissions : ĠString ): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild Object ( json Permissions : ĠString ): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder ( json Permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermissions Ġ= Ġparser . parse ( string Builder ) Ġas ĠJsonObject ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpper case Ġno _ bypass Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permissions . containsKey (" no _ bypass ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions [" NO _ BY PASS "] Ġ= Ġpermissions . getValue (" no _ bypass ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . remove (" no _ bypass ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpermissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" Error Ġcreating Ġpermissions Ġobject Ġfrom Ġjson : Ġ${ e . message }. ĠEvalu ated Ġpermissions : Ġ$ json Permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( json Permissions . first (). equals (' [' )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Object ("{ \" OR \": Ġ$ json Permissions }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Object ( json Permissions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġcheck Access Parsed ( permissions : ĠJsonObject , Ġcontext : ĠMap < String , ĠAny > Ġ= Ġmap Of (), Ġallow By pass : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġbypass Ġaccess ĊĠĠĠĠĠĠĠ Ġif Ġ( this . check Allow By pass ( permissions Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġallow By pass Ġ= Ġallow By pass )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . check By pass Access ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMutable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . message Ġ= Ġ" Error Ġchecking Ġbypass Ġaccess : Ġ${ e . message }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠNO _ BY PASS Ġkey Ġis Ġno Ġlonger Ġused Ġnow Ġand Ġneeds Ġto Ġbe Ġremoved ĊĠĠĠĠĠĠĠ Ġpermissions . remove (" NO _ BY PASS ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġregular Ġaccess ĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process OR ( permissions Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMutable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . message Ġ= Ġ" Error Ġchecking Ġaccess : Ġ${ e . message }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġcheck Allow By pass ( permissions : ĠJsonObject , Ġcontext : ĠMap < String , ĠAny >, Ġallow By pass : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcheck No By pass ( no By pass : ĠAny , Ġcontext : ĠMap < String , ĠAny >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( no By pass Ġis ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġno By pass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( no By pass Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( no By pass . toUpperCase () Ġ!= Ġ" TRUE " Ġ&& Ġno By pass . toUpperCase () Ġ!= Ġ" FALSE ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The ĠNO _ BY PASS Ġvalue Ġmust Ġbe Ġa ĠBoolean , Ġa Ġboolean Ġstring Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠCurrent Ġvalue : Ġ$ no By pass ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġno By pass . to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( no By pass Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process OR ( permissions Ġ= Ġno By pass , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( e : ĠMutable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . message Ġ= Ġ" Error Ġchecking ĠNO _ BY PASS Ġpermissions : Ġ${ e . message }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The ĠNO _ BY PASS Ġvalue Ġmust Ġbe Ġa ĠBoolean , Ġa Ġboolean Ġstring Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠCurrent Ġvalue : Ġ$ no By pass ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . containsKey (" NO _ BY PASS ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno By pass Ġ= Ġpermissions [" NO _ BY PASS "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( no By pass Ġ!= Ġnull Ġ&& Ġallow By pass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! check No By pass ( no By pass , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġallow By pass ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġcheck By pass Access ( context : ĠMap < String , ĠAny >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( this . bypass Callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . bypass Callback ?. invoke ( context ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġdispatch ( permissions : ĠAny , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" You Ġcannot Ġput Ġa Ġboolean Ġpermission Ġas Ġa Ġdesc endant Ġto Ġa Ġpermission Ġtype . ĠExisting Ġtype : Ġ$ type . ĠEvalu ated Ġpermissions : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpermissions ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . toUpperCase () Ġ== Ġ" TRUE ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" You Ġcannot Ġput Ġa Ġboolean Ġpermission Ġas Ġa Ġdesc endant Ġto Ġa Ġpermission Ġtype . ĠExisting Ġtype : Ġ$ type . ĠEvalu ated Ġpermissions : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( permissions . toUpperCase () Ġ== Ġ" FALSE ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" You Ġcannot Ġput Ġa Ġboolean Ġpermission Ġas Ġa Ġdesc endant Ġto Ġa Ġpermission Ġtype . ĠExisting Ġtype : Ġ$ type . ĠEvalu ated Ġpermissions : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . external Access Check ( permission Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJson Array <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process OR ( permissions Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process OR ( permissions Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġpermissions . entries . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġitem . key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġitem . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key . toInt OrNull () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( value Ġis ĠJson Array < *> Ġ|| Ġvalue Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process OR ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . dispatch ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Upper Ġ= Ġkey . toUpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" NO _ BY PASS ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" The ĠNO _ BY PASS Ġkey Ġmust Ġbe Ġplaced Ġhighest Ġin Ġthe Ġpermission Ġhierarchy . ĠEvalu ated Ġpermissions : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" AND ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process AND ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" N AND ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process N AND ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" OR ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process OR ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" NOR ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process NOR ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" XOR ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process XOR ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" NOT ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process NOT ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Upper Ġ== Ġ" TRUE " Ġ|| Ġkey Upper Ġ== Ġ" FALSE ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" A ĠBoolean Ġpermission Ġcannot Ġhave Ġchildren . ĠEvalu ated Ġpermissions : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" You Ġcannot Ġput Ġa Ġpermission Ġtype Ġas Ġa Ġdesc endant Ġto Ġanother Ġpermission Ġtype . ĠExisting Ġtype : Ġ$ type . ĠEvalu ated Ġpermissions : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! this . type Exists ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPermission Type Not Registered Exception (" The Ġpermission Ġtype Ġ\"$ key \" Ġhas Ġnot Ġbeen Ġregistered . ĠPlease Ġuse ĠLogical Permissions :: add Type () Ġor Ġset Ġthe Ġvalue Ġfor ĠLogical Permission :: types Ġto Ġregister Ġpermission Ġtypes .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( value Ġis ĠJson Array < *> Ġ|| Ġvalue Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . process OR ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . dispatch ( permissions Ġ= Ġvalue , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid Argument Value Exception (" A Ġpermission Ġvalue Ġmust Ġeither Ġbe Ġa ĠBoolean , Ġa ĠString , Ġa Ġcom . be ust . kl ax on . JsonArray Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠClass Ġis Ġ${ permissions :: class }. ĠEvalu ated Ġpermissions : Ġ$ permissions ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġprocess AND ( permissions : ĠAny , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJson Array <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠAND Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Ġ= Ġaccess Ġ&& Ġthis . dispatch ( permissions Ġ= Ġitem , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! access ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccess ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠAND Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccess = Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Permissions Ġ= Ġjson Ġ{ obj ( item . key Ġto Ġitem . value )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Ġ= Ġaccess Ġ&& Ġthis . dispatch ( permissions Ġ= Ġsub Permissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! access ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccess ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠAND Ġgate Ġmust Ġbe Ġa Ġcom . be ust . kl ax on . JsonArray Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġprocess N AND ( permissions : ĠAny , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJson Array <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠN AND Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif ( permissions Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠN AND Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠN AND Ġgate Ġmust Ġbe Ġa Ġcom . be ust . kl ax on . JsonArray Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! this . process AND ( permissions Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġprocess OR ( permissions : ĠAny , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJson Array <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠOR Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Ġ= Ġaccess Ġ|| Ġthis . dispatch ( permissions Ġ= Ġitem , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( access ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccess ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠOR Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Permissions Ġ= Ġjson Ġ{ obj ( item . key Ġto Ġitem . value )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Ġ= Ġaccess Ġ|| Ġthis . dispatch ( permissions Ġ= Ġsub Permissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( access ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccess ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠOR Ġgate Ġmust Ġbe Ġa Ġcom . be ust . kl ax on . JsonArray Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġprocess NOR ( permissions : ĠAny , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJson Array <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠNOR Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif ( permissions Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠNOR Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġone Ġelement . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠNOR Ġgate Ġmust Ġbe Ġa Ġcom . be ust . kl ax on . JsonArray Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! this . process OR ( permissions Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġprocess XOR ( permissions : ĠAny , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJson Array <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠXOR Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġtwo Ġelements . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount True Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount False Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġthis . dispatch ( permissions Ġ= Ġitem , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount True ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount False ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( count True Ġ> Ġ 0 Ġ&& Ġcount False Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccess ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠXOR Ġgate Ġmust Ġcontain Ġa Ġminimum Ġof Ġtwo Ġelements . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount True Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount False Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( item Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Permissions Ġ= Ġjson Ġ{ obj ( item . key Ġto Ġitem . value )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġthis . dispatch ( permissions Ġ= Ġsub Permissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount True ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount False ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( count True Ġ> Ġ 0 Ġ&& Ġcount False Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaccess ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġan ĠXOR Ġgate Ġmust Ġbe Ġa Ġcom . be ust . kl ax on . JsonArray Ġor Ġa Ġcom . be ust . kl ax on . JsonObject . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġprocess NOT ( permissions : ĠAny , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( permissions Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠNOT Ġgate Ġmust Ġhave Ġexactly Ġone Ġchild Ġin Ġthe Ġvalue Ġobject . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif ( permissions Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" A ĠNOT Ġpermission Ġcannot Ġhave Ġan Ġempty Ġstring Ġas Ġits Ġvalue .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Value For Logic Gate Exception (" The Ġvalue Ġof Ġa ĠNOT Ġgate Ġmust Ġbe Ġa Ġcom . be ust . kl ax on . JsonObject Ġor Ġa ĠString . ĠCurrent Ġvalue : Ġ$ permissions ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! this . dispatch ( permissions Ġ= Ġpermissions , Ġcontext Ġ= Ġcontext , Ġtype Ġ= Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġprotected Ġfun Ġexternal Access Check ( permission : ĠString , Ġcontext : ĠMap < String , ĠAny >, Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! this . type Exists ( type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPermission Type Not Registered Exception (" The Ġpermission Ġtype Ġ\"$ type \" Ġhas Ġnot Ġbeen Ġregistered . ĠPlease Ġuse ĠLogical Permissions :: add Type () Ġor Ġset Ġthe Ġvalue Ġfor ĠLogical Permission :: types Ġto Ġregister Ġpermission Ġtypes .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġthis . getType Callback ( type ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcallback ( permission , Ġcontext ) ĊĠĠĠ Ġ} Ċ }