Jump to content
cjulio

Utilizar Webservices da AT

Recommended Posts

jncevcosta
1 hora atrás, jose.cordeiro disse:

@jncevcosta

boas em nodejs fiz assim:
 


....

var https = require('https');
var parseString = require('xml2js').parseString;
...

var financasOptions = 
{
  hostname: "servicos.portaldasfinancas.gov.pt",
  port: 401,  //PRODUCAO
  path: "/sgdtws/documentosTransporte",
  method: "POST",
  pfx: fs.readFileSync('/opt/FinancasCert/' + GTData.taxRegistrationNumber + '.pfx'),
  cert: fs.readFileSync('/opt/FinancasCert/ChaveCifraPublicaAT_Prod.cer'),	
  passphrase: 'password ou passphrase',
  agent: false,
  rejectUnauthorized: false,
  /*secureProtocol: 'SSLv3_method',*/
  headers: 
  {
    "Accept": "text/xml",
    "Content-length": message.length,
    "Content-Type": "text/xml;charset=UTF-8",
    "SOAPAction": "https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/"
  }
};

var requestCode = https.request(financasOptions, function(requestCode)
{
  requestCode.on('data', function (chunk) 
  {
	parseString(chunk, function (err, result)
    {
	//tratas da resposta das finanças	
....
	
	});
  }).on('error', function(e)
  {
  	console.log("ReqError: " + e);
  }
});
requestCode.end(message); //o message é o XML (a guia de transporte)

na parte do ENVELOPE a password, nonce e created gero em Java simplesmente porque nao consigo fazer o mesmo algoritmo em JS 🤨

Espero que ajude.

Obrigado.

O XML passas como uma string ou lês com o readFileSync?

Estou a enviar como uma string e está a dar erro:

[ { faultcode: [ '33' ],
0|dcweb  |     faultstring:
0|dcweb  |      [ 'Incomplete markup or missing document element at offset 2490 of ' ],
0|dcweb  |     detail: [ 'sgdtws.gdgtqua' ] } ]

Pensei que estivesse alguma tag mal fechada, mas já validei o formato xml e diz que está bem construído.

Edited by jncevcosta

Share this post


Link to post
Share on other sites
jose.cordeiro
37 minutos atrás, jncevcosta disse:

Obrigado.

O XML passas como uma string ou lês com o readFileSync?

Estou a enviar como uma string e está a dar erro:


[ { faultcode: [ '33' ],
0|dcweb  |     faultstring:
0|dcweb  |      [ 'Incomplete markup or missing document element at offset 2490 of ' ],
0|dcweb  |     detail: [ 'sgdtws.gdgtqua' ] } ]

Pensei que estivesse alguma tag mal fechada, mas já validei o formato xml e diz que está bem construído.

string

Ve se tens acentos na string

....replace(/à/g, 'a').replace(/á/g, 'a').replace(/ã/g, 'a').replace(/â/g, 'a').
            replace(/ç/g, 'c').
            replace(/è/g, 'e').replace(/é/g, 'e').replace(/ê/g, 'e').
            replace(/ì/g, 'i').replace(/í/g, 'i').
            replace(/ò/g, 'o').replace(/ó/g, 'o').replace(/õ/g, 'o').replace(/ô/g, 'o').
            replace(/ù/g, 'u').replace(/ú/g, 'u');

cuidado que por exemplo a morada  nao pode passar os 50 chars

curiosamente em JS se mando com acentos falha (em Java nao falhava).

Edited by jose.cordeiro
acrescentar um detalhe

Share this post


Link to post
Share on other sites
jncevcosta
24 minutos atrás, jose.cordeiro disse:

string

Ve se tens acentos na string


....replace(/à/g, 'a').replace(/á/g, 'a').replace(/ã/g, 'a').replace(/â/g, 'a').
            replace(/ç/g, 'c').
            replace(/è/g, 'e').replace(/é/g, 'e').replace(/ê/g, 'e').
            replace(/ì/g, 'i').replace(/í/g, 'i').
            replace(/ò/g, 'o').replace(/ó/g, 'o').replace(/õ/g, 'o').replace(/ô/g, 'o').
            replace(/ù/g, 'u').replace(/ú/g, 'u');

cuidado que por exemplo a morada  nao pode passar os 50 chars

Retirando do cabeçalho o content-length já comunico.

Agora tenho o seguinte erro vindo da AT

[ 'Rejected:   |  Codigo: 10  |  Erro: Validade da credencial expirada(2019-07-31T15:12:44.0Z)  |  Tentativas Restantes: -1' ]

Que credencial é esta ? 

Estou a usar o pfx de testes da AT.

Share this post


Link to post
Share on other sites
jorang
2 minutos atrás, jncevcosta disse:

 


[ 'Rejected:   |  Codigo: 10  |  Erro: Validade da credencial expirada(2019-07-31T15:12:44.0Z)  |  Tentativas Restantes: -1' ]

Que credencial é esta ? 

Estou a usar o pfx de testes da AT.

Esse erro ocorre quando a hora do server não está em sincronia com o OAL e/ou o pedido é enviado muito depois de ser gerado.

Share this post


Link to post
Share on other sites
jncevcosta
2 minutos atrás, jorang disse:

Esse erro ocorre quando a hora do server não está em sincronia com o OAL e/ou o pedido é enviado muito depois de ser gerado.

Fui agora ver e realmente o servidor está 2 minutos adiantado face ao correcto 🤦‍♂️

Share this post


Link to post
Share on other sites
americob
17 horas atrás, Raul Macedo disse:

Sim, confirma-se que o servidor de testes da AT não está a funcionar. Depois de obter vezes sem conta o erro 52, contactei a AT e confirmaram-me que o ambiente de testes não está a funcionar e não adiantam prazo para resolução. Pena que não deem essa informação de forma clara no site... perdemos imenso tempo a despistar o erro quanto afinal o servidor está inoperacional... enfim...

Mesmo no Portal da AT, em testes, aparece o erro 52!

>>>RECEIVED<<<
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<work:WorkContext xmlns:work="http://oracle.com/weblogic/soap/workarea/">rO0ABXdLABN3ZWJsb2dpYy5hcHAuc2dkdHdzAAAA1gAAACN3ZWJsb2dpYy53b3JrYXJlYS5TdHJpbmdXb3JrQ29udGV4dAAHMS4yMC4zMwAA</work:WorkContext>
</S:Header>
<S:Body>
<ns0:envioDocumentoTransporteResponseElem xmlns:ns0="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
<ResponseStatus>
<ReturnCode>52</ReturnCode>
<ReturnMessage>Não foi possível verificar se o utilizador tem permissões para aceder a esta operação.</ReturnMessage>
</ResponseStatus>
</ns0:envioDocumentoTransporteResponseElem>
</S:Body>
</S:Envelope>

Não estou a ver como alguém consiga comunicar em testes sem problemas.

Share this post


Link to post
Share on other sites
marcolopes
2 hours ago, americob said:

Mesmo no Portal da AT, em testes, aparece o erro 52!

Não estou a ver como alguém consiga comunicar em testes sem problemas.

Jul 31, 2019 7:57:33 PM org.dma.services.at.SOAPMessageHandler interceptAndRecordSoapMessage
INFO: 
>>>SENT<<<
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>599999993/0037</wss:Username>
<wss:Password Digest="SiFjD+vfTzU5suG5sF6XomUz9EEwgHDx1WHtCG5ANCE=">jSYNbsYgTf98+wChie7d2g==</wss:Password>
<wss:Nonce>mWXj6dg46AFXEqv3B8pePftcKFADzf6YCEabVEs4pP3gSZ2KoHNz/ul+3PknLM9d/4MHgdnodKbuRTIOE4U1/J+Wg4zMgRpq5P022da5MBpeS2gk0aNmeYtPJTn0GftNB8uLKTinBOfaRHrHvpOsQlBBfOUGls5kMXBlJN0pEcrGZTwS9i32Icx1nturHytfs4OPtVo764pNV7O0Gc7d+rwPbzim4Z5vzmz7H0BSEpk5DzzjcgMvGJhzSRPKIT0UuFeJK/mGutLDAtFAPJaFbsXX7LSN4opbKHDL4kHiCZXODnTaj2BFVe5sUDbW51YHwm06DSVrlwpxrqST40H7hA==</wss:Nonce>
<wss:Created>2019-07-31T18:57:39.670Z</wss:Created>
</wss:UsernameToken>
</wss:Security>
</S:Header>
<S:Body>
<ns2:RegisterInvoiceElem xmlns:ns2="http://servicos.portaldasfinancas.gov.pt/faturas/">
<TaxRegistrationNumber>599999993</TaxRegistrationNumber>
<ns2:InvoiceNo>CFA 2018/526726</ns2:InvoiceNo>
<ns2:InvoiceDate>2018-12-18</ns2:InvoiceDate>
<ns2:InvoiceType>FT</ns2:InvoiceType>
<ns2:InvoiceStatus>N</ns2:InvoiceStatus>
<CustomerTaxID>999999990</CustomerTaxID>
<Line>
<ns2:DebitAmount>100</ns2:DebitAmount>
<ns2:Tax>
<ns2:TaxType>IVA</ns2:TaxType>
<ns2:TaxCountryRegion>PT</ns2:TaxCountryRegion>
<ns2:TaxPercentage>23</ns2:TaxPercentage>
</ns2:Tax>
</Line>
<DocumentTotals>
<ns2:TaxPayable>23</ns2:TaxPayable>
<ns2:NetTotal>100</ns2:NetTotal>
<ns2:GrossTotal>123</ns2:GrossTotal>
</DocumentTotals>
</ns2:RegisterInvoiceElem>
</S:Body>
</S:Envelope>

Jul 31, 2019 7:57:35 PM org.dma.services.at.SOAPMessageHandler interceptAndRecordSoapMessage
INFO: 
>>>RECEIVED<<<
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<ns0:RegisterInvoiceResponseElem xmlns:ns0="http://servicos.portaldasfinancas.gov.pt/faturas/">
<ReturnCode>0</ReturnCode>
<ReturnMessage>Documento registado com sucesso.</ReturnMessage>
</ns0:RegisterInvoiceResponseElem>
</env:Body>
</env:Envelope>

0
Documento registado com sucesso.

Ninguém falou em documentos de transporte! :\

Testei a comunicação de FACTURAS.

Portanto, nem todas as comunicações estão com problemas... o WS de Transportes está down... o de facturas está UP!

Edited by marcolopes

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
marcolopes
Jul 31, 2019 8:01:39 PM org.dma.services.at.SOAPMessageHandler interceptAndRecordSoapMessage
INFO: 
>>>SENT<<<
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>599999993/0037</wss:Username>
<wss:Password Digest="aO5dylompxM4rdKCVIAzS8mN7TUeMYYtc3w8pUURAPQ=">U5traY9OCKPg5w1sjz0pRQ==</wss:Password>
<wss:Nonce>SN98AF7IywH5qihdF53NmAprKQowlpN6Zvyu7JjEar/jvooGSZL8qlvpvA6dOB9hohSDYbSrF1TPSDoWWfaiuZ5AEaJANi/UXau3uk42BedTqNLJ0AZS0AxHk2XciwvR5Cr6jlC/7bkZaObBZcVVYOYNOGuaibA2U5ExVxKODFJULCHXPmUnYy2RZtzq8Rsnnh+SBeiXGoILRR2oEWwQpvQiABcdXKy05uUE9J7/Rx+6/C9bk+PRSya5vJOawVLnvxLcrUE5eVVrmEdWyMnWl2X/QXIL6YutKkf3LdHtLa71EBh9yJXTwoNdVVbKESYE82ySmuVjM6Ff7h20H7OBZw==</wss:Nonce>
<wss:Created>2019-07-31T19:01:45.91Z</wss:Created>
</wss:UsernameToken>
</wss:Security>
</S:Header>
<S:Body>
<ns2:envioDocumentoTransporteRequestElem xmlns:ns2="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
<TaxRegistrationNumber>599999993</TaxRegistrationNumber>
<CompanyName>Empresa</CompanyName>
<CompanyAddress>
<Addressdetail>Rua</Addressdetail>
<City>Localidade</City>
<PostalCode>1000-001</PostalCode>
<Country>PT</Country>
</CompanyAddress>
<DocumentNumber>CGT 2013/565891</DocumentNumber>
<MovementStatus>N</MovementStatus>
<MovementDate>2018-12-18</MovementDate>
<MovementType>GT</MovementType>
<CustomerTaxID>999999990</CustomerTaxID>
<CustomerAddress>
<Addressdetail>Rua</Addressdetail>
<City>Localidade</City>
<PostalCode>1000-001</PostalCode>
<Country>PT</Country>
</CustomerAddress>
<CustomerName>Cliente</CustomerName>
<AddressTo>
<Addressdetail>Rua</Addressdetail>
<City>Localidade</City>
<PostalCode>1000-001</PostalCode>
<Country>PT</Country>
</AddressTo>
<AddressFrom>
<Addressdetail>Rua</Addressdetail>
<City>Localidade</City>
<PostalCode>1000-001</PostalCode>
<Country>PT</Country>
</AddressFrom>
<MovementEndTime>2018-12-18T07:20:59</MovementEndTime>
<MovementStartTime>2018-12-18T07:20:00</MovementStartTime>
<VehicleID>XX-YY-ZZ</VehicleID>
<Line>
<ProductDescription>Artigo</ProductDescription>
<Quantity>10</Quantity>
<UnitOfMeasure>UN</UnitOfMeasure>
<UnitPrice>100</UnitPrice>
</Line>
</ns2:envioDocumentoTransporteRequestElem>
</S:Body>
</S:Envelope>

Jul 31, 2019 8:01:39 PM org.dma.services.at.SOAPMessageHandler interceptAndRecordSoapMessage
INFO: 
>>>RECEIVED<<<
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<work:WorkContext xmlns:work="http://oracle.com/weblogic/soap/workarea/">rO0ABXdLABN3ZWJsb2dpYy5hcHAuc2dkdHdzAAAA1gAAACN3ZWJsb2dpYy53b3JrYXJlYS5TdHJpbmdXb3JrQ29udGV4dAAHMS4yMC4zMwAA</work:WorkContext>
</S:Header>
<S:Body>
<ns0:envioDocumentoTransporteResponseElem xmlns:ns0="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
<ResponseStatus>
<ReturnCode>52</ReturnCode>
<ReturnMessage>Não foi possível verificar se o utilizador tem permissões para aceder a esta operação.</ReturnMessage>
</ResponseStatus>
</ns0:envioDocumentoTransporteResponseElem>
</S:Body>
</S:Envelope>

null
null
52
Não foi possível verificar se o utilizador tem permissões para aceder a esta operação.

Resutlado da comunicação de Documentos de Transporte


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Share this post


Link to post
Share on other sites
Nuno Bagulho Marques

Boa noite

Chegou a altura de renovar o meu certifcado e assim fiz.

Integrei a chave privada com o .cer que AT devolveu e transformei o .pfx em dois .pem para o PHP, segundo o código do eskiso.

os comandos:

openssl pkcs12 -in 555555555.pfx -nocerts -out pfxKey21.pem

openssl pkcs12 -in 196515165.pfx -clcerts -nokeys -out pfxcert21.pem

e, agora, obtenho esta resposta: 

*   Trying 213.13.158.240:401...
* TCP_NODELAY set
* Connected to servicos.portaldasfinancas.gov.pt (213.13.158.240) port 401 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* Falling back from TLSv1.3 to max supported SSL version (TLSv1.2)
*   CAfile: none
  CApath: none
* loaded libnssckbi.so
* unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
* NSS error -8178 (SEC_ERROR_BAD_KEY)
* Peer's public key is invalid.
* Closing connection 0

Alguém já passou por isto?

Obrigado

 

Share this post


Link to post
Share on other sites
Nuno Bagulho Marques
15 horas atrás, Nuno Bagulho Marques disse:

Boa noite

Chegou a altura de renovar o meu certifcado e assim fiz.

Integrei a chave privada com o .cer que AT devolveu e transformei o .pfx em dois .pem para o PHP, segundo o código do eskiso.

os comandos:

openssl pkcs12 -in 555555555.pfx -nocerts -out pfxKey21.pem

openssl pkcs12 -in 196515165.pfx -clcerts -nokeys -out pfxcert21.pem

e, agora, obtenho esta resposta: 

*   Trying 213.13.158.240:401...
* TCP_NODELAY set
* Connected to servicos.portaldasfinancas.gov.pt (213.13.158.240) port 401 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* Falling back from TLSv1.3 to max supported SSL version (TLSv1.2)
*   CAfile: none
  CApath: none
* loaded libnssckbi.so
* unable to load client key: -8178 (SEC_ERROR_BAD_KEY)
* NSS error -8178 (SEC_ERROR_BAD_KEY)
* Peer's public key is invalid.
* Closing connection 0

Alguém já passou por isto?

Obrigado

 

Resolvido. É necessário transformar a chave privada em RSA, no meu caso uso a biblioteca CURL + NSS

openssl rsa -in pfxKey21.pem -out newpfxKey21.pem

Share this post


Link to post
Share on other sites
Karina

Bom dia,

Estou recebendo a mensagem de erro:  "52 - Não foi possível verificar se o utilizador tem permissões para aceder a esta operação" na comunicação das guias à AT no nosso ambiente de teste. Alguém já passou por este problema?

 

Obrigada.

Share this post


Link to post
Share on other sites
kalin
4 horas atrás, Karina disse:

Bom dia,

Estou recebendo a mensagem de erro:  "52 - Não foi possível verificar se o utilizador tem permissões para aceder a esta operação" na comunicação das guias à AT no nosso ambiente de teste. Alguém já passou por este problema?

 

Obrigada.

Penso que o ambiente de testes não está a funcionar, ou seja temos que testar em produção ....

Share this post


Link to post
Share on other sites
Karina
38 minutos atrás, kalin disse:

Penso que o ambiente de testes não está a funcionar, ou seja temos que testar em produção ....

Este erro somente ocorre no ambiente de teste. Em produção as guias estão sendo autorizadas.

 

Share this post


Link to post
Share on other sites
jncevcosta

Andei vários dias com o erro de credêncial expirada. Contudo o relógio estava certo pelo unl.

Agora está a dar erro de ligação. Alguém está a conseguir usar o ambiente de testes para as guias?

Share this post


Link to post
Share on other sites
avr2

Boa tarde!

Por acaso alguém pode confirmar, se o webservice de testes da AT para o envio da declaração do IVA, está a disponível?

 

Obrigada!

Share this post


Link to post
Share on other sites
cristina

Alguém mais com problemas de comunicação de documentos de transporte?

Share this post


Link to post
Share on other sites
rukako

eu também estou com problemas nos DT e nem ao site consigo aceder ..... :-(

Share this post


Link to post
Share on other sites
rangiku
23 horas atrás, cristina disse:

Alguém mais com problemas de comunicação de documentos de transporte?

Boa tarde a todos,

Também estamos com problemas na comunicação de guias de transporte em produção, também estão neste momento com a mesma situação?

Obrigado.

Share this post


Link to post
Share on other sites
Vitor Pereira
36 minutos atrás, rangiku disse:

Boa tarde a todos,

Também estamos com problemas na comunicação de guias de transporte em produção, também estão neste momento com a mesma situação?

Obrigado.

 

Boas

Em produção, tudo a funcionar a 100% sem qualquer tipo de paragem desde o problema no Servidor da AT quando trocou o Certificado penso que em Julho.

 

Share this post


Link to post
Share on other sites
rangiku
1 hora atrás, Vitor Pereira disse:

 

Boas

Em produção, tudo a funcionar a 100% sem qualquer tipo de paragem desde o problema no Servidor da AT quando trocou o Certificado penso que em Julho.

 

Obrigado pela informação Vitor.

Vou tentar fazer outros testes para perceber o que está acontecer.

Share this post


Link to post
Share on other sites
xenix

Recentemente alguém teve algum problema a renovar o certificado?

Seguimos os seguintes passos:

1- Gerar CSR

openssl req -new -subj "/C=PT/ST=Lisboa/L=Lisboa/O=Organizacao/OU=Departamento de Informatica/CN=555555555/emailAddress=email@email.com" -newkey rsa:2048 -nodes -out 555555555.csr -keyout 555555555.key

2- Gerar pfx

openssl pkcs12 -export -in 555555555.cer -inkey 555555555.key -out 555555555.pfx

3- Converter o pfx para pem (a nossa app usa .pem)

openssl pkcs12 -in 555555555.pfx -out 555555555.pem -nodes

No entanto este certificado falha. IE teste: 

openssl s_client -connect servicos.portaldasfinancas.gov.pt:400 -CAfile 555555555.pem

...ssl handshake failure...

 

Reparamos que no email de resposta ao nosso CSR, dentro do ZIP vem um ficheiro novo, PublicChainCA2.p7b, que contém um certificado root DGITA Root CA e um CA2 DGITA Issuing CA2.

Também o próprio email tem dois plaintexts (Imagino que seja o root e o CA2).

Já tentámos integrar este certificado(PublicChainCA2.p7b) no nosso pfx, mas eventualmente a .pem gerada também falha:

openssl pkcs7 -print_certs -in PublicChainCA2.p7b -out PublicChainCA2.cer
openssl pkcs12 -export -in 555555555.cer -inkey 555555555.key -certfile PublicChainCA2.cer -out 555555555.pfx

 

Alguém com um problema semelhante?

Edited by xenix

Share this post


Link to post
Share on other sites
RValverde

Alguém com este erro a comunicar guias?

Software Primavera sem conseguir comunicar guias desde ontem, não existiu qualquer alteração ao nível da aplicação de um dia para o outro.

Obrigado

 

Citação

Ocorreu um erro ao efetuar o pedido HTTP a https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte. Isto pode ser causado pelo facto do certificado do servidor não estar corretamente configurado com HTTP.SYS no caso HTTPS. Isto também pode ser causado por um erro de correspondência do enlace de segurança entre o cliente e o servidor.

 

Share this post


Link to post
Share on other sites
Nuno Rompante
3 horas atrás, RValverde disse:

Alguém com este erro a comunicar guias?

Software Primavera sem conseguir comunicar guias desde ontem, não existiu qualquer alteração ao nível da aplicação de um dia para o outro.

Obrigado

 

Ocorreu um erro ao efetuar o pedido HTTP a https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte. Isto pode ser causado pelo facto do certificado do servidor não estar corretamente configurado com HTTP.SYS no caso HTTPS. Isto também pode ser causado por um erro de correspondência do enlace de segurança entre o cliente e o servidor.

Mesmo problema aqui.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.