Classe e função pra carregar XML

Projeto hbNFe (Nota Fiscal Eletronica/Danfe) para [x]Harbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Esse switch eu achei perigoso, por estar acostumado com DO CASE que não precisa EXIT em cada opção.

Um que eu uso bastante, é pra não ter que numerar cada opção, permitindo acrescentar/eliminar itens fácil:

Código: Selecionar todos

nTemp := 1
DO CASE
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
ENDCASE
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

E não é que não tem comandos no manual do Harbour.
Alguém tinha reparado nisso?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Eh a primeira vez que For Each tbm... e ate me parece mais simples que For... Next
Fechou Quintas... Declare local oProduto e depois peguei oProduto:Nome ...
Estou usando e abusando das novas no Harbour como WITH OBJECT, SWITCH, o FOR EACH, esses comandos são ótimos e substitui muito os tradicionais na maioria dos casos
Esqueci de comentar:

É legal ver isso.
É isso que mostra que "estamos ativos e vivos".
E vai despertando curiosidade de aprender cada vez mais.
O que era rotineiro e cansativo, começa a se transformar em novas aventuras... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Classe e função pra carregar XML

Mensagem por rubens »

JoséQuintas,

Fiz uma implementações na classe, mais especificamente no prg ze_spedxmlClass.prg. Acrescentei uns campos que a classe não estava pegando. Onde acrescentei coloquei meu nome na linha.
Se você achar que é interessante por favor atualize para que não seja necessário alterar aqui no prg quando fizer uma atualização da classe.

Obrigado
Rubens
ze_spedxmlClass.prg
(33.3 KiB) Baixado 685 vezes
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Vou olhar com mais atenção as alterações.
Como uso direto no meu aplicativo, talvez tenha que alterar meu aplicativo.

Mas já dá pra adiantar que tem pelo menos uma coisa errada:
a chave fica em :cChaveAcesso e em uma parte usou :cChave
Também já cometi esse erro, talvez seja hora de alterar o nome pra :cChave mesmo
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Classe e função pra carregar XML

Mensagem por rubens »

JoséQuintas....

O XML em anexo me deu uma canseira danada e mesmo assim não consegui resolver... A sequencia da numeração dos produtos veio quebrada... veio o item 18 depois o 22,23 e o 19,20,21...
52170102595626000113550010006859911001640370.xml
(22.56 KiB) Baixado 802 vezes
Daí tanto com for each com a sua classe, tanto usando minha rotina com for next, se perde a sequencia de leitura dos itens e para sempre no item 21.
A minha rotina não consegue ler os itens fora da sequencia... o que eu poderia fazer ? (nesse caso para resolver abri o arquivo com o bloco de nota e corrigi a sequencia dos itens).

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Use MultipleNodeToArray()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Classe e função pra carregar XML

Mensagem por rubens »

José Quintas...

Essa MultipleNodeToArray() vai ter que ser usada na classe... onde faz a leitura dos arquivos vai ter que mudar xmlnode() para MultipleNodeToArray()?

Achei que ia ser um caso isolado o problema dos itens fora de sequencia mas agora estou com três clientes recebendo notas desse tipo... agora tenho que correr atrás...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Código: Selecionar todos

   FOR nCont = 1 TO 1000
      cBlocoItem := XmlNode( cBlocoDetalhe, [det nItem="] + LTrim( Str( nCont ) ) + ["])
      IF Len( Trim( cBlocoItem ) ) = 0 // Se acabaram os itens
         EXIT
      ENDIF
Com MultipleNodeToArray(), deve ficar até mais fácil, acho que assim basta:

Código: Selecionar todos

FOR EACH cBlocoItem IN MultipleNodeToArray( cBlocoDetalhe, "det nItem" )
      IF Len( Trim( cBlocoItem ) ) = 0 // Se acabaram os itens
         EXIT
      ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Classe e função pra carregar XML

Mensagem por rubens »

Olá...

Quintas, por favor dá mais uma aulinha aqui... tem horas que a gente tá meio travado... (ou é burro mesmo)...
Eu tinha conseguido fazer funcionar com MultipleNodeToArray(), tive que fazer uma alteração na função mas funcionou... Que alteração? Quando manda somente o cNode para MultipleNodeToArray() lendo uma nfe não funcionava por que o bloco de itens começa com det item e termina somente com det. Daí implementei para mandar cNode e cNodeFim, se não for enviado cNodeFim ele assume por default cNode.
Daí ficou assim:

Código: Selecionar todos

FUNCTION MultipleNodeToArray( cXml, cNode, cNodeFim )
   LOCAL aNodes :={}
	hb_Default( @cNodeFim, cNode )
   DO WHILE "<" + cNode + "=" $ cXml .OR. "<" + cNode + ">" $ cXml
      Aadd( aNodes , XmlNode( cXml , cNode ) )
      IF ! "</" + cNodeFim $ cXml
         cXml := ""
      ELSE
         cXml := Substr( cXml, At( "</" + cNodeFim + ">", cXml ) + Len( "</" + cNodeFim + ">" ) )
      ENDIF
   ENDDO
   RETURN aNodes
Agora não estou conseguindo chamar a função... Se uso:

Código: Selecionar todos

For EACH oProduto IN ( oNfe:Produto )
Funciona beleza... desde que a ordem dos produtos esteja correta...
Se a ordem dos produtos está errada, não está em sequencia ( 1,2,3,4,9,6,57 ) não funciona.
Como eu colocaria para usar o MultipleNodeToArray().
Já tinha conseguido isso mas perdi uns dois dias de programação e a rotina que tinha conseguido estava nesses dias.
O meu conceito é:
Preciso pegar a relação dos produtos... daí envio para MultipleNodeToArray() cXML que é o texto da NFE certo? daí MultipleNodeToArray() adiciona em aNodes os produtos. Mas eu não tenho um variável texto com a NFE. oNFE é um objeto de class e oNFE:Produto é uma array.
O mais próximo que consegui chegar foi:

Código: Selecionar todos

cXml 			:= Hb_MemoRead( cArqXml )
For EACH oProduto IN ( MultipleNodeToArray( cXml, 'det nItem','det')
cNomPro := oProduto:Nome   --> Dá erro aqui
Next
Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Simples:

a função não tinha problema, não tinha nada pra ser consertado, você simplesmente a estragou.

A classe tem tudo que precisa, tem até o Danfe que retira toda informação da nota.
Tem até rotina pronta pra pegar dados da nota, além dessa.

Não querendo ser chato, mas já sendo:

Não era a rotina que estava errada, era você.
O nome não é "det item", é "det".

MultipleNodeToArray( cXml, "det" )

Era só ter olhado os fontes da classe pra encontrar o uso correto.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Classe e função pra carregar XML

Mensagem por gilbertosilverio »

Ola Jose Quintas,

Estou estudando teu exemplo, de como criar classes, para tentar criar uma rotina, e esta ocorrendo o erro apos a emissao da NFe.

O que pode ser, o PDF e gerado, mais o qrcode não, dando o erro abaixo, a ja tentei entender, mais não consegui fazer funcionar.

35170644463156000184550750004914211108131768.XML
Error BASE/1111 Argument error: LEN
Called from LEN(0)
Called from HBNFEDANFCE:CONSULTACHAVEACESSO(434)
Called from HBNFEDANFCE:CALCULAPDF(165)
Called from HBNFEDANFCE:TOPDF(72)
Called from (b)HBNFEDANFCE(16)
Called from HBNFEDANFCE:EXECUTE(0)
Called from TESTDANFE(230)
Called from MAIN(65)

Retirei o que tinha, oFILES do teu exemplo, e inclui um numero de uma NFe valida, ela gera o pdf mais da o erro abaixo.

Código: Selecionar todos

FUNCTION TestDanfe()

   LOCAL oDanfe, oFiles, cFileXml, cFilePdf

   oFiles := { "35170644463156000184550750004914211108131768.XML" }
   FOR EACH cFileXml IN oFiles
      oDanfe := hbNfeDaGeral():New()
      cFilePdf := Substr( cFileXml, 1, At( ".", cFileXml ) ) + "pdf"
      fErase( cFilePdf )
      oDanfe:cLogoFile := JPEGImage()
      oDanfe:cDesenvolvedor := "www.jpatecnologia.com.br"
      oDanfe:ToPDF( cFileXml, cFilePdf, iif( cFileXml == "nfecancel.xml", "nfecancelcan.xml", "" ) )
      ? cFileXml, oDanfe:cRetorno
      PDFOpen( cFilePdf )
   NEXT
   oDanfe := hbNFeDaNFCe():New()
   oDanfe:Execute( "www.jpatecnologia.com.br" )
   PDFOpen( "pdfqrcode.pdf" )
   Inkey(0)

   RETURN NIL
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Classe e função pra carregar XML

Mensagem por gilbertosilverio »

Jose Quintas,

Inclui :
OTHERWISE
cUrl := ""
Não sei se e certo, mais não deu mais o erro...

Código: Selecionar todos

METHOD ConsultaChaveAcesso() CLASS hbNFeDaNFCe

   LOCAL cUF, cUFList, cUrl

   // DIVISAO IV - Informacoes da consulta via chave de acesso -------------------------------------------------------------------
   cUFList := "AC,12,AL,27,AM,13,AP,16,BA,29,CE,23,DF,53,ES,32,GO,52,MG,31,MS,50,MT,51,MA,21,PA,15,PB,25,PE,26,PI,22,PR,41,RJ,33,RO,11,RN,24,RR,14,RS,43,SC,42,SE,28,SP,35,TO,17,"
   cUF     := Substr( cUFList, At( ::aIde[ "cUF" ], cUFList ) - 3, 2 )

   // Fonte: http://nfce.encat.org/consumidor/consulte-sua-nota/
   IF ::aIde[ "tpAmb" ] == WS_AMBIENTE_PRODUCAO
      DO CASE
      CASE cUF == "AC" ; cUrl := "www.sefaznet.ac.gov.br/nfce/consulta"
      CASE cUF == "AL" ; cUrl := "http://nfce.sefaz.al.gov.br/consultaNFCe.htm"
      CASE cUF == "AP" ; cUrl := "https://www.sefaz.ap.gov.br/sate/seg/SEGf_AcessarFuncao.jsp?cdFuncao=FIS_1261"
      CASE cUF == "AM" ; cUrl := "sistemas.sefaz.am.gov.br/nfceweb/formConsulta.do"
      CASE cUF == "BA" ; cUrl := "nfe.sefaz.ba.gov.br/servicos/nfce/default.aspx"
      CASE cUF == "CE" ; cUrl := ""
      CASE cUF == "DF" ; cUrl := "http://dec.fazenda.df.gov.br/NFCE/"
      CASE cUF == "ES" ; cUrl := "http://app.sefaz.es.gov.br/ConsultaNFCe"
      CASE cUF == "GO" ; cUrl := ""
      CASE cUF == "MA" ; cUrl := "http://www.nfce.sefaz.ma.gov.br/portal/consultaNFe.do?method=preFilterCupom&"
      CASE cUF == "MT" ; cUrl := "http://www.sefaz.mt.gov.br/nfce/consultanfce"
      CASE cUF == "MS" ; cUrl := "http://www.dfe.ms.gov.br/nfce"
      CASE cUF == "MG" ; cUrl := ""
      CASE cUF == "PA" ; cUrl := "https://appnfc.sefa.pa.gov.br/portal/view/consultas/nfce/consultanfce.seam"
      CASE cUF == "PB" ; cUrl := "www.receita.pb.gov.br/nfce"
      CASE cUF == "PR" ; cUrl := "http://www.fazenda.pr.gov.br"
      CASE cUF == "PE" ; cUrl := ""
      CASE cUF == "PI" ; cUrl := "http://webas.sefaz.pi.gov.br/nfceweb/consultarNFCe.jsf"
      CASE cUF == "RJ" ; cUrl := "www.nfce.fazenda.rj.gov.br/consulta"
      CASE cUF == "RN" ; cUrl := "http://nfce.set.rn.gov.br/consultarNFCe.aspx"
      CASE cUF == "RS" ; cUrl := "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"
      CASE cUF == "RO" ; cUrl := "http://www.nfce.sefin.ro.gov.br"
      CASE cUF == "RR" ; cUrl := "https://www.sefaz.rr.gov.br/nfce/servlet/wp_consulta_nfce"
      CASE cUF == "SC" ; cUrl := ""
      CASE cUF == "SP" ; cUrl := "https://www.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaPublica.aspx"
      CASE cUF == "SE" ; cUrl := "http://www.nfce.se.gov.br/portal/portalNoticias.jsp"
      CASE cUF == "TO" ; cUrl := ""
      OTHERWISE
          cUrl := ""
      ENDCASE
   ELSE
      DO CASE
      CASE cUF == "AC" ; cUrl := "http://hml.sefaznet.ac.gov.br/nfce/consulta"
      CASE cUF == "AL" ; cUrl := "http://nfce.sefaz.al.gov.br/consultaNFCe.htm"
      CASE cUF == "AP" ; cUrl := "https://www.sefaz.ap.gov.br/sate1/seg/SEGf_AcessarFuncao.jsp?cdFuncao=FIS_1261"
      CASE cUF == "AM" ; cUrl := "homnfce.sefaz.am.gov.br/nfceweb/formConsulta.do"
      CASE cUF == "BA" ; cUrl := "http://hnfe.sefaz.ba.gov.br/servicos/nfce/default.aspx"
      CASE cUF == "CE" ; cUrl := "http://nfceh.sefaz.ce.gov.br/pages/consultaNota.jsf"
      CASE cUF == "DF" ; cUrl := "http://dec.fazenda.df.gov.br/NFCE/"
      CASE cUF == "ES" ; cUrl := "http://homologacao.sefaz.es.gov.br/ConsultaNFCe"
      CASE cUF == "GO" ; cUrl := ""
      CASE cUF == "MA" ; cUrl := "http://www.hom.nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp"
      CASE cUF == "MT" ; cUrl := "http://homologacao.sefaz.mt.gov.br/nfce/consultanfce"
      CASE cUF == "MS" ; cUrl := "http://www.dfe.ms.gov.br/nfce"
      CASE cUF == "MG" ; cUrl := ""
      CASE cUF == "PA" ; cUrl := "https://appnfc.sefa.pa.gov.br/portal-homologacao/view/consultas/nfce/consultanfce.seam"
      CASE cUF == "PB" ; cUrl := ""
      CASE cUF == "PR" ; cUrl := "http://www.fazenda.pr.gov.br"
      CASE cUF == "PE" ; cUrl := ""
      CASE cUF == "PI" ; cUrl := "http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf"
      CASE cUF == "RJ" ; cUrl := "www.nfce.fazenda.rj.gov.br/consulta"
      CASE cUF == "RN" ; cUrl := "http://nfce.set.rn.gov.br/consultarNFCe.aspx"
      CASE cUF == "RS" ; cUrl := "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"
      CASE cUF == "RO" ; cUrl := "http://www.nfce.sefin.ro.gov.br"
      CASE cUF == "RR" ; cUrl := "http://200.174.88.103:8080/nfce/servlet/wp_consulta_nfce"
      CASE cUF == "SC" ; cUrl := ""
      CASE cUF == "SP" ; cUrl := "https://www.homologacao.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaPublica.aspx"
      CASE cUF == "SE" ; cUrl := "http://www.hom.nfe.se.gov.br/portal/portalNoticias.jsp"
      CASE cUF == "TO" ; cUrl := ""
      OTHERWISE
          cUrl := ""
      ENDCASE
   ENDIF

GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Sim... não.... talvez... melhor o porque:

Se tem todas as UFs, e nenhuma serviu... ou está faltando UF, ou chegou uma UF errada até aí.
Pode ser interessante verificar quando acontecer erro, já que seria uma "nova" UF.

Será que não chega o código da UF ao invés da UF?
Tem função de converter, UfCodigo() e UFSigla() se não me engano.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe e função pra carregar XML

Mensagem por JoséQuintas »

Estou estudando teu exemplo, de como criar classes, para tentar criar uma rotina, e esta ocorrendo o erro apos a emissao da NFe.
De um modo geral, classe é como se fosse um fonte usando variáveis PUBLIC/PRIVATE que valem pro fonte inteiro.
METHOD é igual função.

Argument error, LEN
Significa que foi usar a função Len() em algum conteúdo que não permite Len()
Nessa linha vai dar pra ver a variável.

Estou vendo que isso tem a ver com a parte que está sendo adicionada da NFCE.
Acrescentei na classe, mas não percebi que não está finalizada.

Dá pra perceber pelo nome do que deu erro: NFCE
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder