iesde 1.1.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README-OLD-API.md +258 -0
- data/README.md +137 -177
- data/examples/aulas/buscar.rb +45 -0
- data/examples/aulas/link_video.rb +36 -0
- data/examples/disciplinas/aulas.rb +30 -0
- data/examples/disciplinas/buscar.rb +27 -0
- data/examples/disciplinas/link_pdf.rb +14 -0
- data/examples/matriculas/ativar.rb +33 -0
- data/examples/matriculas/buscar.rb +15 -0
- data/examples/matriculas/criar.rb +38 -0
- data/examples/matriculas/criar_com_campos_obrigatorios.rb +20 -0
- data/iesde.gemspec +12 -3
- data/lib/concerns/linkable.rb +6 -0
- data/lib/concerns/stringable.rb +7 -0
- data/lib/concerns/underscorable.rb +13 -0
- data/lib/iesde.rb +28 -16
- data/lib/iesde/api.rb +109 -0
- data/lib/iesde/api/alterar_status_matricula.rb +9 -0
- data/lib/iesde/api/criar_matricula.rb +13 -0
- data/lib/iesde/api/obter_aula.rb +12 -0
- data/lib/iesde/api/obter_dados_pdf.rb +9 -0
- data/lib/iesde/api/obter_disciplina.rb +11 -0
- data/lib/iesde/api/obter_link_pdf.rb +10 -0
- data/lib/iesde/api/obter_matricula.rb +11 -0
- data/lib/iesde/api/obter_video.rb +11 -0
- data/lib/iesde/config.rb +2 -2
- data/lib/iesde/model/aula.rb +12 -21
- data/lib/iesde/model/disciplina.rb +45 -0
- data/lib/iesde/model/matricula.rb +43 -23
- data/lib/iesde/request.rb +70 -0
- data/lib/iesde/version.rb +1 -1
- metadata +171 -30
- data/lib/iesde/clients/buscararquivo.rb +0 -28
- data/lib/iesde/clients/cadastro.rb +0 -32
- data/lib/iesde/clients/inativa_acesso.rb +0 -21
- data/lib/iesde/clients/lista_curso.rb +0 -22
- data/lib/iesde/clients/logout.rb +0 -34
- data/lib/iesde/clients/obtem_aulas.rb +0 -21
- data/lib/iesde/clients/obtem_matriculas.rb +0 -23
- data/lib/iesde/error/validation_error.rb +0 -6
- data/lib/iesde/model/aluno.rb +0 -21
- data/lib/iesde/model/curso.rb +0 -113
- data/lib/iesde/wsdl_client.rb +0 -79
@@ -0,0 +1,45 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
IDS = [ Expected_ids]
|
6
|
+
|
7
|
+
def call_with_config_params
|
8
|
+
aulas_com_config = Iesde::Model::Aula.buscar({
|
9
|
+
'MatriculaID' => 12345,
|
10
|
+
'DisciplinaID' => 123,
|
11
|
+
config: {
|
12
|
+
user: ENV['IESDE_USER'],
|
13
|
+
password: ENV['IESDE_PWD'],
|
14
|
+
ead_api_key: ENV['EAD_API_KEY']
|
15
|
+
}
|
16
|
+
})
|
17
|
+
|
18
|
+
puts aulas_com_config.size == IDS.length
|
19
|
+
|
20
|
+
puts aulas_com_config.map(&:matricula_id) == IDS
|
21
|
+
|
22
|
+
puts aulas_com_config.map(&:to_s)
|
23
|
+
end
|
24
|
+
|
25
|
+
def simple_call
|
26
|
+
Iesde.configure do |c|
|
27
|
+
c.user = ENV['IESDE_USER']
|
28
|
+
c.password = ENV['IESDE_PWD']
|
29
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
30
|
+
end
|
31
|
+
|
32
|
+
aulas = Iesde::Model::Aula.buscar({
|
33
|
+
'MatriculaID' => 12345,
|
34
|
+
'DisciplinaID' => 123
|
35
|
+
})
|
36
|
+
|
37
|
+
ap aulas.size == IDS.length
|
38
|
+
|
39
|
+
ap aulas.map(&:matricula_id) == IDS
|
40
|
+
puts aulas.map(&:to_s)
|
41
|
+
end
|
42
|
+
|
43
|
+
call_with_config_params
|
44
|
+
|
45
|
+
simple_call
|
@@ -0,0 +1,36 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
# chamada passando parametros de configuracoes
|
6
|
+
def call_with_config_params
|
7
|
+
aulas = Iesde::Model::Aula.buscar({
|
8
|
+
'MatriculaID' => 12345,
|
9
|
+
'DisciplinaID' => 123,
|
10
|
+
config: {
|
11
|
+
user: ENV['IESDE_USER'],
|
12
|
+
password: ENV['IESDE_PWD'],
|
13
|
+
ead_api_key: ENV['EAD_API_KEY']
|
14
|
+
}
|
15
|
+
})
|
16
|
+
|
17
|
+
ap aulas.first.link_video
|
18
|
+
end
|
19
|
+
|
20
|
+
def simple_call
|
21
|
+
Iesde.configure do |c|
|
22
|
+
c.user = ENV['IESDE_USER']
|
23
|
+
c.password = ENV['IESDE_PWD']
|
24
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
25
|
+
end
|
26
|
+
|
27
|
+
aulas = Iesde::Model::Aula.buscar({
|
28
|
+
'MatriculaID' => 12345,
|
29
|
+
'DisciplinaID' => 123
|
30
|
+
})
|
31
|
+
|
32
|
+
ap aulas.first.link_video
|
33
|
+
end
|
34
|
+
|
35
|
+
simple_call
|
36
|
+
call_with_config_params
|
@@ -0,0 +1,30 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
# chamada passando parametros de configuracoes
|
6
|
+
def call_with_config_params
|
7
|
+
disciplina = Iesde::Model::Disciplina.buscar(
|
8
|
+
config: {
|
9
|
+
user: ENV['IESDE_USER'],
|
10
|
+
password: ENV['IESDE_PWD'],
|
11
|
+
ead_api_key: ENV['EAD_API_KEY']
|
12
|
+
}).select {|d| d.disciplina_id.to_i == 123 }.first
|
13
|
+
|
14
|
+
ap disciplina.aulas(12345)
|
15
|
+
end
|
16
|
+
|
17
|
+
def simple_call
|
18
|
+
Iesde.configure do |c|
|
19
|
+
c.user = ENV['IESDE_USER']
|
20
|
+
c.password = ENV['IESDE_PWD']
|
21
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
22
|
+
end
|
23
|
+
|
24
|
+
disciplina = Iesde::Model::Disciplina.buscar.select {|d| d.disciplina_id.to_i == 123 }.first
|
25
|
+
|
26
|
+
ap disciplina.aulas(12345)
|
27
|
+
end
|
28
|
+
|
29
|
+
call_with_config_params
|
30
|
+
simple_call
|
@@ -0,0 +1,27 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
def simple_call
|
6
|
+
Iesde.configure do |c|
|
7
|
+
c.user = ENV['IESDE_USER']
|
8
|
+
c.password = ENV['IESDE_PWD']
|
9
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
10
|
+
end
|
11
|
+
|
12
|
+
disciplinas = Iesde::Model::Disciplina.buscar()
|
13
|
+
|
14
|
+
ap disciplinas
|
15
|
+
end
|
16
|
+
|
17
|
+
def call_with_config_params
|
18
|
+
disciplinas = Iesde::Model::Disciplina.buscar(config: {
|
19
|
+
user: ENV['IESDE_USER'],
|
20
|
+
password: ENV['IESDE_PWD'],
|
21
|
+
ead_api_key: ENV['EAD_API_KEY']
|
22
|
+
})
|
23
|
+
|
24
|
+
ap disciplinas
|
25
|
+
end
|
26
|
+
|
27
|
+
call_with_config_params
|
@@ -0,0 +1,14 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
Iesde.configure do |c|
|
6
|
+
c.user = ENV['IESDE_USER']
|
7
|
+
c.password = ENV['IESDE_PWD']
|
8
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
9
|
+
end
|
10
|
+
|
11
|
+
disciplina = Iesde::Model::Disciplina.buscar.select {|d| d.disciplina_id.to_i == 123 }.first
|
12
|
+
|
13
|
+
link_pdf = disciplina.pdf(12345)
|
14
|
+
ap link_pdf
|
@@ -0,0 +1,33 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
def simple_call
|
6
|
+
Iesde.configure do |c|
|
7
|
+
c.user = ENV['IESDE_USER']
|
8
|
+
c.password = ENV['IESDE_PWD']
|
9
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
10
|
+
end
|
11
|
+
|
12
|
+
matricula = Iesde::Model::Matricula.buscar.first
|
13
|
+
ap matricula.ativar!
|
14
|
+
|
15
|
+
ap matricula
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def call_with_config_params
|
20
|
+
matricula = Iesde::Model::Matricula.buscar(
|
21
|
+
config:{
|
22
|
+
user: ENV['IESDE_USER'],
|
23
|
+
password: ENV['IESDE_PWD'],
|
24
|
+
ead_api_key: ENV['EAD_API_KEY']
|
25
|
+
}).first
|
26
|
+
ap matricula.ativar!
|
27
|
+
|
28
|
+
ap matricula
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
simple_call
|
33
|
+
call_with_config_params
|
@@ -0,0 +1,15 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
config = {
|
6
|
+
config: {
|
7
|
+
user: ENV['IESDE_USER'],
|
8
|
+
password: ENV['IESDE_PWD'],
|
9
|
+
ead_api_key: ENV['EAD_API_KEY']
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
matricula = Iesde::Model::Matricula.buscar(config)
|
14
|
+
require 'pry'; binding.pry
|
15
|
+
ap matricula
|
@@ -0,0 +1,38 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
Iesde.configure do |c|
|
6
|
+
c.user = ENV['IESDE_USER']
|
7
|
+
c.password = ENV['IESDE_PWD']
|
8
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
9
|
+
end
|
10
|
+
|
11
|
+
# Criar matriculas
|
12
|
+
cpf = '82432858816'
|
13
|
+
cpf_errado = '04992817564'
|
14
|
+
|
15
|
+
params = {
|
16
|
+
'CursoID' => 12345 ,
|
17
|
+
'PoloID' => 1,
|
18
|
+
'Nome' => 'Usuario Legal',
|
19
|
+
'CPF' => cpf,
|
20
|
+
'Email' => 'usuario@muitolegal.com',
|
21
|
+
'RG' => '2003000152000',
|
22
|
+
'OrgaoRG' => 'Pulmão',
|
23
|
+
'UFRG' => 'CE',
|
24
|
+
'CEP' => '60120-140',
|
25
|
+
'Endereco' => 'Rua dos Anzois Pereira',
|
26
|
+
'Bairro' => 'BEM LONGE',
|
27
|
+
'Numero' => 123,
|
28
|
+
'Compl' => 'Bloco Z apto 500',
|
29
|
+
'Telefone' => '8588889999',
|
30
|
+
'Celular' => '8599999999',
|
31
|
+
'DtNascto' => '06/01/1966',
|
32
|
+
'EstadoCivil' => 1,
|
33
|
+
'Sexo' => 'M'
|
34
|
+
}
|
35
|
+
|
36
|
+
matricula = Iesde::Model::Matricula.criar(params)
|
37
|
+
|
38
|
+
ap matricula
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
require "awesome_print"
|
3
|
+
require 'iesde'
|
4
|
+
|
5
|
+
Iesde.configure do |c|
|
6
|
+
c.user = ENV['IESDE_USER']
|
7
|
+
c.password = ENV['IESDE_PWD']
|
8
|
+
c.ead_api_key = ENV['EAD_API_KEY']
|
9
|
+
end
|
10
|
+
|
11
|
+
matricula = Iesde::Model::Matricula.criar_com_campos_obrigatorios(
|
12
|
+
123456,
|
13
|
+
'Heron Da Silva',
|
14
|
+
'83550113501',
|
15
|
+
'heron@email2.com',
|
16
|
+
'60120-140',
|
17
|
+
123
|
18
|
+
)
|
19
|
+
|
20
|
+
ap matricula
|
data/iesde.gemspec
CHANGED
@@ -6,10 +6,10 @@ require 'iesde/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "iesde"
|
8
8
|
spec.version = Iesde::VERSION
|
9
|
-
spec.authors = ["Pedro Benevides"]
|
10
|
-
spec.email = ["pedroaugusto@gmail.com"]
|
9
|
+
spec.authors = ["Pedro Benevides", "Heron Medeiros"]
|
10
|
+
spec.email = ["pedroaugusto@gmail.com", "heron.medeiros@gmail.com"]
|
11
11
|
|
12
|
-
spec.summary = "Client do WebService
|
12
|
+
spec.summary = "Client do WebService REST do IESDE"
|
13
13
|
spec.description = "Esta não é uma versão oficial"
|
14
14
|
spec.homepage = "https://github.com/fortesinformatica/iesde"
|
15
15
|
spec.license = "MIT"
|
@@ -24,5 +24,14 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency "savon", "~> 2.10"
|
25
25
|
spec.add_dependency "json", "~> 1.7"
|
26
26
|
spec.add_dependency "activesupport", "~> 4.2"
|
27
|
+
spec.add_dependency "actionview"
|
28
|
+
spec.add_dependency "net-http-digest_auth"
|
27
29
|
|
30
|
+
spec.add_development_dependency "rspec"
|
31
|
+
spec.add_development_dependency "awesome_print"
|
32
|
+
spec.add_development_dependency "pry"
|
33
|
+
spec.add_development_dependency "pry-byebug"
|
34
|
+
spec.add_development_dependency "vcr"
|
35
|
+
spec.add_development_dependency "webmock"
|
36
|
+
spec.add_development_dependency 'simplecov'
|
28
37
|
end
|
data/lib/iesde.rb
CHANGED
@@ -1,34 +1,47 @@
|
|
1
1
|
require 'active_support/core_ext/module/attribute_accessors'
|
2
2
|
require 'active_support/inflector'
|
3
|
+
require 'action_view'
|
3
4
|
require 'json'
|
4
|
-
require '
|
5
|
+
require 'net/http'
|
6
|
+
require 'net/http/digest_auth'
|
7
|
+
require 'uri'
|
8
|
+
require "awesome_print"
|
9
|
+
require "pry"
|
5
10
|
|
6
11
|
module Iesde
|
12
|
+
autoload :Request, 'iesde/request'
|
13
|
+
autoload :API, 'iesde/api'
|
14
|
+
|
15
|
+
module Api
|
16
|
+
autoload :ObterMatricula, "iesde/api/obter_matricula"
|
17
|
+
autoload :CriarMatricula, "iesde/api/criar_matricula"
|
18
|
+
autoload :AlterarStatusMatricula, "iesde/api/alterar_status_matricula"
|
19
|
+
autoload :ObterDisciplina, "iesde/api/obter_disciplina"
|
20
|
+
autoload :ObterAula, "iesde/api/obter_aula"
|
21
|
+
autoload :ObterDadosPdf, "iesde/api/obter_dados_pdf"
|
22
|
+
autoload :ObterLinkPdf, "iesde/api/obter_link_pdf"
|
23
|
+
autoload :ObterVideo, "iesde/api/obter_video"
|
24
|
+
end
|
25
|
+
|
7
26
|
module Clients
|
8
27
|
autoload :ListaCurso,"iesde/clients/lista_curso"
|
9
|
-
autoload :ObtemAula,"iesde/clients/obtem_aulas"
|
10
|
-
autoload :ObtemMatricula,"iesde/clients/obtem_matriculas"
|
11
|
-
autoload :Cadastro,"iesde/clients/cadastro"
|
12
|
-
autoload :InativaAcesso,"iesde/clients/inativa_acesso"
|
13
|
-
autoload :Logout,"iesde/clients/logout"
|
14
|
-
autoload :Buscararquivo,"iesde/clients/buscararquivo"
|
15
28
|
end
|
16
29
|
|
17
30
|
module Error
|
18
|
-
autoload :ValidationError,'iesde/error/validation_error'
|
19
31
|
autoload :WSError,'iesde/error/ws_error'
|
20
32
|
end
|
21
33
|
|
22
34
|
module Model
|
23
|
-
autoload :
|
24
|
-
autoload :
|
25
|
-
autoload :
|
26
|
-
autoload :Aluno,"iesde/model/aluno"
|
35
|
+
autoload :Matricula, "iesde/model/matricula"
|
36
|
+
autoload :Disciplina, "iesde/model/disciplina"
|
37
|
+
autoload :Aula, "iesde/model/aula"
|
27
38
|
end
|
28
39
|
|
29
|
-
autoload :VERSION,
|
30
|
-
autoload :Config,"iesde/config"
|
31
|
-
autoload :
|
40
|
+
autoload :VERSION, "iesde/version"
|
41
|
+
autoload :Config, "iesde/config"
|
42
|
+
autoload :Linkable, "concerns/linkable"
|
43
|
+
autoload :Underscorable, "concerns/underscorable"
|
44
|
+
autoload :Stringable, "concerns/stringable"
|
32
45
|
|
33
46
|
mattr_accessor :config
|
34
47
|
|
@@ -36,5 +49,4 @@ module Iesde
|
|
36
49
|
self.config ||= Iesde::Config.new
|
37
50
|
yield(config) if block_given?
|
38
51
|
end
|
39
|
-
|
40
52
|
end
|
data/lib/iesde/api.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
module Iesde
|
2
|
+
class API
|
3
|
+
include ActionView::Helpers::SanitizeHelper
|
4
|
+
|
5
|
+
def initialize(o_que, format, opts = {})
|
6
|
+
tipo = tipo_requisicao(o_que)
|
7
|
+
config_api(opts)
|
8
|
+
|
9
|
+
params = config_params(opts)
|
10
|
+
request = Request.new(tipo, format, api_hash)
|
11
|
+
@response = request.execute(params)
|
12
|
+
end
|
13
|
+
|
14
|
+
def as_json
|
15
|
+
return JSON.parse(@response)
|
16
|
+
rescue JSON::ParserError
|
17
|
+
return @response
|
18
|
+
end
|
19
|
+
|
20
|
+
def status
|
21
|
+
as_json["status"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def tem_chave?(chave)
|
25
|
+
as_json.has_key?(chave)
|
26
|
+
end
|
27
|
+
|
28
|
+
def tem_matricula?
|
29
|
+
tem_chave?("MatriculaID")
|
30
|
+
end
|
31
|
+
|
32
|
+
def salvo_com_sucesso?
|
33
|
+
status == 1 && tem_matricula?
|
34
|
+
end
|
35
|
+
|
36
|
+
def msg
|
37
|
+
msg = (status() == false) ? as_json['mensagem'] : as_json['msg']
|
38
|
+
sanitize(msg)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.build_url(ask_for, format)
|
42
|
+
[ BASE, WEB_SERVICE, ask_for, 'format', FORMATS[format]].join('/')
|
43
|
+
end
|
44
|
+
|
45
|
+
def tipo_requisicao(o_que)
|
46
|
+
strings = {
|
47
|
+
cursos: 'getCursos',
|
48
|
+
matriculas: 'getMatriculas',
|
49
|
+
grades: 'getGrades',
|
50
|
+
questoes: 'getBancoQuestoes',
|
51
|
+
alternativas: 'getAlternativas',
|
52
|
+
disciplinas: 'getDisciplinas',
|
53
|
+
processos: 'getProcSeletivos',
|
54
|
+
notas: 'notas',
|
55
|
+
acessos: 'getAcessos',
|
56
|
+
professores: 'getProfessor',
|
57
|
+
cadastro_matricula: 'cadastro',
|
58
|
+
info_pessoa: 'getInfoPessoa',
|
59
|
+
alterar_matricula: 'situacao',
|
60
|
+
aulas: 'getAulas',
|
61
|
+
video_aula: 'getVideoAula',
|
62
|
+
pdf: 'getPdfsDisciplina',
|
63
|
+
get_pdf: 'getPdf'
|
64
|
+
}
|
65
|
+
|
66
|
+
strings.fetch(o_que)
|
67
|
+
rescue ArgumentError => e
|
68
|
+
raise 'Você precisa passar um tipo de requisição válido'
|
69
|
+
end
|
70
|
+
|
71
|
+
FORMATS = { json: "json", html: 'html', xml: 'xml' }
|
72
|
+
BASE = 'http://ead.portalava.com.br'
|
73
|
+
WEB_SERVICE = 'web_service'
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def config_params(opts)
|
78
|
+
opts.reject { |k,_| k == :config }
|
79
|
+
end
|
80
|
+
|
81
|
+
def config_api(opts = {})
|
82
|
+
unless opts.has_key?(:config)
|
83
|
+
ap '===> usando config original' if ENV['DEBUG']
|
84
|
+
opts.merge!(config: {})
|
85
|
+
end
|
86
|
+
|
87
|
+
# opts.merge!(config: {}) unless opts.has_key?(:config)
|
88
|
+
|
89
|
+
_config = opts[:config]
|
90
|
+
|
91
|
+
@user = _config[:user] || Iesde.config.user
|
92
|
+
@password = _config[:password] || Iesde.config.password
|
93
|
+
@ead_api_key = _config[:ead_api_key] || Iesde.config.ead_api_key
|
94
|
+
|
95
|
+
rescue NoMethodError => e
|
96
|
+
raise 'Você precisa configurar usuario e password'
|
97
|
+
end
|
98
|
+
|
99
|
+
def api_hash
|
100
|
+
{
|
101
|
+
config: {
|
102
|
+
user: @user,
|
103
|
+
password: @password,
|
104
|
+
ead_api_key: @ead_api_key
|
105
|
+
}
|
106
|
+
}
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|