db_meta 0.2.7 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -0
  3. data/.travis.yml +33 -10
  4. data/.travis/oracle/download.sh +14 -0
  5. data/.travis/oracle/install.sh +32 -0
  6. data/.travis/setup_accounts.sh +8 -0
  7. data/CHANGELOG.md +62 -24
  8. data/Gemfile +1 -1
  9. data/Gemfile.lock +48 -19
  10. data/README.md +2 -1
  11. data/Rakefile +2 -1
  12. data/db_meta.gemspec +17 -16
  13. data/docker/README.md +42 -0
  14. data/lib/db_meta.rb +10 -14
  15. data/lib/db_meta/abstract.rb +11 -21
  16. data/lib/db_meta/constant.rb +23 -25
  17. data/lib/db_meta/logger.rb +4 -7
  18. data/lib/db_meta/oracle/base.rb +9 -11
  19. data/lib/db_meta/oracle/connection.rb +3 -4
  20. data/lib/db_meta/oracle/helper.rb +7 -9
  21. data/lib/db_meta/oracle/objects.rb +45 -45
  22. data/lib/db_meta/oracle/oracle.rb +34 -30
  23. data/lib/db_meta/oracle/types/column.rb +15 -17
  24. data/lib/db_meta/oracle/types/comment.rb +2 -5
  25. data/lib/db_meta/oracle/types/constraint.rb +29 -32
  26. data/lib/db_meta/oracle/types/constraint_collection.rb +4 -6
  27. data/lib/db_meta/oracle/types/database_link.rb +4 -5
  28. data/lib/db_meta/oracle/types/function.rb +4 -5
  29. data/lib/db_meta/oracle/types/grant.rb +9 -10
  30. data/lib/db_meta/oracle/types/grant_collection.rb +4 -6
  31. data/lib/db_meta/oracle/types/index.rb +14 -8
  32. data/lib/db_meta/oracle/types/job.rb +2 -3
  33. data/lib/db_meta/oracle/types/lob.rb +2 -3
  34. data/lib/db_meta/oracle/types/materialized_view.rb +15 -18
  35. data/lib/db_meta/oracle/types/package.rb +7 -8
  36. data/lib/db_meta/oracle/types/package_body.rb +2 -3
  37. data/lib/db_meta/oracle/types/procedure.rb +4 -5
  38. data/lib/db_meta/oracle/types/queue.rb +24 -26
  39. data/lib/db_meta/oracle/types/sequence.rb +7 -8
  40. data/lib/db_meta/oracle/types/synonym.rb +6 -7
  41. data/lib/db_meta/oracle/types/synonym_collection.rb +4 -6
  42. data/lib/db_meta/oracle/types/table.rb +32 -35
  43. data/lib/db_meta/oracle/types/table_data_collection.rb +24 -19
  44. data/lib/db_meta/oracle/types/trigger.rb +12 -14
  45. data/lib/db_meta/oracle/types/type.rb +6 -7
  46. data/lib/db_meta/oracle/types/type_body.rb +2 -3
  47. data/lib/db_meta/oracle/types/view.rb +12 -14
  48. data/lib/db_meta/version.rb +1 -1
  49. data/todo.txt +1 -0
  50. metadata +33 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 96c4e6b607426ad5fce51d2c2a56c86b20ec8c52
4
- data.tar.gz: 954e65f70173e1e407b399361ca3b699ccf33565
2
+ SHA256:
3
+ metadata.gz: 3bb752e54793946b7bcd874d25439d559f4d400e7f5c2b30da635513ba05c2c4
4
+ data.tar.gz: fea95107d75504c47ec7df81aad4ea87c7eb919d99263e4acaf36fafedbaf197
5
5
  SHA512:
6
- metadata.gz: 7793e2ab54ac3da1dea4486dc297bc1214c83916243a8014a3580ff2c22d00f12254fe96592c609c4ea7436fe98f35fadf6021e5553097e39e1ed62406a29c2b
7
- data.tar.gz: 384bc9781a0dfab55a26252bf7263a0f7edd4ccf07adf11454eee62c0e4c75a59fdf5e81ca941eed07586992a8b1c45909d6038c843dd8e1b4450ef76a9a2adc
6
+ metadata.gz: 7282a69c1008c4eecb4975edd5d7699e0c5a2e8246ef70a8b98ad8b0bb424a0807657df876f20d406a53e106e3bc42ac2db492b7530c4d5edc22ef23f22341e4
7
+ data.tar.gz: 66e54866798847a1de4f46741ececf9cf797fdaecb9ee46ce2fd65b92452c1e019e1f9c9858c21eb0515ad733d3bd2282240cfc69d3d54206f020d2ca9b80ff6
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.6.6
data/.travis.yml CHANGED
@@ -1,12 +1,35 @@
1
+ sudo: required
2
+
3
+ env:
4
+ global:
5
+ - ORACLE_COOKIE=sqldev
6
+ - ORACLE_FILE=oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
7
+ - ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
8
+ - NLS_LANG=AMERICAN_AMERICA.AL32UTF8
9
+ - ORACLE_BASE=/u01/app/oracle
10
+ - LD_LIBRARY_PATH=$ORACLE_HOME/lib
11
+ - PATH=$PATH:$ORACLE_HOME/jdbc/lib
12
+ - DATABASE_VERSION=11.2.0.2
13
+ - ORACLE_SID=XE
14
+ - DATABASE_NAME=XE
15
+ - ORA_SDTZ='Europe/London' # Needed as a client parameter
16
+ - TZ='Europe/London' # Needed as a DB Server parameter
17
+
18
+ before_install:
19
+ - chmod +x .travis/oracle/download.sh
20
+ - chmod +x .travis/oracle/install.sh
21
+ - chmod +x .travis/setup_accounts.sh
22
+ - gem install bundler --version '~> 2.1.4'
23
+
24
+ install:
25
+ - .travis/oracle/download.sh
26
+ - .travis/oracle/install.sh
27
+ - .travis/setup_accounts.sh
28
+ - bundle install
29
+
1
30
  language: ruby
2
- os:
3
- - linux
4
- - osx
5
- osx_image: xcode9.1
6
31
  rvm:
7
- - 2.4.2
8
- - 2.4.1
9
- - 2.3.1
10
- - 2.1.5
11
- before_install:
12
- - gem install bundler --version '~> 1.16.0'
32
+ - 3.0.0
33
+ - 2.7.2
34
+ - 2.6.6
35
+ - 2.5.8
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+
3
+ cd "$(dirname "$(readlink -f "$0")")"
4
+
5
+ deb_file=oracle-xe_11.2.0-1.0_amd64.deb
6
+
7
+ git clone https://github.com/wnameless/docker-oracle-xe-11g.git
8
+
9
+ cd docker-oracle-xe-11g/assets &&
10
+ cat "${deb_file}aa" "${deb_file}ab" "${deb_file}ac" > "${deb_file}"
11
+
12
+ pwd
13
+
14
+ ls -lAh "${deb_file}"
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+
3
+ [ -n "$ORACLE_FILE" ] || { echo "Missing ORACLE_FILE environment variable!"; exit 1; }
4
+ [ -n "$ORACLE_HOME" ] || { echo "Missing ORACLE_HOME environment variable!"; exit 1; }
5
+
6
+ cd "$(dirname "$(readlink -f "$0")")"
7
+
8
+ ORACLE_DEB=docker-oracle-xe-11g/assets/oracle-xe_11.2.0-1.0_amd64.deb
9
+
10
+ sudo apt-get -qq update
11
+ sudo apt-get --no-install-recommends -qq install bc libaio1
12
+
13
+ df -B1 /dev/shm | awk 'END { if ($1 != "shmfs" && $1 != "tmpfs" || $2 < 2147483648) exit 1 }' ||
14
+ ( sudo rm -r /dev/shm && sudo mkdir /dev/shm && sudo mount -t tmpfs shmfs -o size=2G /dev/shm )
15
+
16
+ test -f /sbin/chkconfig ||
17
+ ( echo '#!/bin/sh' | sudo tee /sbin/chkconfig > /dev/null && sudo chmod u+x /sbin/chkconfig )
18
+
19
+ test -d /var/lock/subsys || sudo mkdir /var/lock/subsys
20
+
21
+ sudo dpkg -i "${ORACLE_DEB}"
22
+
23
+ echo 'OS_AUTHENT_PREFIX=""' | sudo tee -a "$ORACLE_HOME/config/scripts/init.ora" > /dev/null
24
+ echo 'disk_asynch_io=false' | sudo tee -a "$ORACLE_HOME/config/scripts/init.ora" > /dev/null
25
+ sudo usermod -aG dba $USER
26
+
27
+ ( echo ; echo ; echo travis ; echo travis ; echo n ) | sudo AWK='/usr/bin/awk' /etc/init.d/oracle-xe configure
28
+
29
+ "$ORACLE_HOME/bin/sqlplus" -L -S / AS SYSDBA <<SQL
30
+ CREATE USER $USER IDENTIFIED EXTERNALLY;
31
+ GRANT CONNECT, RESOURCE TO $USER;
32
+ SQL
@@ -0,0 +1,8 @@
1
+ #!/bin/bash
2
+
3
+ set -ev
4
+
5
+ "$ORACLE_HOME/bin/sqlplus" -L -S / AS SYSDBA <<SQL
6
+ @@spec/support/unlock_and_setup_hr_user.sql
7
+ exit
8
+ SQL
data/CHANGELOG.md CHANGED
@@ -1,43 +1,81 @@
1
- ## 0.2.7 / 2018-02-27
1
+ ## [0.5.0] - 2021-02-22
2
2
 
3
- * Update ruby-oci8 gem to 2.2.5.1
4
- * Update rake gem to 12.3.0
3
+ ### Changed
4
+ - Update gem dependencies
5
+ - Number of thread settings
6
+ - Ruby style guide applied through standradrb gem
5
7
 
6
- ## 0.2.6 / 2018-02-16
8
+ ## [0.4.0] - 2020-02-28
7
9
 
8
- * Edit: Typo synonym
9
- * Edit: Used force => true when deleting a queue table
10
+ ### Changed
11
+ - Update of gem dependencies
10
12
 
11
- ## 0.2.5 / 2017-11-24
13
+ ## [0.3.1] - 2019-06-19
12
14
 
13
- * Edit: Typo max_retires => max_retries
15
+ ### Changed
16
+ - Extract table data when primary key spans over multiple columns
17
+ - Update bundler
14
18
 
15
- ## 0.2.4 / 2017-11-24
19
+ ## [0.3.0] - 2018-08-17
16
20
 
17
- * Edit: sort order: ENQUEUE_TIME => ENQ_TIME
21
+ ### Changed
22
+ - Update license
18
23
 
19
- ## 0.2.2 / 2017-11-15
24
+ ## [0.2.7] - 2018-08-17
20
25
 
21
- * Edit: create or replace for functions and procedures
26
+ ### Added
27
+ - Function based indexes
22
28
 
23
- ## 0.2.1 / 2017-11-07
29
+ ## [0.2.7] - 2018-02-27
24
30
 
25
- * Edit: Update dependencies rspec, bundler, ruby-oci8
26
- * Edit: Travis settings
31
+ ### Changed
32
+ * ruby-oci8 gem to 2.2.5.1
33
+ * rake gem to 12.3.0
27
34
 
28
- ## 0.1.3 / 2017-08-29
35
+ ## [0.2.6] - 2018-02-16
29
36
 
