package Ġcom . world pay . access . checkout . validation . validators Ċ Ċ import Ġcom . world pay . access . checkout . api . configuration . Card Validation Rule Ċ import Ġcom . world pay . access . checkout . api . configuration . Remote Card Brand Ċ import Ġcom . world pay . access . checkout . validation . validators . Pan Validator . Pan Validation Result . CARD _ B RAND _ NOT _ ACCEPT ED Ċ import Ġcom . world pay . access . checkout . validation . validators . Pan Validator . Pan Validation Result . INVALID Ċ import Ġcom . world pay . access . checkout . validation . validators . Pan Validator . Pan Validation Result . INVALID _ LU HN Ċ import Ġcom . world pay . access . checkout . validation . validators . Pan Validator . Pan Validation Result . VALID Ċ Ċ internal Ġclass ĠPan Validator ( private Ġval Ġaccepted Card Br ands : ĠArray < String >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsimple Validator Ġ= ĠSimple Validator () ĊĊĠĠĠ Ġfun Ġvalidate ( text : ĠString , Ġcard Validation Rule : ĠCard Validation Rule , Ġcard Brand : ĠRemote Card Brand ?): ĠPan Validation Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Accepted Card Brand Ġ= Ġis Accepted Card Brand ( card Brand ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Accepted Card Brand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC ARD _ B RAND _ NOT _ ACCEPT ED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġun formatted Text Ġ= Ġtext . replace ("\\ s +". to Regex (), Ġ"") ĊĊĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= Ġsimple Validator . validate ( un formatted Text , Ġcard Validation Rule ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINVALID ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Lu hn Valid ( un formatted Text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINVALID _ LU HN ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠVALID ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Accepted Card Brand ( card Brand : ĠRemote Card Brand ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( accepted Card Br ands . isEmpty () Ġ|| Ġcard Brand Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( accepted Card Brand Ġin Ġaccepted Card Br ands ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accepted Card Brand . equals ( card Brand . name , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Lu hn Valid ( pan : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġalternate Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ(( pan . length Ġ- Ġ 1 ) Ġdown To Ġ 0 ). forEach Ġ{ Ġi : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= ĠInteger . parseInt ( pan . substring ( i , Ġi Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alternate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ> Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġn Ġ% Ġ 1 0 Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalternate Ġ= Ġ! alternate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsum Ġ% Ġ 1 0 Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġenum Ġclass ĠPan Validation Result Ġ{ ĊĠĠĠĠĠĠĠ ĠVALID , ĊĠĠĠĠĠĠĠ ĠINVALID , ĊĠĠĠĠĠĠĠ ĠC ARD _ B RAND _ NOT _ ACCEPT ED , ĊĠĠĠĠĠĠĠ ĠINVALID _ LU HN ĊĠĠĠ Ġ} Ċ } Ċ