package Ġcom . nk up pan . todo . ui . fragment Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view .* Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . nk up pan . todo . R Ċ import Ġcom . nk up pan . todo . databinding . Fragment Task Edit Binding Ċ import Ġcom . nk up pan . todo . db . Sub Task Ċ import Ġcom . nk up pan . todo . ext ention . Event Observer Ċ import Ġcom . nk up pan . todo . ext ention . auto Cle ared Ċ import Ġcom . nk up pan . todo . ext ention . setup String Snackbar Ċ import Ġcom . nk up pan . todo . shared . utils . Common Utils Ċ import Ġcom . nk up pan . todo . ui . view model . Task Create ViewModel Ċ import Ġcom . nk up pan . todo . utils . App UI Utils Ċ import Ġcom . nk up pan . todo . utils . Navigation Manager . set Failure Result Ċ import Ġcom . nk up pan . todo . utils . Navigation Manager . set Success Result Ċ import Ġcom . nk up pan . todo . utils . RequestParam Ċ Ċ class ĠTask Edit Fragment Ġ: ĠBase Fragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠviewModel : ĠTask Create ViewModel Ġby Ġauto Cle ared () ĊĊĠĠĠ Ġprivate Ġvar Ġdata Binding : ĠFragment Task Edit Binding Ġby Ġauto Cle ared () ĊĊĠĠĠ Ġprivate Ġvar Ġmenu : ĠMenu ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġsub Task View List : ĠMutable List < View > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġvar Ġsub TaskList : ĠMutable List < Sub Task > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġvar Ġis Data Saved Sil ently Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . fragment _ task _ edit , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this ). get ( Task Create ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġdata Binding Ġ= ĠFragment Task Edit Binding . bind ( view ) ĊĠĠĠĠĠĠĠ Ġdata Binding . viewModel Ġ= ĠviewModel ĊĠĠĠĠĠĠĠ Ġdata Binding . lifecycle Owner Ġ= Ġthis . view Lifecycle Owner ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . menu _ task _ edit , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġthis . menu Ġ= Ġmenu ĊĠĠĠĠĠĠĠ Ġenable Re vert Or Done () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ done Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . mark This Task As Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ revert Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . revert This Task () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ delete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . delete This Task () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠAppCompatActivity ). set Support ActionBar ( data Binding . toolbar ) ĊĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġdata Binding . root . setup String Snackbar ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . sn ackBar Message , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ SHORT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġdata Binding . toolbar . set Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Data Saved Sil ently ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Success Result () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Failure Result () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . task GroupName . observe ( view Lifecycle Owner , ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Binding . task Group List . text Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . select DateTime . observe ( view Lifecycle Owner , ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp UI Utils . show DatePicker Dialog ( this , ĠviewModel . task EndDate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update DateTime ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . success . observe ( view Lifecycle Owner , ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Success Result () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . silent Success . observe ( view Lifecycle Owner , ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). set Result ( Activity . RESULT _ OK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Data Saved Sil ently Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . change Task Group . observe ( view Lifecycle Owner , ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Group Selection Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( RequestParam . TASK _ GROUP _ ID , ĠviewModel . getSelected Task GroupId ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Task Group ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ( this @ Task Edit Fragment . child FragmentManager , Ġ" change _ task _ group ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . deleted . observe ( view Lifecycle Owner , ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Success Result () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . update Menu . observe ( view Lifecycle Owner , ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Re vert Or Done () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . load Task Details ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). intent ?. extras ?. getString ( RequestParam . TASK _ ID ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . load Task Group List () ĊĊĠĠĠĠĠĠĠ ĠviewModel . sub TaskList . observe ( view Lifecycle Owner , Ġ{ Ġit Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sub Task Container () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub TaskList . addAll ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . status Ġ!= Ġ 2 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sub Task Container ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdata Binding . task Title . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Text Watcher To Save Autom atically () ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Text Watcher To Save Autom atically () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Watcher Ġ= Ġobject Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( p 0 : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save Task Details ( save Sil ently Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Binding . task Title . add TextChanged Listener ( text Watcher ) ĊĠĠĠĠĠĠĠ Ġdata Binding . task Description . add TextChanged Listener ( text Watcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Sub Task Container ( a Sub Task : ĠSub Task ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsub Task View Ġ= ĠLayoutInflater . from ( require Context ()). inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . sub _ task _ view , Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsub Task Text Ġ= Ġsub Task View . findViewById < TextView >( R . id . sub _ task _ text ) ĊĠĠĠĠĠĠĠ Ġsub Task Text . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Task Ġ= ĠSub Task ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠCommon Utils . getRandom UUID (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent _ task _ id Ġ= ĠviewModel . get TaskId (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated _ on Ġ= ĠCommon Utils . get DateTime (). toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated _ on Ġ= ĠCommon Utils . get DateTime (). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . create Sub Task ( sub Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sub Task Container ( sub Task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġsub Task View . findViewById < LinearLayout >( R . id . sub _ task _ input _ container ) ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġsub Task View . findViewById < EditText >( R . id . sub _ task _ input ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Sub Task View Ġ= Ġsub Task View . findViewById < ImageView >( R . id . clear _ text ) ĊĠĠĠĠĠĠĠ Ġval Ġmark As Completed Ġ= Ġsub Task View . findViewById < RadioButton >( R . id . mark _ complete ) ĊĊĠĠĠĠĠĠĠ Ġinput . setText ( a Sub Task ?. description ) ĊĊĠĠĠĠĠĠĠ Ġinput . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( p 0 : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( a Text : ĠCharSequence ?, Ġp 1 : ĠInt , Ġp 2 : ĠInt , Ġp 3 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Sub Task ( a Sub Task , Ġa Text ?. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( p 0 : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġmark As Completed . setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( checked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Sub Task Status ( a Sub Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Sub Task View ( sub Task View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinput . setOn Focus ChangeListener Ġ{ Ġ_, Ġfocus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Sub Task View . visibility Ġ= Ġif Ġ( focus ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdelete Sub Task View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . delete Sub Task ( a Sub Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Sub Task View ( sub Task View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( a Sub Task Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Task Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Task Text . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Sub Task View . visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Sub Task . description . isNotEmpty ()) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub TaskList . add ( a Sub Task ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . is Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 5 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsub Task View List . add ( 0 , Ġsub Task View ) ĊĠĠĠĠĠĠĠ Ġdata Binding . sub Task Container . addView ( sub Task View , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġdata Binding . task Title . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . is Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Sub Task View ( sub Task View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsub Task View List . remove ( sub Task View ) ĊĠĠĠĠĠĠĠ Ġdata Binding . sub Task Container . remove View ( sub Task View ) ĊĠĠĠĠĠĠĠ Ġdata Binding . sub Task Container . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Re vert Or Done () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Completed Ġ= ĠviewModel . is Completed () ĊĠĠĠĠĠĠĠ Ġmenu ?. find Item ( R . id . action _ revert )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġis Completed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmenu ?. find Item ( R . id . action _ done )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġ! is Completed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }