@semacode/cli 1.5.17 → 1.5.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +268 -260
- package/LICENSE +22 -22
- package/README.md +93 -61
- package/SEMA_BRIEF.curto.txt +8 -6
- package/SEMA_BRIEF.md +71 -22
- package/SEMA_BRIEF.micro.txt +7 -5
- package/SEMA_INDEX.json +931 -193
- package/dist/controleComercialSupabase.d.ts +326 -0
- package/dist/controleComercialSupabase.js +310 -0
- package/dist/controleComercialSupabase.js.map +1 -0
- package/dist/docs.js +48 -20
- package/dist/docs.js.map +1 -1
- package/dist/drift.d.ts +5 -3
- package/dist/drift.js +119 -116
- package/dist/drift.js.map +1 -1
- package/dist/importador.d.ts +1 -1
- package/dist/importador.js +1 -200
- package/dist/importador.js.map +1 -1
- package/dist/index.js +1924 -493
- package/dist/index.js.map +1 -1
- package/dist/mcpRemoto.d.ts +32 -0
- package/dist/mcpRemoto.js +61 -0
- package/dist/mcpRemoto.js.map +1 -0
- package/dist/projeto.js +3 -21
- package/dist/projeto.js.map +1 -1
- package/dist/tipos.d.ts +1 -1
- package/docs/AGENT_STARTER.md +109 -102
- package/docs/cli.md +89 -33
- package/docs/como-ensinar-a-sema-para-ia.md +42 -36
- package/docs/deploy.md +231 -43
- package/docs/documentacao.md +61 -36
- package/docs/env.md +63 -14
- package/docs/extensao-vscode.md +12 -4
- package/docs/fluxo-pratico-ia-sema.md +45 -35
- package/docs/instalacao-e-primeiro-uso.md +52 -30
- package/docs/integracao-com-ia.md +44 -35
- package/docs/mcp.md +270 -31
- package/docs/pagamento-ponta-a-ponta.md +40 -24
- package/docs/persistencia-vendor-first.md +11 -5
- package/docs/prompt-base-ia-sema.md +18 -11
- package/docs/rollback.md +17 -15
- package/docs/sintaxe.md +37 -229
- package/exemplos/agendamento.sema +105 -106
- package/exemplos/assinatura.sema +133 -136
- package/exemplos/auditoria.sema +89 -88
- package/exemplos/autenticacao.sema +125 -125
- package/exemplos/author_obra_comum.sema +294 -0
- package/exemplos/author_tema_sensivel.sema +264 -0
- package/exemplos/automacao.sema +107 -107
- package/exemplos/cadastro_usuario.sema +54 -54
- package/exemplos/calculadora.sema +78 -78
- package/exemplos/crud_simples.sema +89 -89
- package/exemplos/estoque.sema +127 -126
- package/exemplos/exportacao.sema +94 -94
- package/exemplos/fila.sema +130 -131
- package/exemplos/integracao_externa.sema +94 -94
- package/exemplos/multi_tenant.sema +140 -140
- package/exemplos/notificacao.sema +149 -98
- package/exemplos/operacao_estrategia.sema +633 -402
- package/exemplos/pagamento.sema +434 -222
- package/exemplos/pagamento_dominio.sema +35 -35
- package/exemplos/pedido.sema +255 -119
- package/exemplos/permissao.sema +121 -121
- package/exemplos/persistencia_vendor_first.sema +86 -86
- package/exemplos/profile_game.sema +114 -0
- package/exemplos/profile_legal.sema +105 -0
- package/exemplos/profile_ops.sema +110 -0
- package/exemplos/profile_research.sema +104 -0
- package/exemplos/profile_software.sema +123 -0
- package/exemplos/profile_workflow_n8n.sema +99 -0
- package/exemplos/relatorio.sema +93 -93
- package/exemplos/replica_analitica_erp.sema +160 -0
- package/exemplos/testes_embutidos.sema +45 -45
- package/exemplos/tratamento_erro.sema +157 -157
- package/exemplos/upload_arquivo.sema +93 -93
- package/exemplos/webhook.sema +94 -96
- package/llms-full.txt +34 -34
- package/llms.txt +17 -17
- package/node_modules/@sema/gerador-css/dist/index.js +563 -563
- package/node_modules/@sema/gerador-css/package.json +1 -1
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-html/dist/index.js +90 -90
- package/node_modules/@sema/gerador-html/package.json +1 -1
- package/node_modules/@sema/gerador-javascript/dist/index.js +92 -92
- package/node_modules/@sema/gerador-javascript/package.json +1 -1
- package/node_modules/@sema/gerador-lua/dist/index.js +53 -53
- package/node_modules/@sema/gerador-lua/package.json +1 -1
- package/node_modules/@sema/gerador-python/dist/index.js +122 -96
- package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-python/package.json +1 -1
- package/node_modules/@sema/gerador-typescript/dist/index.js +153 -153
- package/node_modules/@sema/gerador-typescript/package.json +1 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -4
- package/node_modules/@sema/nucleo/dist/formatador/index.js +26 -46
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +9 -204
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -35
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -21
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -40
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -5
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +76 -307
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +2 -0
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +32 -2
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- package/package.json +15 -15
package/exemplos/assinatura.sema
CHANGED
|
@@ -1,136 +1,133 @@
|
|
|
1
|
-
module exemplos.assinatura {
|
|
2
|
-
docs {
|
|
3
|
-
resumo: "Gestao de assinaturas recorrentes com upgrade, downgrade e cancelamento."
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
entity Assinatura {
|
|
7
|
-
fields {
|
|
8
|
-
id: Id
|
|
9
|
-
cliente_id: Id
|
|
10
|
-
plano_id: Id
|
|
11
|
-
status: Texto
|
|
12
|
-
inicio_em: Timestamp
|
|
13
|
-
proximo_vencimento: Timestamp
|
|
14
|
-
cancelada_em: Timestamp
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
task criar_assinatura {
|
|
19
|
-
input {
|
|
20
|
-
cliente_id: Id required
|
|
21
|
-
plano_id: Id required
|
|
22
|
-
token_pagamento: Texto required
|
|
23
|
-
}
|
|
24
|
-
output {
|
|
25
|
-
assinatura: Assinatura
|
|
26
|
-
}
|
|
27
|
-
rules {
|
|
28
|
-
cliente_id deve_ser valido
|
|
29
|
-
plano_id deve_ser valido
|
|
30
|
-
token_pagamento deve_ser valido
|
|
31
|
-
}
|
|
32
|
-
effects {
|
|
33
|
-
consulta Cliente por cliente_id
|
|
34
|
-
consulta Plano por plano_id
|
|
35
|
-
consulta gateway_pagamento criticidade = alta
|
|
36
|
-
persistencia Assinatura
|
|
37
|
-
evento assinatura_criada criticidade = alta
|
|
38
|
-
notificacao cliente confirmacao_assinatura criticidade = media
|
|
39
|
-
auditoria criacao_assinatura criticidade = alta
|
|
40
|
-
}
|
|
41
|
-
state ciclo_assinatura {
|
|
42
|
-
transitions {
|
|
43
|
-
PENDENTE -> ATIVA
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
guarantees {
|
|
47
|
-
assinatura existe
|
|
48
|
-
assinatura.status == ATIVA
|
|
49
|
-
}
|
|
50
|
-
error {
|
|
51
|
-
pagamento_recusado: "Pagamento inicial recusado."
|
|
52
|
-
cliente_ja_assina: "Cliente ja possui assinatura ativa."
|
|
53
|
-
plano_invalido: "Plano nao disponivel para assinatura."
|
|
54
|
-
}
|
|
55
|
-
tests {
|
|
56
|
-
caso "cria assinatura pro" {
|
|
57
|
-
given { cliente_id: "cli_1" plano_id: "plano_pro" token_pagamento: "tok_ok" }
|
|
58
|
-
expect { sucesso: verdadeiro }
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
task cancelar_assinatura {
|
|
64
|
-
input {
|
|
65
|
-
assinatura_id: Id required
|
|
66
|
-
motivo: Texto required
|
|
67
|
-
imediato: Booleano
|
|
68
|
-
}
|
|
69
|
-
output {
|
|
70
|
-
protocolo: Id
|
|
71
|
-
}
|
|
72
|
-
rules {
|
|
73
|
-
assinatura_id deve_ser valido
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
ATIVA ->
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
1
|
+
module exemplos.assinatura {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Gestao de assinaturas recorrentes com upgrade, downgrade e cancelamento."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
entity Assinatura {
|
|
7
|
+
fields {
|
|
8
|
+
id: Id
|
|
9
|
+
cliente_id: Id
|
|
10
|
+
plano_id: Id
|
|
11
|
+
status: Texto
|
|
12
|
+
inicio_em: Timestamp
|
|
13
|
+
proximo_vencimento: Timestamp
|
|
14
|
+
cancelada_em: Timestamp
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
task criar_assinatura {
|
|
19
|
+
input {
|
|
20
|
+
cliente_id: Id required
|
|
21
|
+
plano_id: Id required
|
|
22
|
+
token_pagamento: Texto required
|
|
23
|
+
}
|
|
24
|
+
output {
|
|
25
|
+
assinatura: Assinatura
|
|
26
|
+
}
|
|
27
|
+
rules {
|
|
28
|
+
cliente_id deve_ser valido
|
|
29
|
+
plano_id deve_ser valido
|
|
30
|
+
token_pagamento deve_ser valido
|
|
31
|
+
}
|
|
32
|
+
effects {
|
|
33
|
+
consulta Cliente por cliente_id
|
|
34
|
+
consulta Plano por plano_id
|
|
35
|
+
consulta gateway_pagamento criticidade = alta
|
|
36
|
+
persistencia Assinatura
|
|
37
|
+
evento assinatura_criada criticidade = alta
|
|
38
|
+
notificacao cliente confirmacao_assinatura criticidade = media
|
|
39
|
+
auditoria criacao_assinatura criticidade = alta
|
|
40
|
+
}
|
|
41
|
+
state ciclo_assinatura {
|
|
42
|
+
transitions {
|
|
43
|
+
PENDENTE -> ATIVA
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
guarantees {
|
|
47
|
+
assinatura existe
|
|
48
|
+
assinatura.status == ATIVA
|
|
49
|
+
}
|
|
50
|
+
error {
|
|
51
|
+
pagamento_recusado: "Pagamento inicial recusado."
|
|
52
|
+
cliente_ja_assina: "Cliente ja possui assinatura ativa."
|
|
53
|
+
plano_invalido: "Plano nao disponivel para assinatura."
|
|
54
|
+
}
|
|
55
|
+
tests {
|
|
56
|
+
caso "cria assinatura pro" {
|
|
57
|
+
given { cliente_id: "cli_1" plano_id: "plano_pro" token_pagamento: "tok_ok" }
|
|
58
|
+
expect { sucesso: verdadeiro }
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
task cancelar_assinatura {
|
|
64
|
+
input {
|
|
65
|
+
assinatura_id: Id required
|
|
66
|
+
motivo: Texto required
|
|
67
|
+
imediato: Booleano
|
|
68
|
+
}
|
|
69
|
+
output {
|
|
70
|
+
protocolo: Id
|
|
71
|
+
}
|
|
72
|
+
rules {
|
|
73
|
+
assinatura_id deve_ser valido
|
|
74
|
+
motivo deve_ser preenchido
|
|
75
|
+
}
|
|
76
|
+
effects {
|
|
77
|
+
persistencia Assinatura
|
|
78
|
+
consulta gateway_pagamento criticidade = alta
|
|
79
|
+
evento assinatura_cancelada criticidade = alta
|
|
80
|
+
notificacao cliente confirmacao_cancelamento criticidade = media
|
|
81
|
+
auditoria cancelamento_assinatura criticidade = alta
|
|
82
|
+
}
|
|
83
|
+
state ciclo_assinatura {
|
|
84
|
+
transitions {
|
|
85
|
+
ATIVA -> CANCELADA
|
|
86
|
+
ATIVA -> PENDENTE_CANCELAMENTO
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
guarantees {
|
|
90
|
+
protocolo existe
|
|
91
|
+
}
|
|
92
|
+
error {
|
|
93
|
+
assinatura_ja_cancelada: "Assinatura ja foi cancelada."
|
|
94
|
+
}
|
|
95
|
+
tests {
|
|
96
|
+
caso "cancela assinatura ativa" {
|
|
97
|
+
given { assinatura_id: "asn_1" motivo: "Nao preciso mais" imediato: falso }
|
|
98
|
+
expect { sucesso: verdadeiro }
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
task renovar_assinatura {
|
|
104
|
+
input {
|
|
105
|
+
assinatura_id: Id required
|
|
106
|
+
}
|
|
107
|
+
output {
|
|
108
|
+
protocolo_cobranca: Id
|
|
109
|
+
}
|
|
110
|
+
rules {
|
|
111
|
+
assinatura_id deve_ser valido
|
|
112
|
+
}
|
|
113
|
+
effects {
|
|
114
|
+
consulta gateway_pagamento criticidade = alta
|
|
115
|
+
persistencia Assinatura
|
|
116
|
+
evento assinatura_renovada criticidade = media
|
|
117
|
+
auditoria renovacao_assinatura criticidade = alta
|
|
118
|
+
}
|
|
119
|
+
guarantees {
|
|
120
|
+
protocolo_cobranca existe
|
|
121
|
+
}
|
|
122
|
+
error {
|
|
123
|
+
pagamento_recusado: "Cobranca de renovacao recusada — assinatura sera suspensa."
|
|
124
|
+
assinatura_cancelada: "Nao e possivel renovar assinatura cancelada."
|
|
125
|
+
}
|
|
126
|
+
tests {
|
|
127
|
+
caso "renova assinatura no vencimento" {
|
|
128
|
+
given { assinatura_id: "asn_1" }
|
|
129
|
+
expect { sucesso: verdadeiro }
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
package/exemplos/auditoria.sema
CHANGED
|
@@ -1,88 +1,89 @@
|
|
|
1
|
-
module exemplos.auditoria {
|
|
2
|
-
docs {
|
|
3
|
-
resumo: "Registro imutavel de acoes criticas com rastreabilidade completa."
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
entity RegistroAuditoria {
|
|
7
|
-
fields {
|
|
8
|
-
id: Id
|
|
9
|
-
ator_id: Id
|
|
10
|
-
ator_tipo: Texto
|
|
11
|
-
acao: Texto
|
|
12
|
-
recurso: Texto
|
|
13
|
-
recurso_id: Id
|
|
14
|
-
dados_antes: Objeto
|
|
15
|
-
dados_depois: Objeto
|
|
16
|
-
ip_origem: Texto
|
|
17
|
-
timestamp: Timestamp
|
|
18
|
-
contexto: Objeto
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
task registrar_acao {
|
|
23
|
-
input {
|
|
24
|
-
ator_id: Id required
|
|
25
|
-
acao: Texto required
|
|
26
|
-
recurso: Texto required
|
|
27
|
-
recurso_id: Id required
|
|
28
|
-
dados_antes: Objeto
|
|
29
|
-
dados_depois: Objeto
|
|
30
|
-
ip_origem: Texto
|
|
31
|
-
}
|
|
32
|
-
output {
|
|
33
|
-
auditoria_id: Id
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
1
|
+
module exemplos.auditoria {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Registro imutavel de acoes criticas com rastreabilidade completa."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
entity RegistroAuditoria {
|
|
7
|
+
fields {
|
|
8
|
+
id: Id
|
|
9
|
+
ator_id: Id
|
|
10
|
+
ator_tipo: Texto
|
|
11
|
+
acao: Texto
|
|
12
|
+
recurso: Texto
|
|
13
|
+
recurso_id: Id
|
|
14
|
+
dados_antes: Objeto
|
|
15
|
+
dados_depois: Objeto
|
|
16
|
+
ip_origem: Texto
|
|
17
|
+
timestamp: Timestamp
|
|
18
|
+
contexto: Objeto
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
task registrar_acao {
|
|
23
|
+
input {
|
|
24
|
+
ator_id: Id required
|
|
25
|
+
acao: Texto required
|
|
26
|
+
recurso: Texto required
|
|
27
|
+
recurso_id: Id required
|
|
28
|
+
dados_antes: Objeto
|
|
29
|
+
dados_depois: Objeto
|
|
30
|
+
ip_origem: Texto
|
|
31
|
+
}
|
|
32
|
+
output {
|
|
33
|
+
auditoria_id: Id
|
|
34
|
+
imutavel: Booleano
|
|
35
|
+
}
|
|
36
|
+
rules {
|
|
37
|
+
acao deve_ser preenchida
|
|
38
|
+
recurso deve_ser preenchido
|
|
39
|
+
ator_id deve_ser valido
|
|
40
|
+
}
|
|
41
|
+
effects {
|
|
42
|
+
persistencia RegistroAuditoria criticidade = alta
|
|
43
|
+
}
|
|
44
|
+
guarantees {
|
|
45
|
+
auditoria_id existe
|
|
46
|
+
imutavel == verdadeiro
|
|
47
|
+
}
|
|
48
|
+
error {
|
|
49
|
+
falha_persistencia: "Nao foi possivel registrar a auditoria — operacao bloqueada."
|
|
50
|
+
}
|
|
51
|
+
tests {
|
|
52
|
+
caso "registra acao critica" {
|
|
53
|
+
given { ator_id: "usr_1" acao: "deletar_usuario" recurso: "Usuario" recurso_id: "usr_2" }
|
|
54
|
+
expect { sucesso: verdadeiro }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
task consultar_historico {
|
|
60
|
+
input {
|
|
61
|
+
recurso: Texto required
|
|
62
|
+
recurso_id: Id required
|
|
63
|
+
data_inicio: Data
|
|
64
|
+
data_fim: Data
|
|
65
|
+
}
|
|
66
|
+
output {
|
|
67
|
+
registros: Lista
|
|
68
|
+
total: Inteiro
|
|
69
|
+
}
|
|
70
|
+
rules {
|
|
71
|
+
recurso deve_ser preenchido
|
|
72
|
+
recurso_id deve_ser valido
|
|
73
|
+
}
|
|
74
|
+
effects {
|
|
75
|
+
consulta RegistroAuditoria por recurso e recurso_id
|
|
76
|
+
auditoria consulta_historico
|
|
77
|
+
}
|
|
78
|
+
guarantees {
|
|
79
|
+
registros existe
|
|
80
|
+
total >= 0
|
|
81
|
+
}
|
|
82
|
+
tests {
|
|
83
|
+
caso "consulta historico de usuario" {
|
|
84
|
+
given { recurso: "Usuario" recurso_id: "usr_1" }
|
|
85
|
+
expect { sucesso: verdadeiro }
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|