Sistema Único de Rastreio Financeiro construído em Go, utilizando a ferramenta Ledger, oferece uma abordagem robusta e eficiente para gerenciar registros financeiros. Com a utilização do Ledger, o sistema permite que as transações financeiras sejam registradas de forma precisa, seguindo os princípios de contabilidade de dupla entrada compatível com os softwares GNUPlot e GNUCash.
Ledger é um software de gestão de finanças, para uso pessoal ou de empresas. É um software multiplataforma, podendo ser usado em ambiente Windows, GNU/Linux, BSD/Unix, RaspberryPi e Macintosh. Usa um sistema de contabilidade de entrada dupla e tem uma conta de renda/despesas (diário) onde serão anotadas todas transações financeiras, a exemplo de um livro caixa de um banco.
Usage of ledger: -b string Begin date of transaction processing. (default "1970/01/01") -columns int Set a column width for output. (default 79) -depth int Depth of transaction output (balance). (default -1) -e string End date of transaction processing. (default "2016/10/24") -empty Show empty (zero balance) accounts. -f string Ledger file name (*Required). -payee string Filter output to payees that contain this string. -period string Split output into periods (Monthly,Quarterly,SemiYearly,Yearly). -wide Wide output (same as --columns=132).
Ferramenta que auxilia a conversão de arquivos CSV em um arquivo Ledger. A maioria dos bancos gerará um arquivo de valores separados por vírgula que pode ser facilmente analisado no formato Ledger usando esta ferramenta:
Usage: limport -f <ledger-file> <account> <csv file> -allow-matching Have output include imported transactions that match existing ledger transactions. -date-format string Date format. (default "01/02/2006") -delimiter string Field delimiter. (default ",") -f string Ledger file name (*Required). -neg Negate amount column value. -scale float Scale factor to multiply against every imported amount. (default 1) -set-search string Search string used to find set of accounts for classification.
Depois de um tempo, o diário pode ficar bem grande. Embora isso não diminua a velocidade do Ledger – ele foi projetado para processar diários muito rapidamente – as coisas podem começar a parecer “confusas”; e é uma queixa universal que, quando as finanças parecem confusas, as pessoas as evitam.
Para mitigar o problema, foi criado uma terceira ferramenta que possibilita o arquivamento das transações pretéritas:
Usage of equity: -b string Begin date of transaction processing. (default "1970/01/01") -columns int Set a column width for output. (default 79) -e string End date of transaction processing. (default "2016/10/24") -f string Ledger file name (*Required). -payee string Filter output to payees that contain this string.
Mas o que é equidade? Você pode ter ouvido falar de equidade quando as pessoas falaram sobre hipotecas de casas, como “a parte da casa que você possui”. Basicamente, o patrimônio é como o valor de algo. Se você possui um carro no valor de R$ 25.000,00, então você tem R$ 25.000,00 em patrimônio nesse carro. Para transformar aquele carro (uma commodity) em um fluxo de caixa, ou um crédito em sua conta bancária, você terá que debitar o patrimônio vendendo-o.
Suponha que uma câmara de arbitragem tenha várias sucursais e queira rastrear as finanças de todas as sucursais em um único sistema. Cada sucursal possui seu próprio livro caixa, que registra todas as transações financeiras realizadas pela sucursal. Para facilitar a gestão financeira global da câmara de arbitragem, é necessário calcular o balanço financeiro global das sucursais a partir de seus respectivos livros caixa numa só operação.
Ledger é uma ferramenta capaz de calcular o balanço financeiro global de várias sucursais a partir dos seus respectivos livros caixa. Cada livro caixa é registrado no sistema e todas as transações financeiras realizadas pela sucursal são registradas como movimentos financeiros nas contas correspondentes.
Assim, é possível gerar balanços e balancetes com gráficos que mostram o desempenho financeiro global da câmara de arbitragem e de cada sucursal individualmente em tempo real. Além disso, o Ledger oferece recursos para verificar a integridade dos livros caixa e das transações financeiras, garantindo a segurança dos dados financeiros da câmara de arbitragem.
2022/01/01 Opening balances Liquido:Saldo inicial -4000.00 Ativo:Camara de Arbitragem 4000.00 2022/01/01 Taxa de administracao Ativo:Camara de Arbitragem 1200.00 Renda:Receita -1200.00 2022/02/05 Honorarios do mediador Ativo:Camara de Arbitragem -700.00 Despesa:Honorarios do mediador 700.00 2022/03/15 Taxa de administracao Ativo:Camara de Arbitragem 2000.00 Renda:Receita -2000.00 2022/05/10 Honorarios do advogado Ativo:Camara de Arbitragem -3500.00 Despesa:Honorarios do advogado 3500.00 2022/06/20 Taxa de administracao Ativo:Camara de Arbitragem 1500.00 Renda:Receita -1500.00 2022/07/25 Servico de interprete Ativo:Camara de Arbitragem -900.00 Despesa:Servico de interprete 900.00 2022/08/30 Taxa de administracao Ativo:Camara de Arbitragem 1800.00 Renda:Receita -1800.00 2022/09/15 Despesas de viagem Ativo:Camara de Arbitragem -2200.00 Despesa:Despesas de viagem 2200.00 2022/11/10 Taxa de administracao Ativo:Camara de Arbitragem 2500.00 Renda:Receita -2500.00 2022/12/20 Honorarios do perito Ativo:Camara de Arbitragem -4500.00 Despesa:Honorarios do perito 4500.00
O comando "bal" é uma abreviação de "balance" e é um dos principais comandos do Ledger. O comando bal é usado para gerar um relatório de saldo das contas em um arquivo Ledger (diário). Ao ser executado, o comando bal percorre todas as transações no arquivo e calcula o saldo atual para cada conta. Ele exibe o nome da conta, o saldo atual e uma lista de transações que contribuíram para o saldo. É possível especificar um período de tempo para o relatório de saldo, filtrando apenas as transações dentro desse período.
Ativo 1200.00 Ativo:Camara de Arbitragem 1200.00 Despesa 11800.00 Despesa:Despesas de viagem 2200.00 Despesa:Honorarios do advogado 3500.00 Despesa:Honorarios do mediador 700.00 Despesa:Honorarios do perito 4500.00 Despesa:Servico de interprete 900.00 Liquido -4000.00 Liquido:Saldo inicial -4000.00 Renda -9000.00 Renda:Receita -9000.00 ------------------------------------------------------------------------------- 0.00
O comando "reg" do Ledger é utilizado para exibir os registros de transações do arquivo de contabilidade e é útil para verificar as transações por conta e para identificar discrepâncias nas transações contábeis.
2020/02/05 Honorarios do m Despesa:Honorarios do mediador 700.00 700.00 2022/05/10 Honorarios do a Despesa:Honorarios do advogado 3500.00 4200.00 2022/07/25 Servico de inte Despesa:Servico de interprete 900.00 5100.00 2022/09/15 Despesas de via Despesa:Despesas de viagem 2200.00 7300.00 2022/12/20 Honorarios do p Despesa:Honorarios do perito 4500.00 11800.00
No caso dos passivos, como foi dito, a maioria dos bancos gerará um arquivo de valores separados por vírgula que pode ser facilmente analisado no formato Ledger usando a ferramenta limport:
| Date | Note | Payee | Amount | |------------|---------------------------------|--------------------------|--------| | 2022-01-01 | Forum Criminal Barra Funda | Taxa de Distribuicao | 50.00 | | 2022-03-05 | Cartorio de Registro de Imoveis | Registro de Imovel | 200.00 | | 2022-05-07 | Restaurante Boa Viagem | Almoco de Negocios | 80.00 | | 2022-07-12 | Forum Trabalhista Ruy Barbosa | Taxa de Distribuicao | 40.00 | | 2022-09-15 | Transportadora Expresso SP | Transporte de Documentos | 30.00 | | 2022-11-19 | Cartorio de Registro Civil | Certidao de Nascimento | 20.00 | | 2022-12-03 | Restaurante Familia Mancini | Jantar de Negocios | 120.00 |
A ferramenta limport irá converter o documento em formato Ledger a partir do comando:
./limport -f Main.txt --date-format "2006-01-02" -set-search Despesa Passivo CSV.csv
Gerando a saída:
; Forum Criminal Barra Funda 2022/01/01 Taxa de Distribuicao Passivo:MasterCard -50.00 Despesa:Taxas 50.00 ; Cartorio de Registro de Imoveis da Zona Sul 2022/03/05 Registro de Imovel Passivo:MasterCard -200.00 Despesa:Registros 200.00 ; Restaurante Boa Viagem 2022/05/07 Almoco de Negocios Passivo:MasterCard -80.00 Despesa:Almocos 80.00 ; Forum Trabalhista Ruy Barbosa 2022/07/12 Taxa de Distribuicao Passivo:MasterCard -40.00 Despesa:Taxas 40.00 ; Transportadora Expresso Sao Paulo 2022/09/15 Transporte de Documentos Passivo:MasterCard -30.00 Despesa:Transporte de Documentos 30.00 ; Cartorio de Registro Civil de Sao Paulo 2022/11/19 Certidao de Nascimento Passivo:MasterCard -20.00 Despesa:Certidoes 20.00 ; Restaurante Familia Mancini 2022/12/03 Jantar de Negocios Passivo:MasterCard -120.00 Despesa:Jantares 120.00
Que pode ser computado pelo Ledger, ou inserido no cômputo:
include MasterCard.txt 2022/01/01 Opening balances Liquido:Saldo inicial -4000.00 Ativo:Camara de Arbitragem 4000.00 [...]
A equação do patrimônio líquido é dada por:
Patrimônio líquido é a diferença entre o valor total dos ativos de uma empresa e o valor total de suas obrigações (passivos). Ele representa o valor líquido que os proprietários ou acionistas têm investido na empresa, ou seja, o valor residual após o pagamento de todas as obrigações.
Patrimônio Líquido./ledger -f Journal.txt bal Ativo Passivo
Ativo 1200.00 Ativo:Camara de Arbitragem 1200.00 Passivo -540.00 Passivo:MasterCard -540.00 ------------------------------------------------------------------------------- 660.00
A equação do fluxo de caixa é dada por:
Fluxo de caixa é um termo utilizado na área financeira para representar o movimento de entrada e saída de dinheiro de uma empresa, organização ou pessoa. Em outras palavras, é o registro de todas as transações financeiras que ocorrem em determinado período, sejam elas de recebimento (renda) ou pagamento (despesas).
Fluxo de Caixa./ledger -f Journal.txt bal Renda Despesa
Despesa 12340.00 Despesa:Almocos 80.00 Despesa:Certidoes 20.00 Despesa:Despesas de viagem 2200.00 Despesa:Honorarios do advogado 3500.00 Despesa:Honorarios do mediador 700.00 Despesa:Honorarios do perito 4500.00 Despesa:Jantares 120.00 Despesa:Registros 200.00 Despesa:Servico de interprete 900.00 Despesa:Taxas 90.00 Despesa:Transporte de Documentos 30.00 Renda -9000.00 Renda:Receita -9000.00 ------------------------------------------------------------------------------- 3340.00
O GNUPlot é uma ferramenta de linha de comando para gerar gráficos que pode ser usada para visualizar dados financeiros registrados no Ledger. É possível gerar gráficos em diversos formatos a partir dos dados contidos nos relatórios gerados a partir dos comandos "reg" e "bal" do Ledger:
$14000 +---------------------------------------------------------------------+ | + + + + + + + + + + + | | Renda ***A***: : : : : : : : : | |Despesas ###B###: : : : : : : : : B | $12000 |-+...:....:.....:.....:.....:.....:.....:.....:....:.....:.....:...#-| | : : : : : : : : : : : # | | : : : : : : : : : : : # | $10000 |-+...:....:.....:.....:.....:.....:.....:.....:....:.....:.....:.#.+-| | : : : : : : : : : : : # | | : : : : : : : : : :*A :# | | : : : : : : : : : *** :# | $8000 |-+...:....:.....:.....:.....:.....:.....:.....:....:***..:....#B...+-| | : : : : : : : : ** :###B : | | : : : : : : : :*** :###### : | | : : : : : : : **A##B### : : | $6000 |-+...:....:.....:.....:.....:.....:....**#####:....:.....:.....:...+-| | : : : : : :***B## : : : : | | : : : : :***A** # : : : : : | | : : : :*B###########B : : : : : | $4000 |-+...:....:.....:******.#...:.....:.....:.....:....:.....:.....:...+-| | : : *A*** : # : : : : : : : | | : **** : : # : : : : : : : | $2000 |-+...***..:.....:.....:#....:.....:.....:.....:....:.....:.....:...+-| | ****: : : :# : : : : : : : | |* : ##B###########B : : : : : : : | | ###B## + + + + + + + + + + | $0 +---------------------------------------------------------------------+ Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Jan '22 '22 '22 '22 '22 '22 '22 '22 '22 '22 '22 '22 '23
Com o GNUPlot, é possível criar gráficos de linha, barras, histogramas, entre outros tipos, para exibir os dados financeiros em diferentes formatos. Por exemplo, pode-se criar um gráfico de linha que mostre a evolução do patrimônio líquido ao longo do tempo ou um gráfico de barras que mostre a distribuição dos gastos por categoria. Aqui usamos curvas preenchidas para gerar o gráfico do fluxo de caixa:
Aqui usamos barras para gerar o gráfico de total de despesas por categoria:
GNUPlot./ledger -f Journal.txt bal Desp|busybox awk -F " " "{print $1,\",\", $NF}" \ |busybox sed -e "1d"|busybox sed -e "$d"|busybox sed -e "$d" > Plot-Bar.txt
Gráfico PNGset style fill solid set boxwidth 0.3 relative set autoscale set datafile separator "," set grid set xtics rotate set format y "$%'.0f" set xzeroaxis linetype 1 set terminal png size 800,600 plot "Plot-Bar.txt" using 2:xtic(1) with boxes lt 2 lc rgb "dark-gray" notitle
Aqui usamos curvas preenchidas para gerar o gráfico de crescimento de patrimônio:
GNUPlot./ledger -f Journal.txt reg Ati|busybox awk "{print $1, $NF}" >Plot-Ass.txt ./ledger -f Journal.txt reg Pas|busybox awk "{print $1, $NF}" >Plot-Lia.txt
Gráfico PNGset termi pngcairo set xdata time set timefmt "%Y-%m-%d" set key right top set grid set datafile separator " " set xzeroaxis linetype 0 set grid set xtics rotate set style fill transparent solid 0.6 noborder set xzeroaxis linetype 0 set timefmt '%Y/%m/%d' set format y "$%'.0f" set format x "%m/%y" plot "plot-ass.txt" using 1:2 with filledcurves x1 title "Ativos" linecolor rgb "gray", '' using 1:2:2 with labels font "Courier,8" offset 0,0.5 textcolor linestyle 0 notitle, "plot-lia.txt" using 1:2 with filledcurves y1=0 title "Passivos" linecolor rgb "black", '' using 1:2:2 with labels font "Courier,8" offset 0,0.5 textcolor rgb "black" notitle
Aqui usamos barras para gerar o gráfico do fluxo de caixa:
GNUPlot./ledger -f Journal.txt reg Rend|busybox awk "{print $1, $(NF-1)}" >Plot-Inc.txt ./ledger -f Journal.txt reg Desp|busybox awk "{print $1, $(NF-1)}" >Plot-Exp.txt
Gráfico PNGset style fill transparent solid 0.4 noborder set border 1 set key left top set grid ytics set xtics rotate set title "Renda e Despesa Mensais" set datafile separator " " set xzeroaxis linetype 0 set xdata time set timefmt '%Y/%m/%d' set format y "$%'.0f" set format x "%m/%Y" set xzeroaxis linetype 1 set terminal png size 800,600 set style fill solid set boxwidth 2000000 absolute set style fill solid 2.0 border rgb 'grey30' plot "plot-inc.txt" u 1:2 with boxes lt 2 lc rgb "grey" title "Renda", "plot-exp.txt" u 1:2 with boxes lt 2 lc rgb "dark-grey" title "Despesa"
A segurança de transações em formato Ledger envolve uma combinação de práticas e tecnologias para garantir a integridade, autenticidade, confidencialidade e não repúdio das transações registradas. Abaixo estão alguns dos principais aspectos de segurança envolvidos:
1-) Controle de acesso: Um sistema Ledger seguro deve ter mecanismos adequados de controle de acesso para garantir que apenas as partes autorizadas possam acessar e modificar as transações registradas. Isso envolve a definição de políticas de acesso, autenticação de usuários, gerenciamento de identidades e permissões adequadas para diferentes níveis de acesso.
2-) Auditoria e trilha de auditoria: É importante manter uma trilha de auditoria completa das transações registradas no Ledger. Isso inclui o registro de informações como data e hora, identidades das partes envolvidas, valores transferidos e quaisquer outras informações relevantes. Uma trilha de auditoria robusta ajuda na investigação de atividades suspeitas e na detecção de quaisquer violações de segurança.
3-) Monitoramento e detecção de anomalias: Sistemas Ledger devem ser monitorados continuamente para detectar atividades suspeitas ou comportamentos anormais. Isso envolve a implementação de sistemas de detecção de intrusões, análise de registros de transações e o uso de técnicas de análise de dados para identificar possíveis ameaças ou violações de segurança.
Uma das principais medidas de segurança adotadas pelo sistema é a autenticação de cada operação, a fim de garantir que apenas transações legítimas sejam registradas.
A autenticação no sistema é realizada através de uma etapa de verificação com chave pública. Cada operação é submetida a uma verificação de assinatura digital, que é gerada a partir da chave privada do emissor da transação. A chave pública é armazenada no sistema e pode ser verificada pelo receptor da transação.
Ao receber uma operação, o sistema verifica a assinatura digital da transação com a chave pública do emissor. Se a assinatura estiver correta, a transação é considerada autêntica e é registrada. Caso contrário, a transação é rejeitada e não é registrada.
A utilização da chave pública garante a autenticidade da operação, uma vez que somente o emissor da transação pode gerar a assinatura digital correta. Além disso, a autenticação com chave pública garante a integridade da transação, uma vez que qualquer alteração na transação invalidaria a assinatura digital.
Em suma, a autenticação com chave pública é uma medida de segurança essencial para o funcionamento seguro do sistema. Ao verificar a assinatura digital de cada transação, ele garante que somente transações autênticas e íntegras sejam registradas, aumentando a confiabilidade das informações financeiras.
O JSON Web Token é um padrão da Internet para a criação de dados com assinatura opcional e/ou criptografia cujo payload contém o JSON que afirma algum número de declarações. Os tokens são assinados usando um segredo privado ou uma chave pública/privada.
JSON Web Token./jwt -key private.pem -alg EdDSA -claim note="Inscricao" -claim date=2022/05/05 -claim payee=Taxa -claim amount=125 -sign + | ./jwt -key public.pem -alg EdDSA -verify - | ./json2ledger -sourceaccount "Ativo" -targetaccount "Despesa:Taxa" -uuid
Transação em formato LedgerHeader: { "alg": "EdDSA", "typ": "JWT" } Claims: { "amount": "125", "date": "2022/05/05", "note": "Inscricao", "payee": "Taxa" }
; UUID: c311c335-781d-4468-afd2-5bf0c62ca3e4 ; Inscricao 2022/05/05 Taxa Ativo -125.00 Despesa:Taxa 125.00
Linha de Comandopackage main import ( "encoding/json" "flag" "fmt" "time" uuid "github.com/pedroalbanese/uuid" ) type Payload struct { ID string `json:"id"` Amount string `json:"amount"` Date string `json:"date"` Note string `json:"note"` Payee string `json:"payee"` } func main() { amount := flag.String("amount", "", "Amount") note := flag.String("note", "", "Note") payee := flag.String("payee", "", "Payee") prettify := flag.Bool("prettify", false, "Prettify output") flag.Parse() date := time.Now().Format("2006/01/02") uuid, _ := uuid.NewUUID() payload := Payload{ ID: uuid.String(), Amount: *amount, Date: date, Note: *note, Payee: *payee, } var jsonPayload []byte var err error if *prettify { jsonPayload, err = json.Marshal(payload) } else { jsonPayload, err = json.MarshalIndent(payload, "", " ") } if err != nil { fmt.Println("Error generating the payload:", err) return } fmt.Println(string(jsonPayload)) }
./text2json -amount 125.25 -note "Forum" -payee Taxa|./jwt -key private.pem -sign -
Linha de Comandopackage main import ( "encoding/json" "flag" "fmt" "os" "strings" ) func main() { note := flag.String("note", "", "Note for the transaction") sourceAccount := flag.String("sourceaccount", "", "Source account for the transaction") targetAccount := flag.String("targetaccount", "", "Target account for the transaction") payee := flag.String("payee", "", "Payee for the transaction") amount := flag.String("amount", "", "Amount for the transaction") date := flag.String("date", "", "Date for the transaction") flag.Parse() var transaction map[string]interface{} err := json.NewDecoder(os.Stdin).Decode(&transaction) if err != nil { fmt.Println("Error decoding JSON:", err) return } if *note == "" { if val, ok := transaction["note"].(string); ok { *note = val } } if *sourceAccount == "" { if val, ok := transaction["sourceaccount"].(string); ok { *sourceAccount = val } } if *targetAccount == "" { if val, ok := transaction["targetaccount"].(string); ok { *targetAccount = val } } if *payee == "" { if val, ok := transaction["payee"].(string); ok { *payee = val } } if *amount == "" { if val, ok := transaction["amount"].(string); ok { *amount = val } } if *date == "" { if val, ok := transaction["date"].(string); ok { *date = val } } if *amount == "" { fmt.Println("Error: amount is required") return } if *date == "" { fmt.Println("Error: date is required") return } amountValue := 0.0 _, err = fmt.Sscanf(*amount, "%f", &amountValue) if err != nil { fmt.Println("Error: invalid amount format") return } var sb strings.Builder if *note != "" { sb.WriteString("; ") sb.WriteString(*note) sb.WriteString("\n") } sb.WriteString(*date) sb.WriteString(" ") sb.WriteString(*payee) sb.WriteString("\n") if *sourceAccount != "" { sb.WriteString(" ") sb.WriteString(*sourceAccount) sb.WriteString(strings.Repeat(" ", 65-len(*sourceAccount))) sb.WriteString(fmt.Sprintf("%10.2f\n", -amountValue)) } if *targetAccount != "" { sb.WriteString(" ") sb.WriteString(*targetAccount) sb.WriteString(strings.Repeat(" ", 65-len(*targetAccount))) sb.WriteString(fmt.Sprintf("%10.2f\n", amountValue)) } fmt.Print(sb.String()) }
./jwt -key private.pem -verify "Token.jwt"|./json2ledger -sourceaccount Ativos -targetaccount Despesa:Taxas
Ao utilizar o Sistema Único de Rastreio Financeiro (SURF), você concorda com estes termos de utilização. Caso não concorde com estes termos, por favor, não utilize o SURF. O sistema é livre para uso pessoal, de MEIs e gestores de ONGs.
1.1 O SURF é um sistema de rastreamento financeiro que permite integração com os softwares GNUCash e GNUPlot.
1.2 Ao utilizar o SURF, você concorda em fornecer informações verdadeiras, precisas, atualizadas e completas sobre suas finanças.
1.3 Você é responsável por manter a segurança de suas informações financeiras e deve notificar imediatamente o SURF em caso de qualquer uso não autorizado de sua conta.
1.4 O SURF reserva-se o direito de suspender ou encerrar sua conta a qualquer momento, caso haja suspeita de violação dos termos de utilização ou qualquer outra atividade suspeita.
2.1 O SURF é protegido por direitos autorais e outras leis de propriedade intelectual. Todos os direitos sobre o SURF são reservados ao proprietário do sistema, Pedro F. Albanese. Vide Lei 9.610/98, Art. 7º, inciso XII.
3.1 O SURF é fornecido "como está" e o proprietário do sistema não garante que o SURF atenda a todas as suas necessidades, seja livre de erros ou interrupções, ou que os resultados obtidos por meio do SURF sejam precisos ou confiáveis, posto que mal utilizado.
3.2 Em nenhuma circunstância, o proprietário do sistema será responsável por qualquer dano, incluindo, sem limitação, danos diretos, indiretos, especiais, consequentes, punitivos ou incidentais, decorrentes do uso ou incapacidade de usar o SURF, mesmo que o proprietário do sistema tenha sido avisado da possibilidade de tais danos.
4.1 O proprietário do sistema reserva-se o direito de alterar estes termos de utilização a qualquer momento. As alterações serão efetivadas mediante a publicação de uma nova versão dos termos no site do SURF (este).
4.2 Ao continuar a usar o SURF após as alterações nos termos, você concorda em ficar vinculado aos novos termos de utilização.
5.1 Em caso de dúvidas ou sugestões sobre os termos de utilização, você pode entrar em contato com o proprietário do sistema por meio do email pedroalbanese@hotmail.com.
Ao utilizar o SURF, você concorda com estes termos de utilização e se compromete a respeitá-los integralmente.