Definition: [
    "autonomous agent",
    {
        "init": "{
        $nom_AA = 'Validacions';
        $darrera_versio = '0000000000';
        //$_Portal_original = '0000000000';
        $_Portal_original = trigger.address; //Hauria de ser fix amb adr darrer Portal 
         $_Portal_actual = var[ 'nou_portal' ] otherwise $_Portal_original;
        if ( $_Portal_actual != trigger.address )
        {
            $_Portal = substring( var[ $_Portal_actual ][ 'versions' ], 0, 32 );
            if( $_Portal != trigger.address ) 
            { bounce ( 'Portal no reconegut' ); }
        } else {
            $_Portal = $_Portal_actual;
        }
       // Principals
        $args = trigger.data;
        $adr__ = trigger.initial_address;
        $_unitat = trigger.output[[ asset != base ]].asset;
        $qt = 10;                                           // Pendent de definició!!!
        $proces = $args.proces;
        $idprop = $args.idprop;
        $generics = var[ $_Portal ][ 'generics' ];
        $entitats = var[ $_Portal ][ 'entitats' ];
        $versions_portal = var[ $_Portal ][ 'versions' ] otherwise $_Portal;
        $versions_validacions = var[ $_Portal ][ 'versions_validacions' ] otherwise this_address;
       // Funcions
        // Si no s'ha lliurat l'argument especificat bota l'accés
        $__arg = $arg =>
            $args[ $arg ] otherwise
            bounce( "Cal proporcionar el valor de: " || $arg );
        $__dada = $refval => {
            data_feed[[ oracles = $versions_validacions, feed_name = $refval, ifnone = false ]]
        };
        $__dada_proposta = $refval => {
            data_feed[[ oracles = $versions_portal, feed_name = $refval, ifnone = false ]]
        };
       // Comprovacions
        // La proposta encara no pot estar validada
        if ( $__dada( 'validacio_' || $idprop ) )
        { bounce( 'Ja validada' ); }
        // La proposta ha d'existir
        if ( ! $__dada_proposta( $idprop ) )
        { bounce( 'No hi ha cap proposta amb aquesta id' ); }
       // Processos
        if ( $proces == 'convocatoria_validadores' ) {
            $convocs = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
            $nombre_isox = $__dada( 'darrer_isox' );
            $ordinal_base = number_from_seed( timestamp, $nombre_isox );
            $__isox_aleatori = $x => {
                $ord_isox_aleatori =
                    $ordinal_base + $x > $nombre_isox ?
                    $ordinal_base + $x - $nombre_isox :
                    $ordinal_base + $x;
                $isox_seleccionat = $__dada( 'isox_' || $ord_isox_aleatori );
                $isox_seleccionat AND $__dada( 'isox_' || $ord_isox_aleatori ) == 'habilitat' ?
                $isox_seleccionat : ''
            };
            $preseleccio_isox = map( $convocs, 8, $__isox_aleatori );
            $seleccio_isox =
                array_length( $preseleccio_isox ) < 10 ?
                $preseleccio_isox :
                $preseleccio_isox || map( $convocs, 10, $__isox_aleatori );
            $__entitat_aleatoria = $x => {
                $ord_entitat_aleatoria =
                    number_from_seed( timestamp, array_length( $entitats ) );
                $entitat_seleccionada = $entitats[ $ord_entitat_aleatoria ];
                $entitats[ $entitat_seleccionada ].estat == 'habilitada' ?
                $entitat_seleccionada : ''
            };
            $preseleccio_entitats = map( $convocs, 10, $__entitat_aleatoria );
            $seleccio_entitats =
                array_length( $preseleccio_entitats ) < 10 ?
                $preseleccio_entitats :
                $preseleccio_entitats || map( $convocs, 10, $__entitat_aleatoria );
            $__delegada_aleatoria = $x => {
                $ord_delegada_aleatoria =
                    number_from_seed( timestamp, $generics.Nombre_Delegades );
                $seleccio_entitats[ $ord_delegada_aleatoria ]
            };
            $seleccio_delegades = map( $seleccio_entitats, 12, $__delegada_aleatoria );
            $nova_convocatoria = {
                isox: $seleccio_isox,
                delegades: $seleccio_delegades,
                temps: timestamp
            };
        }
        if ( $proces == 'decisio_validacio' ) {
            $convocatoria = var[ 'convocatoria_' || $idprop ];
            $validacio = $__dada( 'validacio_' || $idprop );
            $deliberacio = var[ 'deliberacio_' || $idprop ];
            $refus = $__dada( 'refus_' || $idprop );
            // La convocatoria ha d'existir
            if ( ! $convocatoria )
            { bounce( 'No hi ha cap convocatoria amb aquesta id' ); }
            // Tractament proposta encara pendent
            if ( $validacio OR $refus )
            { bounce( 'Aquesta proposta ja ha estat tractada' ); }
            $_isox = $convocatoria.isox[ $adr__ ] ? $adr__ : false;
            $_delegada = $convocatoria.delegades[ $adr__ ] ? $adr__ : false;
            
            // adr__ actuant ha estat convocada
            if ( ! $_isox AND ! $_delegada )
            { bounce( 'Adreça no convocada' ); }
            // adr__ actuant pendent decisió
            if (
                $deliberacio.isox.aprovacions[ $adr__ ] OR
                $deliberacio.delegades.aprovacions[ $adr__ ] )
            { bounce( "Ja hi consta una decisió d'aquesta adreça per a aquesta proposta" ); }
            $grup = $_isox ? 'isox' : $_delegada ? 'delegades' : bounce( 'error' );
            // Deliberació pendent
            if ( $deliberacio[ $grup ].refusada OR $deliberacio[ $grup ].aprovada )
            { bounce( 'Deliberacio de ' || $grup || ' ja enllestida' ); }
            if ( $__arg( 'decisio' ) == 'refusada' ) {
                $deliberacio[ $grup ].refus = $adr__;
                $deliberacio[ $grup ].refusada = timestamp;
                $validacio_refusada = true;
            }
            if ( $__arg( 'decisio' ) == 'aprovada' ) {
                $deliberacio[ $grup ].aprovacions[] = $adr__;
                $resp = 'aprovada per' || $adr__;
                $nombre_aprovacions = $deliberacio[ $grup ].aprovacions;
                if ( array_length( $nombre_aprovacions == $generics.Nombre_Aprovacions ) ) {
                    $deliberacio[ $grup ].aprovada = timestamp;
                }
            }
            if ( $deliberacio.isox.aprovada AND $deliberacio.delegades.aprovada ) {
                $validacio_aprovada = true;
            }
        }
        // Temporalment, per als TESTS!!!...............................
        if ( $proces == 'validacio_directa_TEST' ) {
            $validacio_aprovada = true;
        }
    }",
        "messages": [
            {
                "app": "data",
                "payload": "{ $args }"
            },
            {
                "if": "{ $proces == 'convocatoria_validadores' }",
                "app": "payment",
                "payload": {
                    "asset": "{ $_unitat }",
                    "outputs": [
                        {
                            "if": "{ $seleccio_isox[0] }",
                            "address": "{ $seleccio_isox[0] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[1] }",
                            "address": "{ $seleccio_isox[1] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[2] }",
                            "address": "{ $seleccio_isox[2] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[3] }",
                            "address": "{ $seleccio_isox[3] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[4] }",
                            "address": "{ $seleccio_isox[4] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[5] }",
                            "address": "{ $seleccio_isox[5] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[6] }",
                            "address": "{ $seleccio_isox[6] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[7] }",
                            "address": "{ $seleccio_isox[7] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[8] }",
                            "address": "{ $seleccio_isox[8] }",
                            "amount": "{ $qt }"
                        },
                        {
                            "if": "{ $seleccio_isox[9] }",
                            "address": "{ $seleccio_isox[9] }",
                            "amount": "{ $qt }"
                        }
                    ]
                }
            },
            {
                "if": "{ $validacio_aprovada }",
                "app": "data_feed",
                "payload": {
                    "{ 'validacio_' || $idprop }": "{ timestamp }"
                }
            },
            {
                "if": "{ $validacio_refusada }",
                "app": "data_feed",
                "payload": {
                    "{ 'refus_' || $idprop }": "{ timestamp }"
                }
            },
            {
                "app": "state",
                "state": "{
                response[ 'Procés' ] = $proces;
                response[ 'Proposta' ] = $idprop;
                if ( $nova_convocatoria ) {
                    var[ 'convocatoria_' || $idprop ] = $nova_convocatoria;
                }
                if ( $proces == 'decisio_validacio' ) {
                    response[ 'Validació' ] =
                        $__arg( 'decisio' ) || ' per ' || $adr__;
                    if ( $deliberacio[ $grup ].aprovada ) {
                        response[ 'Validació' ] = ' aprovada per ' || $grup;
                    }
                    if ( $deliberacio.isox.aprovada AND $deliberacio.delegades.aprovada ) {
                        response[ 'Validació' ] = 'aprovada';
                    }
                    var[ 'deliberacio_' || $idprop ] = $deliberacio;
                }
               // -- Nou Portal
                if ( $_Portal != $_Portal_actual ) {
                    var[ 'anterior_portal' ] = var[ 'nou_portal' ];
                    var[ 'nou_portal' ] = $_Portal;
                    response[ 'Nou portal' ] = $_Portal;
                }
           }"
            }
        ]
    }
]