visage-app 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/features/step_definitions/webrat_steps.rb +42 -0
- data/lib/visage-app/views/profile.haml +8 -4
- data/visage-app.gemspec +136 -0
- metadata +152 -36
- data/.gitignore +0 -11
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.1
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Commonly used webrat steps
|
2
|
+
# http://github.com/brynary/webrat
|
3
|
+
|
4
|
+
When /^I go to (.*)$/ do |path|
|
5
|
+
visit path
|
6
|
+
end
|
7
|
+
|
8
|
+
When /^I press "(.*)"$/ do |button|
|
9
|
+
click_button(button)
|
10
|
+
end
|
11
|
+
|
12
|
+
When /^I follow "(.*)"$/ do |link|
|
13
|
+
click_link(link)
|
14
|
+
end
|
15
|
+
|
16
|
+
When /^I fill in "(.*)" with "(.*)"$/ do |field, value|
|
17
|
+
fill_in(field, :with => value)
|
18
|
+
end
|
19
|
+
|
20
|
+
When /^I select "(.*)" from "(.*)"$/ do |value, field|
|
21
|
+
select(value, :from => field)
|
22
|
+
end
|
23
|
+
|
24
|
+
When /^I check "(.*)"$/ do |field|
|
25
|
+
check(field)
|
26
|
+
end
|
27
|
+
|
28
|
+
When /^I uncheck "(.*)"$/ do |field|
|
29
|
+
uncheck(field)
|
30
|
+
end
|
31
|
+
|
32
|
+
When /^I choose "(.*)"$/ do |field|
|
33
|
+
choose(field)
|
34
|
+
end
|
35
|
+
|
36
|
+
When /^I attach the file at "(.*)" to "(.*)" $/ do |path, field|
|
37
|
+
attach_file(field, path)
|
38
|
+
end
|
39
|
+
|
40
|
+
Then /^show me the page$/ do
|
41
|
+
save_and_open_page
|
42
|
+
end
|
@@ -4,13 +4,17 @@
|
|
4
4
|
%div#profile
|
5
5
|
%h2#profile_name= profile_name
|
6
6
|
- @profile.graphs.each do |graph|
|
7
|
-
|
7
|
+
id = URI.escape(graph.id)
|
8
|
+
host = URI.escape(graph.host)
|
9
|
+
plugin = URI.escape(graph.plugin)
|
10
|
+
instance = URI.escape(graph.instances.join(','))
|
11
|
+
%div{:id => id, :class => 'graph'}
|
8
12
|
%img{:src => link_to("/images/loader.gif")}
|
9
13
|
:javascript
|
10
14
|
window.addEvent('domready', function() {
|
11
|
-
var graph = new visageGraph('#{
|
12
|
-
pluginInstance: '#{
|
13
|
-
//name: '#{
|
15
|
+
var graph = new visageGraph('#{id}', '#{host}', '#{plugin}', {
|
16
|
+
pluginInstance: '#{instance}',
|
17
|
+
//name: '#{plugin} on #{host}',
|
14
18
|
start: '#{@start}',
|
15
19
|
finish: '#{@finish}',
|
16
20
|
#{ "baseurl: '" + ENV['BASE_URL'].gsub(/^\//, '') if ENV['BASE_URL'] }
|
data/visage-app.gemspec
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{visage-app}
|
8
|
+
s.version = "0.9.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Lindsay Holmwood"]
|
12
|
+
s.date = %q{2011-02-15}
|
13
|
+
s.default_executable = %q{visage-app}
|
14
|
+
s.description = %q{Visage is a web interface for viewing collectd statistics. It also provides a JSON interface onto collectd's RRD data, giving you an easy way to mash up the data.}
|
15
|
+
s.email = %q{lindsay@holmwood.id.au}
|
16
|
+
s.executables = ["visage-app"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README.md"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
"AUTHORS",
|
22
|
+
"Gemfile",
|
23
|
+
"LICENCE",
|
24
|
+
"README.md",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"bin/visage-app",
|
28
|
+
"features/builder.feature",
|
29
|
+
"features/cli.feature",
|
30
|
+
"features/data/config/with_no_profiles/.stub",
|
31
|
+
"features/json.feature",
|
32
|
+
"features/profiles.feature",
|
33
|
+
"features/step_definitions/form_steps.rb",
|
34
|
+
"features/step_definitions/json_steps.rb",
|
35
|
+
"features/step_definitions/result_steps.rb",
|
36
|
+
"features/step_definitions/site_steps.rb",
|
37
|
+
"features/step_definitions/visage_steps.rb",
|
38
|
+
"features/step_definitions/webrat_steps.rb",
|
39
|
+
"features/support/env.rb",
|
40
|
+
"lib/visage-app.rb",
|
41
|
+
"lib/visage-app/collectd/json.rb",
|
42
|
+
"lib/visage-app/collectd/profile.rb",
|
43
|
+
"lib/visage-app/collectd/rrds.rb",
|
44
|
+
"lib/visage-app/config.rb",
|
45
|
+
"lib/visage-app/config.ru",
|
46
|
+
"lib/visage-app/config/file.rb",
|
47
|
+
"lib/visage-app/graph.rb",
|
48
|
+
"lib/visage-app/helpers.rb",
|
49
|
+
"lib/visage-app/patches.rb",
|
50
|
+
"lib/visage-app/profile.rb",
|
51
|
+
"lib/visage-app/public/favicon.gif",
|
52
|
+
"lib/visage-app/public/images/active.png",
|
53
|
+
"lib/visage-app/public/images/add.png",
|
54
|
+
"lib/visage-app/public/images/hosts.png",
|
55
|
+
"lib/visage-app/public/images/loader.gif",
|
56
|
+
"lib/visage-app/public/images/metrics.png",
|
57
|
+
"lib/visage-app/public/images/search.png",
|
58
|
+
"lib/visage-app/public/javascripts/graph.js",
|
59
|
+
"lib/visage-app/public/javascripts/highcharts.js",
|
60
|
+
"lib/visage-app/public/javascripts/highcharts.src.js",
|
61
|
+
"lib/visage-app/public/javascripts/keyboard.js",
|
62
|
+
"lib/visage-app/public/javascripts/mootools-1.2.3-core.js",
|
63
|
+
"lib/visage-app/public/javascripts/mootools-1.2.5.1-more.js",
|
64
|
+
"lib/visage-app/public/stylesheets/screen.css",
|
65
|
+
"lib/visage-app/views/builder.haml",
|
66
|
+
"lib/visage-app/views/layout.haml",
|
67
|
+
"lib/visage-app/views/profile.haml",
|
68
|
+
"lib/visage-app/views/profiles.haml",
|
69
|
+
"man/visage-app.5",
|
70
|
+
"man/visage-app.5.ronn",
|
71
|
+
"visage-app.gemspec"
|
72
|
+
]
|
73
|
+
s.homepage = %q{http://visage-app.com/}
|
74
|
+
s.require_paths = ["lib"]
|
75
|
+
s.rubygems_version = %q{1.3.6}
|
76
|
+
s.summary = %q{a web (interface | service) for viewing collectd statistics}
|
77
|
+
|
78
|
+
if s.respond_to? :specification_version then
|
79
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
80
|
+
s.specification_version = 3
|
81
|
+
|
82
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
83
|
+
s.add_runtime_dependency(%q<haml>, [">= 0"])
|
84
|
+
s.add_runtime_dependency(%q<tilt>, [">= 0"])
|
85
|
+
s.add_runtime_dependency(%q<sinatra>, [">= 0"])
|
86
|
+
s.add_runtime_dependency(%q<errand>, [">= 0"])
|
87
|
+
s.add_runtime_dependency(%q<yajl-ruby>, [">= 0"])
|
88
|
+
s.add_development_dependency(%q<shotgun>, [">= 0"])
|
89
|
+
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
90
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
91
|
+
s.add_development_dependency(%q<cucumber>, [">= 0"])
|
92
|
+
s.add_development_dependency(%q<webrat>, [">= 0"])
|
93
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
94
|
+
s.add_runtime_dependency(%q<sinatra>, ["= 1.0"])
|
95
|
+
s.add_runtime_dependency(%q<tilt>, ["= 1.0.1"])
|
96
|
+
s.add_runtime_dependency(%q<haml>, ["= 3.0.13"])
|
97
|
+
s.add_runtime_dependency(%q<errand>, ["= 0.7.2"])
|
98
|
+
s.add_runtime_dependency(%q<yajl-ruby>, ["= 0.7.6"])
|
99
|
+
else
|
100
|
+
s.add_dependency(%q<haml>, [">= 0"])
|
101
|
+
s.add_dependency(%q<tilt>, [">= 0"])
|
102
|
+
s.add_dependency(%q<sinatra>, [">= 0"])
|
103
|
+
s.add_dependency(%q<errand>, [">= 0"])
|
104
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
105
|
+
s.add_dependency(%q<shotgun>, [">= 0"])
|
106
|
+
s.add_dependency(%q<rack-test>, [">= 0"])
|
107
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
108
|
+
s.add_dependency(%q<cucumber>, [">= 0"])
|
109
|
+
s.add_dependency(%q<webrat>, [">= 0"])
|
110
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
111
|
+
s.add_dependency(%q<sinatra>, ["= 1.0"])
|
112
|
+
s.add_dependency(%q<tilt>, ["= 1.0.1"])
|
113
|
+
s.add_dependency(%q<haml>, ["= 3.0.13"])
|
114
|
+
s.add_dependency(%q<errand>, ["= 0.7.2"])
|
115
|
+
s.add_dependency(%q<yajl-ruby>, ["= 0.7.6"])
|
116
|
+
end
|
117
|
+
else
|
118
|
+
s.add_dependency(%q<haml>, [">= 0"])
|
119
|
+
s.add_dependency(%q<tilt>, [">= 0"])
|
120
|
+
s.add_dependency(%q<sinatra>, [">= 0"])
|
121
|
+
s.add_dependency(%q<errand>, [">= 0"])
|
122
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
123
|
+
s.add_dependency(%q<shotgun>, [">= 0"])
|
124
|
+
s.add_dependency(%q<rack-test>, [">= 0"])
|
125
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
126
|
+
s.add_dependency(%q<cucumber>, [">= 0"])
|
127
|
+
s.add_dependency(%q<webrat>, [">= 0"])
|
128
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
129
|
+
s.add_dependency(%q<sinatra>, ["= 1.0"])
|
130
|
+
s.add_dependency(%q<tilt>, ["= 1.0.1"])
|
131
|
+
s.add_dependency(%q<haml>, ["= 3.0.13"])
|
132
|
+
s.add_dependency(%q<errand>, ["= 0.7.2"])
|
133
|
+
s.add_dependency(%q<yajl-ruby>, ["= 0.7.6"])
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visage-app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 59
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
8
|
+
- 1
|
9
|
+
version: 0.9.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Lindsay Holmwood
|
@@ -15,88 +14,210 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-02-
|
17
|
+
date: 2011-02-15 00:00:00 +11:00
|
19
18
|
default_executable: visage-app
|
20
19
|
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: haml
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
segments:
|
27
|
+
- 0
|
28
|
+
version: "0"
|
29
|
+
prerelease: false
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: tilt
|
34
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
segments:
|
39
|
+
- 0
|
40
|
+
version: "0"
|
41
|
+
prerelease: false
|
42
|
+
type: :runtime
|
43
|
+
version_requirements: *id002
|
21
44
|
- !ruby/object:Gem::Dependency
|
22
45
|
name: sinatra
|
46
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
version: "0"
|
23
53
|
prerelease: false
|
24
|
-
|
25
|
-
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: errand
|
58
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
prerelease: false
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id004
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: yajl-ruby
|
70
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
prerelease: false
|
78
|
+
type: :runtime
|
79
|
+
version_requirements: *id005
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: shotgun
|
82
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
prerelease: false
|
90
|
+
type: :development
|
91
|
+
version_requirements: *id006
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: rack-test
|
94
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
prerelease: false
|
102
|
+
type: :development
|
103
|
+
version_requirements: *id007
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: rspec
|
106
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
version: "0"
|
113
|
+
prerelease: false
|
114
|
+
type: :development
|
115
|
+
version_requirements: *id008
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: cucumber
|
118
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
prerelease: false
|
126
|
+
type: :development
|
127
|
+
version_requirements: *id009
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: webrat
|
130
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
segments:
|
135
|
+
- 0
|
136
|
+
version: "0"
|
137
|
+
prerelease: false
|
138
|
+
type: :development
|
139
|
+
version_requirements: *id010
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: jeweler
|
142
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
segments:
|
147
|
+
- 0
|
148
|
+
version: "0"
|
149
|
+
prerelease: false
|
150
|
+
type: :development
|
151
|
+
version_requirements: *id011
|
152
|
+
- !ruby/object:Gem::Dependency
|
153
|
+
name: sinatra
|
154
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
26
155
|
requirements:
|
27
156
|
- - "="
|
28
157
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 15
|
30
158
|
segments:
|
31
159
|
- 1
|
32
160
|
- 0
|
33
161
|
version: "1.0"
|
162
|
+
prerelease: false
|
34
163
|
type: :runtime
|
35
|
-
version_requirements: *
|
164
|
+
version_requirements: *id012
|
36
165
|
- !ruby/object:Gem::Dependency
|
37
166
|
name: tilt
|
38
|
-
|
39
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
167
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
41
168
|
requirements:
|
42
169
|
- - "="
|
43
170
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 21
|
45
171
|
segments:
|
46
172
|
- 1
|
47
173
|
- 0
|
48
174
|
- 1
|
49
175
|
version: 1.0.1
|
176
|
+
prerelease: false
|
50
177
|
type: :runtime
|
51
|
-
version_requirements: *
|
178
|
+
version_requirements: *id013
|
52
179
|
- !ruby/object:Gem::Dependency
|
53
180
|
name: haml
|
54
|
-
|
55
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
-
none: false
|
181
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
57
182
|
requirements:
|
58
183
|
- - "="
|
59
184
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 29
|
61
185
|
segments:
|
62
186
|
- 3
|
63
187
|
- 0
|
64
188
|
- 13
|
65
189
|
version: 3.0.13
|
190
|
+
prerelease: false
|
66
191
|
type: :runtime
|
67
|
-
version_requirements: *
|
192
|
+
version_requirements: *id014
|
68
193
|
- !ruby/object:Gem::Dependency
|
69
194
|
name: errand
|
70
|
-
|
71
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
195
|
+
requirement: &id015 !ruby/object:Gem::Requirement
|
73
196
|
requirements:
|
74
197
|
- - "="
|
75
198
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 7
|
77
199
|
segments:
|
78
200
|
- 0
|
79
201
|
- 7
|
80
202
|
- 2
|
81
203
|
version: 0.7.2
|
204
|
+
prerelease: false
|
82
205
|
type: :runtime
|
83
|
-
version_requirements: *
|
206
|
+
version_requirements: *id015
|
84
207
|
- !ruby/object:Gem::Dependency
|
85
208
|
name: yajl-ruby
|
86
|
-
|
87
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
209
|
+
requirement: &id016 !ruby/object:Gem::Requirement
|
89
210
|
requirements:
|
90
211
|
- - "="
|
91
212
|
- !ruby/object:Gem::Version
|
92
|
-
hash: 15
|
93
213
|
segments:
|
94
214
|
- 0
|
95
215
|
- 7
|
96
216
|
- 6
|
97
217
|
version: 0.7.6
|
218
|
+
prerelease: false
|
98
219
|
type: :runtime
|
99
|
-
version_requirements: *
|
220
|
+
version_requirements: *id016
|
100
221
|
description: Visage is a web interface for viewing collectd statistics. It also provides a JSON interface onto collectd's RRD data, giving you an easy way to mash up the data.
|
101
222
|
email: lindsay@holmwood.id.au
|
102
223
|
executables:
|
@@ -106,7 +227,6 @@ extensions: []
|
|
106
227
|
extra_rdoc_files:
|
107
228
|
- README.md
|
108
229
|
files:
|
109
|
-
- .gitignore
|
110
230
|
- AUTHORS
|
111
231
|
- Gemfile
|
112
232
|
- LICENCE
|
@@ -163,32 +283,28 @@ homepage: http://visage-app.com/
|
|
163
283
|
licenses: []
|
164
284
|
|
165
285
|
post_install_message:
|
166
|
-
rdoc_options:
|
167
|
-
|
286
|
+
rdoc_options: []
|
287
|
+
|
168
288
|
require_paths:
|
169
289
|
- lib
|
170
290
|
required_ruby_version: !ruby/object:Gem::Requirement
|
171
|
-
none: false
|
172
291
|
requirements:
|
173
292
|
- - ">="
|
174
293
|
- !ruby/object:Gem::Version
|
175
|
-
hash: 3
|
176
294
|
segments:
|
177
295
|
- 0
|
178
296
|
version: "0"
|
179
297
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
|
-
none: false
|
181
298
|
requirements:
|
182
299
|
- - ">="
|
183
300
|
- !ruby/object:Gem::Version
|
184
|
-
hash: 3
|
185
301
|
segments:
|
186
302
|
- 0
|
187
303
|
version: "0"
|
188
304
|
requirements: []
|
189
305
|
|
190
306
|
rubyforge_project:
|
191
|
-
rubygems_version: 1.3.
|
307
|
+
rubygems_version: 1.3.6
|
192
308
|
signing_key:
|
193
309
|
specification_version: 3
|
194
310
|
summary: a web (interface | service) for viewing collectd statistics
|