30
- * very early version where most of the core oracle types are supported
31
- * ability to extract core data
37
+ ### Changed
38
+ - Typo synonym
39
+ - Used force => true when deleting a queue table
32
40
 
33
- ## 0.1.2 / 2017-08-03
41
+ ## [0.2.5] - 2017-11-24
34
42
 
35
- * another very early version
43
+ ### Changed
44
+ - Typo max_retires => max_retries
36
45
 
37
- ## 0.1.1 / 2016-05-10
46
+ ## [0.2.4] - 2017-11-24
38
47
 
39
- * very early development version
48
+ ### Changed
49
+ - Sort order: ENQUEUE_TIME => ENQ_TIME
40
50
 
41
- ## 0.1.0 / 2016-05-10
51
+ ## [0.2.2] - 2017-11-15
42
52
 
43
- * initial setup
53
+ ### Changed
54
+ - create or replace for functions and procedures
55
+
56
+ ## [0.2.1] - 2017-11-07
57
+
58
+ ### Changed
59
+ - Update dependencies rspec, bundler, ruby-oci8
60
+ - Travis settings
61
+
62
+ ## [0.1.3] - 2017-08-29
63
+
64
+ ### Added
65
+ - very early version where most of the core oracle types are supported
66
+ - ability to extract core data
67
+
68
+ ## [0.1.2] - 2017-08-03
69
+
70
+ ### Added
71
+ - another very early version
72
+
73
+ ## [0.1.1] - 2016-05-10
74
+
75
+ ### Added
76
+ - very early development version
77
+
78
+ ## [0.1.0] - 2016-05-10
79
+
80
+ ### Added
81
+ - initial setup
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in db_meta.gemspec
4
4
  gemspec
data/Gemfile.lock CHANGED
@@ -1,37 +1,66 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- db_meta (0.2.7)
4
+ db_meta (0.5.0)
5
5
  ruby-oci8 (~> 2.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- diff-lcs (1.3)
11
- rake (12.3.0)
12
- rspec (3.7.0)
13
- rspec-core (~> 3.7.0)
14
- rspec-expectations (~> 3.7.0)
15
- rspec-mocks (~> 3.7.0)
16
- rspec-core (3.7.0)
17
- rspec-support (~> 3.7.0)
18
- rspec-expectations (3.7.0)
10
+ ast (2.4.2)
11
+ diff-lcs (1.4.4)
12
+ parallel (1.20.1)
13
+ parser (3.0.0.0)
14
+ ast (~> 2.4.1)
15
+ rainbow (3.0.0)
16
+ rake (13.0.3)
17
+ regexp_parser (2.0.3)
18
+ rexml (3.2.4)
19
+ rspec (3.10.0)
20
+ rspec-core (~> 3.10.0)
21
+ rspec-expectations (~> 3.10.0)
22
+ rspec-mocks (~> 3.10.0)
23
+ rspec-core (3.10.1)
24
+ rspec-support (~> 3.10.0)
25
+ rspec-expectations (3.10.1)
19
26
  diff-lcs (>= 1.2.0, < 2.0)
20
- rspec-support (~> 3.7.0)
21
- rspec-mocks (3.7.0)
27
+ rspec-support (~> 3.10.0)
28
+ rspec-mocks (3.10.2)
22
29
  diff-lcs (>= 1.2.0, < 2.0)
23
- rspec-support (~> 3.7.0)
24
- rspec-support (3.7.0)
25
- ruby-oci8 (2.2.5.1)
30
+ rspec-support (~> 3.10.0)
31
+ rspec-support (3.10.2)
32
+ rubocop (1.10.0)
33
+ parallel (~> 1.10)
34
+ parser (>= 3.0.0.0)
35
+ rainbow (>= 2.2.2, < 4.0)
36
+ regexp_parser (>= 1.8, < 3.0)
37
+ rexml
38
+ rubocop-ast (>= 1.2.0, < 2.0)
39
+ ruby-progressbar (~> 1.7)
40
+ unicode-display_width (>= 1.4.0, < 3.0)
41
+ rubocop-ast (1.4.1)
42
+ parser (>= 2.7.1.5)
43
+ rubocop-performance (1.9.2)
44
+ rubocop (>= 0.90.0, < 2.0)
45
+ rubocop-ast (>= 0.4.0)
46
+ ruby-oci8 (2.2.9)
47
+ ruby-progressbar (1.11.0)
48
+ standard (0.13.0)
49
+ rubocop (= 1.10.0)
50
+ rubocop-performance (= 1.9.2)
51
+ standardrb (1.0.0)
52
+ standard
53
+ unicode-display_width (2.0.0)
26
54
 
27
55
  PLATFORMS
28
56
  ruby
29
57
 
30
58
  DEPENDENCIES
31
- bundler (~> 1.16)
59
+ bundler (~> 2.1)
32
60
  db_meta!
33
- rake (~> 12.3)
34
- rspec (~> 3.7)
61
+ rake (~> 13.0)
62
+ rspec (~> 3.10)
63
+ standardrb (~> 1.0)
35
64
 
36
65
  BUNDLED WITH
37
- 1.16.1
66
+ 2.1.4
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/db_meta.svg)](https://badge.fury.io/rb/db_meta)
2
- [![Dependency Status](https://gemnasium.com/badges/github.com/thomis/db_meta.svg)](https://gemnasium.com/github.com/thomis/db_meta)
2
+ [![Build Status](https://travis-ci.org/thomis/db_meta.svg?branch=master)](https://travis-ci.org/thomis/db_meta)
3
3
 
4
4
  # Welcome to db_meta
5
5
  Database meta and core data extraction.
@@ -41,6 +41,7 @@ meta.extract
41
41
  - Synonym
42
42
  - Database Link
43
43
  - Queue
44
+ - Function based Indexes
44
45
  - more to come...
45
46
 
46
47
  ## Planned Features
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require "standard/rake"
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
- task :default => :spec
7
+ task default: [:spec, :standard]
data/db_meta.gemspec CHANGED
@@ -1,26 +1,27 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'db_meta/version'
3
+ require "db_meta/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "db_meta"
8
- spec.version = DbMeta::VERSION
9
- spec.authors = ["Thomi"]
10
- spec.email = ["thomas.steiner@ikey.ch"]
6
+ spec.name = "db_meta"
7
+ spec.version = DbMeta::VERSION
8
+ spec.license = "Apache-2.0"
9
+ spec.authors = ["Thomi"]
10
+ spec.email = ["thomas.steiner@ikey.ch"]
11
11
 
12
- spec.summary = %q{Database meta and core data extraction}
13
- spec.description = %q{Database meta and core data extraction.}
14
- spec.homepage = "https://github.com/thomis/db_meta"
12
+ spec.summary = "Database meta and core data extraction"
13
+ spec.description = "Database meta and core data extraction."
14
+ spec.homepage = "https://github.com/thomis/db_meta"
15
15
 
16
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
- spec.bindir = "exe"
18
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.16"
22
- spec.add_development_dependency "rake", "~> 12.3"
23
- spec.add_development_dependency "rspec", "~> 3.7"
21
+ spec.add_development_dependency "bundler", "~> 2.1"
22
+ spec.add_development_dependency "rake", "~> 13.0"
23
+ spec.add_development_dependency "rspec", "~> 3.10"
24
+ spec.add_development_dependency "standardrb", "~> 1.0"
24
25
 
25
26
  spec.add_dependency "ruby-oci8", "~> 2.2"
26
27
  end
data/docker/README.md ADDED
@@ -0,0 +1,42 @@
1
+ Deliver Oracle Database 18c Express Edition in Containers
2
+ Read here https://blogs.oracle.com/oraclemagazine/deliver-oracle-database-18c-express-edition-in-containers
3
+
4
+ -- clone repo
5
+ git clone https://github.com/oracle/docker-images.git
6
+
7
+ -- download installation binary
8
+ Download one zip file for xe edition from here: https://www.oracle.com/technical-resources/
9
+ Copy zip file to docker-images/OracleDatabase/SingleInstance/dockerfiles/18.4.0 folder
10
+
11
+ -- build image
12
+ ./buildDockerImage.sh -v 18.4.0 -x
13
+
14
+ -- create a container
15
+ docker run --name dbmeta \
16
+ -d \
17
+ -p 51521:1521 \
18
+ -p 55500:5500 \
19
+ -e ORACLE_PWD=secure \
20
+ -e ORACLE_CHARACTERSET=AL32UTF8 \
21
+ oracle/database:18.4.0-xe
22
+
23
+
24
+ -- connect as sysdba
25
+ sqlplus sys/secure@dbmeta as sysdba
26
+
27
+ -- create user guest
28
+ CREATE USER guest identified by guest;
29
+
30
+ ALTER USER guest quota unlimited on users;
31
+
32
+ -- grant privs
33
+ GRANT create session TO guest;
34
+ GRANT create table TO guest;
35
+ GRANT create view TO guest;
36
+ GRANT create any trigger TO guest;
37
+ GRANT create any procedure TO guest;
38
+ GRANT create sequence TO guest;
39
+ GRANT create synonym TO guest;
40
+
41
+
42
+ Status : Failure -Test failed: no ocijdbc19 in java.library.path: [/Users/steinth6/Library/Java/Extensions, /Library/Java/Extensions, /Network/Library/Java/Extensions, /System/Library/Java/Extensions, /usr/lib/java, .]
data/lib/db_meta.rb CHANGED
@@ -1,25 +1,23 @@
1
- require_relative 'db_meta/version'
2
- require_relative 'db_meta/constant'
3
- require_relative 'db_meta/logger'
1
+ require_relative "db_meta/version"
2
+ require_relative "db_meta/constant"
3
+ require_relative "db_meta/logger"
4
4
 
5
- require_relative 'db_meta/abstract'
6
- require_relative 'db_meta/oracle/oracle'
5
+ require_relative "db_meta/abstract"
6
+ require_relative "db_meta/oracle/oracle"
7
7
 
8
- Log = Logger.new(STDOUT)
8
+ Log = Logger.new($stdout)
9
9
 
10
10
  module DbMeta
11
-
12
11
  DATABASE_TYPES = [:oracle]
13
12
 
14
13
  class DbMeta
15
-
16
- def initialize(args={})
14
+ def initialize(args = {})
17
15
  @database_type = args[:database_type] || DATABASE_TYPES[0]
18
- raise "allowed database types are [#{DATABASE_TYPES.join(', ')}], but provided was [#{@database_type}]" unless DATABASE_TYPES.include?(@database_type)
16
+ raise "allowed database types are [#{DATABASE_TYPES.join(", ")}], but provided was [#{@database_type}]" unless DATABASE_TYPES.include?(@database_type)
19
17
  @abstract = Abstract.from_type(@database_type, args)
20
18
  end
21
19
 
22
- def fetch(args={})
20
+ def fetch(args = {})
23
21
  Log.info("Fetching...")
24
22
  @abstract.fetch(args)
25
23
  Log.info("Fetch completed")
@@ -27,14 +25,12 @@ module DbMeta
27
25
  Log.error(e.to_s)
28
26
  end
29
27
 
30
- def extract(args={})
28
+ def extract(args = {})
31
29
  Log.info("Extracting...")
32
30
  @abstract.extract(args)
33
31
  Log.info("Extraction completed")
34
32
  rescue => e
35
33
  Log.error(e.to_s)
36
34
  end
37
-
38
35
  end
39
-
40
36
  end