gon-6.3.2/0000755000004100000410000000000013603457635012351 5ustar www-datawww-datagon-6.3.2/.travis.yml0000644000004100000410000000021313603457635014456 0ustar www-datawww-datalanguage: ruby sudo: false env: - "RABL_GEM=rabl" - "RABL_GEM=rabl-rails" rvm: - 2.2.10 - 2.3.7 - 2.4.4 - 2.5.1 - ruby-head gon-6.3.2/README.md0000644000004100000410000001602013603457635013627 0ustar www-datawww-data# Gon gem — get your Rails variables in your js [![Join the chat at https://gitter.im/gazay/gon](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gazay/gon?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) ![Gon. You should try this. If you look closer - you will see an elephant.](https://github.com/gazay/gon/raw/master/doc/logo_small.png) [![Build Status](https://travis-ci.org/gazay/gon.svg?branch=master)](https://travis-ci.org/gazay/gon) [![CodeClimate](https://codeclimate.com/github/gazay/gon/badges/gpa.svg)](https://codeclimate.com/github/gazay/gon) If you need to send some data to your js files and you don't want to do this with long way through views and parsing - use this force! Now you can easily renew data in your variables through ajax with [gon.watch](https://github.com/gazay/gon/wiki/Usage-gon-watch)! With [Jbuilder](https://github.com/rails/jbuilder), [Rabl](https://github.com/nesquena/rabl), and [Rabl-Rails](https://github.com/ccocchi/rabl-rails) support! For Sinatra available [gon-sinatra](https://github.com/gazay/gon-sinatra). For .Net MVC available port [NGon](https://github.com/brooklynDev/NGon). For elixir Phoenix available [PhoenixGon](https://github.com/khusnetdinov/phoenix_gon). Sponsored by Evil Martians ## An example of typical use ### Very good and detailed example and reasons to use is considered in [railscast](http://railscasts.com/episodes/324-passing-data-to-javascript) by Ryan Bates When you need to send some start data from your controller to your js you might be doing something like this: 1. Write this data in controller(presenter/model) to some variable 2. In view for this action you put this variable to some objects by data attributes, or write js right in view 3. Then there can be two ways in js: + if you previously wrote data in data attributes - you should parse this attributes and write data to some js variable. + if you wrote js right in view (many frontenders would shame you for that) - you just use data from this js - OK. 4. You can use your data in your js And every time when you need to send some data from action to js you do this. With gon you configure it firstly - just put in layout one tag, and add gem line to your Gemfile and do the following: 1. Write variables by ``` ruby gon.variable_name = variable_value # or new syntax gon.push({ :user_id => 1, :user_role => "admin" }) gon.push(any_object) # any_object with respond_to? :each_pair ``` 2. In your js you get this by ``` js gon.variable_name ``` 3. profit? With the `gon.watch` feature you can easily renew data in gon variables! Simply call `gon.watch` from your js file. It's super useful in modern web applications! ## Usage ### More details about configuration and usage you can find in [gon wiki](https://github.com/gazay/gon/wiki) `app/views/layouts/application.html.erb` ``` erb some title <%= Gon::Base.render_data %> ... ``` For rails 3: ``` erb <%= include_gon %> ... ``` You can pass some [options](https://github.com/gazay/gon/wiki/Options) to `render_data` method. You put something like this in the action of your controller: ``` ruby @your_int = 123 @your_array = [1,2] @your_hash = {'a' => 1, 'b' => 2} gon.your_int = @your_int gon.your_other_int = 345 + gon.your_int gon.your_array = @your_array gon.your_array << gon.your_int gon.your_hash = @your_hash gon.all_variables # > {:your_int => 123, :your_other_int => 468, :your_array => [1, 2, 123], :your_hash => {'a' => 1, 'b' => 2}} gon.your_array # > [1, 2, 123] # gon.clear # gon.all_variables now is {} ``` Access the variables from your JavaScript file: ``` js alert(gon.your_int) alert(gon.your_other_int) alert(gon.your_array) alert(gon.your_hash) ``` ### AMD compatible version: `include_gon_amd` If your site uses AMD modules you can use the `include_gon_amd` helper to include the variables and watch function as a module. Options are mostly the same as for `include_gon`, except for `namespace_check`, which does nothing and `namespace`, which is used as the name of the defined module. The end result will look somewhat like the following: ```js define('yourNameSpace', [], function() { var gon = {}; gon.yourVariable = yourValue; // etc... return gon; }); ``` A (very) simplified usage example: `app/views/layouts/application.html.erb` ```ruby include_gon_amd namespace: 'data' ``` `Some JavaScript module` ```js define(['data'], function(data) { alert(data.myVariable); }); ``` ## gon.watch - renew your data easily! You can use gon for renewing your data without reloading pages and writing long js functions! It's really great for some live values. Supports `gon.watch.rabl` and `gon.watch.jbuilder` usage. [Instruction](https://github.com/gazay/gon/wiki/Usage-gon-watch) for usage gon.watch. ## Usage with Rabl You can write your variables assign logic to templates with [Rabl](https://github.com/nesquena/rabl). The way of writing Rabl templates is very clearly described in their repo. Profit of using Rabl with gon: 1. You can clean your controllers now! 2. Work with database objects and collections clearly and easyly 3. All power of Rabl 4. You can still be lazy and don't use common way to transfer data in js 5. And so on [Instruction](https://github.com/gazay/gon/wiki/Usage-with-rabl) for usage gon with Rabl. ## Usage with Rabl-Rails `gon.rabl` works with [rabl-rails](https://github.com/ccocchi/rabl-rails). Learn to write RABL the rabl-rails way [here](https://github.com/ccocchi/rabl-rails). Add gon and rabl-rails to your environment: ```ruby gem 'gon' gem 'rabl-rails' ``` Define a rabl template using rabl-rails syntax: ```rabl #app/views/users/show.rabl object :@user attributes :id, :name, :email, :location ``` Call gon.rabl in your controller ```ruby #app/controllers/users_controller.rb def show @user = User.find(params[:id]) gon.rabl end ``` ## Usage with Jbuilder Use gon with [Jbuilder](https://github.com/rails/jbuilder) as with [Rabl](https://guthub.com/nesquena/rabl): [Instruction](https://github.com/gazay/gon/wiki/Usage-with-jbuilder) for usage gon with Jbuilder. ## gon.global You can use gon for sending your data to js from anywhere! It's really great for some init data. [Instruction](https://github.com/gazay/gon/wiki/Usage-gon-global) for usage gon.global. ## Speed up Gon You can use any [JSON Engine](https://github.com/intridea/multi_json#supported-json-engines) you want. Gon uses `MultiJson` with autodetect mode, so all you need is just require your JSON library. ## Contributors * @gazay * @takiy33 Special thanks to @brainopia, @kossnocorp and @ai. ## License The MIT License ## Security Contact To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. gon-6.3.2/spec/0000755000004100000410000000000013603457635013303 5ustar www-datawww-datagon-6.3.2/spec/gon/0000755000004100000410000000000013603457635014066 5ustar www-datawww-datagon-6.3.2/spec/gon/templates_spec.rb0000644000004100000410000000221013603457635017416 0ustar www-datawww-datadescribe Gon do describe '.template_path' do context 'template is specified' do it 'add the extension if not included in the template name' do expect(Gon::EnvFinder.send(:template_path, { :template => 'spec/test_data/sample' }, 'jbuilder')).to eql('spec/test_data/sample.jbuilder') end it 'return the specified template' do expect(Gon::EnvFinder.send(:template_path, { :template => 'spec/test_data/sample.jbuilder' }, 'jbuilder')).to eql('spec/test_data/sample.jbuilder') end end context 'template is not specified' do before do Gon.clear controller.instance_variable_set('@objects', objects) controller.action_name = 'show' end let(:controller) { ActionController::Base.new } let(:objects) { [1, 2] } context 'the action doesn as a template at a different format' do it 'return the same template as the action with rabl extension' do expect(Gon::EnvFinder.send(:template_path, { :controller => controller }, 'jbuilder')).to eql('app/views/action_controller/base/show.json.jbuilder') end end end end end gon-6.3.2/spec/gon/watch_spec.rb0000644000004100000410000000460213603457635016535 0ustar www-datawww-datadescribe Gon::Watch do let(:controller) { ActionController::Base.new } let(:request) { ActionDispatch::Request.new({}) } before :each do controller.request = request controller.params = {} env = {} env['ORIGINAL_FULLPATH'] = '/foo' env['REQUEST_METHOD'] = 'GET' Gon::Watch.clear Gon.send(:current_gon).instance_variable_set(:@env, env) Gon.send(:current_gon).env['action_controller.instance'] = controller Gon.clear end it 'should add variables to Gon#all_variables hash' do Gon.a = 1 Gon.watch.b = 2 expect(Gon.all_variables).to eq({ 'a' => 1, 'b' => 2 }) end describe '#all_variables' do it 'should generate array with current request url, method type and variable names' do Gon.watch.a = 1 expect(Gon.watch.all_variables).to eq({ 'a' => { 'url' => '/foo', 'method' => 'GET', 'name' => 'a' } }) end end describe '#render' do it 'should render function with variables in gon namespace' do Gon.watch.a = 1 expect(Gon.watch.render).to match(/gon\.watch\s=/) expect(Gon.watch.render).to match(/gon\.watchedVariables/) end end describe 'Render concrete variable' do before do env = Gon.send(:current_gon).env env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' allow(controller).to receive_messages(request: ActionDispatch::Request.new(env)) Gon.send(:current_gon).env['action_controller.instance'] = controller end context 'when request variable is json safe content' do before do allow(controller).to receive_messages(params: { gon_return_variable: true, gon_watched_variable: 'safety'}) end it 'should return value of variable if called right request' do expect(controller).to receive(:render).with(json: '12345') Gon.watch.safety = 12345 end end context 'when request variable is json unsafe content' do let(:expected) { %Q{"\\u003cscript\\u003e'\\"\\u003c/script\\u003e
Dangerous"} } before do allow(controller).to receive_messages(params: { gon_return_variable: true, gon_watched_variable: 'danger'}) end it 'should return value of variable if called right request' do expect(controller).to receive(:render).with(json: expected) Gon.watch.danger = %Q{\u2028Dangerous} end end end end gon-6.3.2/spec/gon/rabl_spec.rb0000644000004100000410000000547713603457635016362 0ustar www-datawww-datadescribe Gon do describe '.rabl' do before :each do Gon.clear controller.instance_variable_set('@objects', objects) end let(:controller) { ActionController::Base.new } let(:objects) { [1, 2] } context 'render template with deprecation' do it 'still works' do Gon.rabl 'spec/test_data/sample.rabl', :controller => controller expect(Gon.objects.length).to eq(2) end end context 'option locals' do it 'works without locals object properly' do Gon.rabl( :template => 'spec/test_data/sample.rabl', :controller => controller ) expect(Gon.objects.map { |it| it['object']['inspect'] }).to eq(%w(1 2)) end it 'works with different locals object' do Gon.rabl( :template => 'spec/test_data/sample.rabl', :controller => controller, :locals => { :objects => [3, 4] } ) expect(Gon.objects.map { |it| it['object']['inspect'] }).to eq(%w(3 4)) end end it 'works if rabl is included' do Gon.rabl :template => 'spec/test_data/sample.rabl', :controller => controller expect(Gon.objects.length).to eq(2) end it 'works with ActionView::Helpers' do Gon.rabl :template => 'spec/test_data/sample_with_helpers.rabl', :controller => controller expect(Gon.objects.first['object']['time_ago']).to eq('about 6 hours') end it 'raise exception if rabl is not included' do Gon.send :remove_const, 'Rabl' expect { Gon.rabl :template => 'spec/test_data/sample.rabl', :controller => controller }.to raise_error(NameError) load 'rabl.rb' load 'gon/rabl.rb' end context '.template_path' do context 'template is specified' do it 'add the extension if not included in the template name' do expect(Gon::EnvFinder.send(:template_path, { :template => 'spec/test_data/sample' }, 'rabl')).to eql('spec/test_data/sample.rabl') end it 'return the specified template' do expect(Gon::EnvFinder.send(:template_path, { :template => 'spec/test_data/sample.rabl' }, 'rabl')).to eql('spec/test_data/sample.rabl') end end context 'template is not specified' do before do Gon.clear controller.instance_variable_set('@objects', objects) controller.action_name = 'show' end let(:controller) { ActionController::Base.new } let(:objects) { [1, 2] } context 'the action doesn as a template at a different format' do it 'return the same template as the action with rabl extension' do expect(Gon::EnvFinder.send(:template_path, { :controller => controller }, 'rabl')).to eql('app/views/action_controller/base/show.json.rabl') end end end end end end gon-6.3.2/spec/gon/basic_spec.rb0000644000004100000410000002414113603457635016510 0ustar www-datawww-datadescribe Gon do before(:each) do Gon.clear end describe '#all_variables' do it 'returns all variables in hash' do Gon.a = 1 Gon.b = 2 Gon.c = Gon.a + Gon.b expect(Gon.c).to eq(3) expect(Gon.all_variables).to eq({ 'a' => 1, 'b' => 2, 'c' => 3 }) end it 'supports all data types' do Gon.int = 1 Gon.float = 1.1 Gon.string = 'string' Gon.symbol = :symbol Gon.array = [1, 'string'] Gon.hash_var = { :a => 1, :b => '2' } Gon.hash_w_array = { :a => [2, 3] } Gon.klass = Hash end it 'can be filled with dynamic named variables' do check = {} 3.times do |i| Gon.set_variable("variable#{i}", i) check["variable#{i}"] = i end expect(Gon.all_variables).to eq(check) end it 'can set and get variable with dynamic name' do var_name = "variable#{rand}" Gon.set_variable(var_name, 1) expect(Gon.get_variable(var_name)).to eq(1) end it 'can be support new push syntax' do Gon.push({ :int => 1, :string => 'string' }) expect(Gon.all_variables).to eq({ 'int' => 1, 'string' => 'string' }) end it 'push with wrong object' do expect { Gon.push(String.new('string object')) }.to raise_error('Object must have each_pair method') end describe "#merge_variable" do it 'deep merges the same key' do Gon.merge_variable(:foo, { bar: { tar: 12 }, car: 23 }) Gon.merge_variable(:foo, { bar: { dar: 21 }, car: 12 }) expect(Gon.get_variable(:foo)).to eq(bar: { tar: 12, dar: 21 }, car: 12) end it 'merges on push with a flag' do Gon.push(foo: { bar: 1 }) Gon.push({ foo: { tar: 1 } }, :merge) expect(Gon.get_variable("foo")).to eq(bar: 1, tar: 1) end context 'overrides key' do specify "the previous value wasn't hash" do Gon.merge_variable(:foo, 2) Gon.merge_variable(:foo, { a: 1 }) expect(Gon.get_variable(:foo)).to eq(a: 1) end specify "the new value isn't a hash" do Gon.merge_variable(:foo, { a: 1 }) Gon.merge_variable(:foo, 2) expect(Gon.get_variable(:foo)).to eq(2) end end end end describe '#include_gon' do before(:each) do Gon::Request. instance_variable_set(:@request_id, request.object_id) expect(ActionView::Base.instance_methods).to include(:include_gon) @base = ActionView::Base.new @base.request = request end it 'outputs correct js with an integer' do Gon.int = 1 expect(@base.include_gon).to eq(wrap_script( 'window.gon={};' + 'gon.int=1;')) end it 'outputs correct js with a string' do Gon.str = %q(a'b"c) expect(@base.include_gon).to eq(wrap_script( 'window.gon={};' + %q(gon.str="a'b\"c";)) ) end it 'outputs correct js with a script string' do Gon.str = %q() escaped_str = "\\u003c/script\\u003e\\u003cscript\\u003ealert('!')\\u003c/script\\u003e" expect(@base.include_gon).to eq(wrap_script( 'window.gon={};' + %Q(gon.str="#{escaped_str}";)) ) end it 'outputs correct js with an integer and type' do Gon.int = 1 expect(@base.include_gon(type: true)).to eq('') end it 'outputs correct js with an integer, camel-case and namespace' do Gon.int_cased = 1 expect(@base.include_gon(camel_case: true, namespace: 'camel_cased')).to eq( wrap_script('window.camel_cased={};' + 'camel_cased.intCased=1;') ) end it 'outputs correct js with camel_depth = :recursive' do Gon.test_hash = { test_depth_one: { test_depth_two: 1 } } expect(@base.include_gon(camel_case: true, camel_depth: :recursive)).to eq( wrap_script('window.gon={};' + 'gon.testHash={"testDepthOne":{"testDepthTwo":1}};') ) end it 'outputs correct js with camel_depth = 2' do Gon.test_hash = { test_depth_one: { test_depth_two: 1 } } expect(@base.include_gon(camel_case: true, camel_depth: 2)).to eq( wrap_script('window.gon={};' + 'gon.testHash={"testDepthOne":{"test_depth_two":1}};') ) end it 'outputs correct js for an array with camel_depth = :recursive' do Gon.test_hash = { test_depth_one: [{ test_depth_two: 1 }, { test_depth_two: 2 }] } expect(@base.include_gon(camel_case: true, camel_depth: :recursive)).to eq( \ wrap_script('window.gon={};' + 'gon.testHash={"testDepthOne":[{"testDepthTwo":1},{"testDepthTwo":2}]};') ) end it 'outputs correct key with camel_case option set alternately ' do Gon.test_hash = 1 @base.include_gon(camel_case: true) expect(@base.include_gon(camel_case: false)).to eq( wrap_script('window.gon={};' + 'gon.test_hash=1;') ) end it 'outputs correct js with an integer and without tag' do Gon.int = 1 expect(@base.include_gon(need_tag: false)).to eq( \ 'window.gon={};' + 'gon.int=1;' ) end it 'outputs correct js without variables, without tag and gon init if before there was data' do Gon::Request. instance_variable_set(:@request_id, 123) Gon::Request.instance_variable_set(:@request_env, { 'gon' => { :a => 1 } }) expect(@base.include_gon(need_tag: false, init: true)).to eq( \ 'window.gon={};' ) end it 'outputs correct js without variables, without tag and gon init' do expect(@base.include_gon(need_tag: false, init: true)).to eq( \ 'window.gon={};' ) end it 'outputs correct js without variables, without tag, gon init and an integer' do Gon.int = 1 expect(@base.include_gon(need_tag: false, init: true)).to eq( \ 'window.gon={};' + 'gon.int=1;' ) end it 'outputs correct js without cdata, without type, gon init and an integer' do Gon.int = 1 expect(@base.include_gon(cdata: false, type: false)).to eq( wrap_script( "\n" + 'window.gon={};' + 'gon.int=1;' + "\n", false) ) end it 'outputs correct js with type text/javascript' do expect(@base.include_gon(need_type: true, init: true)).to eq(wrap_script('window.gon={};')) end it 'outputs correct js with namespace check' do expect(@base.include_gon(namespace_check: true)).to eq(wrap_script('window.gon=window.gon||{};')) end it 'outputs correct js without namespace check' do expect(@base.include_gon(namespace_check: false)).to eq(wrap_script('window.gon={};')) end context "without a current_gon instance" do before(:each) do RequestStore.store[:gon] = nil allow(Gon).to receive(:current_gon).and_return(nil) end it "does not raise an exception" do expect { @base.include_gon }.to_not raise_error end it 'outputs correct js' do expect(@base.include_gon).to eq("") end it 'outputs correct js with init' do expect(@base.include_gon(init: true)).to eq(wrap_script('window.gon={};')) end end end describe '#include_gon_amd' do before(:each) do Gon::Request. instance_variable_set(:@request_id, request.object_id) @base = ActionView::Base.new @base.request = request end it 'is included in ActionView::Base as a helper' do expect(ActionView::Base.instance_methods).to include(:include_gon_amd) end it 'outputs correct js without variables' do expect(@base.include_gon_amd).to eq( wrap_script( \ 'define(\'gon\',[],function(){'+ 'var gon={};return gon;'+ '});') ) end it 'outputs correct js with an integer' do Gon.int = 1 expect(@base.include_gon_amd).to eq( wrap_script( 'define(\'gon\',[],function(){'+ 'var gon={};gon[\'int\']=1;return gon;'+ '});') ) end it 'outputs correct module name when given a namespace' do expect(@base.include_gon_amd(namespace: 'data')).to eq(wrap_script( 'define(\'data\',[],function(){'+ 'var gon={};return gon;'+ '});') ) end end it 'returns exception if try to set public method as variable' do expect { Gon.all_variables = 123 }.to raise_error(RuntimeError) expect { Gon.rabl = 123 }.to raise_error(RuntimeError) end describe '#check_for_rabl_and_jbuilder' do let(:controller) { ActionController::Base.new } it 'should be able to handle constants array (symbols)' do allow(Gon).to receive(:constants) { Gon.constants } expect { Gon.rabl :template => 'spec/test_data/sample.rabl', :controller => controller }.not_to raise_error expect { Gon.jbuilder :template => 'spec/test_data/sample.json.jbuilder', :controller => controller }.not_to raise_error end end end gon-6.3.2/spec/gon/thread_spec.rb0000644000004100000410000000112513603457635016673 0ustar www-datawww-dataclass GonTestWorker include Gon::ControllerHelpers def request @request ||= ActionDispatch::TestRequest.create end def env request.env end def execute gon.clear gon.a ||= 1 gon.a += 1 end def value gon.a end end describe 'threading behaviour' do before do allow(Gon).to receive(:current_gon).and_call_original end it 'is threadsafe' do threads = [] 10.times do threads << Thread.new do gtw = GonTestWorker.new gtw.execute expect(gtw.value).to eq 2 end end threads.each(&:join) end end gon-6.3.2/spec/gon/jbuilder_spec.rb0000644000004100000410000000501313603457635017224 0ustar www-datawww-datadescribe Gon do describe '.jbuilder' do context 'render jbuilder templates' do before do Gon.clear controller.instance_variable_set('@objects', objects) end let(:controller) { ActionController::Base.new } let(:objects) { [1, 2] } it 'render json from jbuilder template' do Gon.jbuilder :template => 'spec/test_data/sample.json.jbuilder', :controller => controller expect(Gon.objects.length).to eq(2) end it 'render json from jbuilder template with locals' do Gon.jbuilder :template => 'spec/test_data/sample_with_locals.json.jbuilder', :controller => controller, :locals => { :some_local => 1234, :some_complex_local => OpenStruct.new(:id => 1234) } expect(Gon.some_local).to eq(1234) expect(Gon.some_complex_local_id).to eq(1234) end it 'render json from jbuilder template with locals' do Gon.jbuilder :template => 'spec/test_data/sample_with_helpers.json.jbuilder', :controller => controller expect(Gon.date).to eq('about 6 hours') end it 'render json from jbuilder template with controller methods' do class << controller def private_controller_method 'gon test helper works' end helper_method :private_controller_method private :private_controller_method end Gon.jbuilder :template => 'spec/test_data/sample_with_controller_method.json.jbuilder', :controller => controller expect(Gon.data_from_method).to eq('gon test helper works') end it 'render json from jbuilder template with a partial' do controller.view_paths << 'spec/test_data' Gon.jbuilder :template => 'spec/test_data/sample_with_partial.json.jbuilder', :controller => controller expect(Gon.objects.length).to eq(2) end context 'within Rails' do before do module ::Rails end allow(Rails).to receive_message_chain("application.routes.url_helpers.instance_methods") { [:user_path] } controller.instance_variable_set('@user_id', 1) end after do Object.send(:remove_const, :Rails) end it 'includes url_helpers' do expect(controller).to receive(:user_path) { |id| "/users/#{id}" } Gon.jbuilder :template => 'spec/test_data/sample_url_helpers.json.jbuilder', :controller => controller expect(Gon.url).to eq '/users/1' end end end end end gon-6.3.2/spec/gon/global_spec.rb0000644000004100000410000001226013603457635016666 0ustar www-datawww-datadescribe Gon::Global do before(:each) do Gon::Global.clear Gon::Request.instance_variable_set(:@request_env, nil) end describe '#all_variables' do it 'returns all variables in hash' do Gon.global.a = 1 Gon.global.b = 2 Gon.global.c = Gon.global.a + Gon.global.b expect(Gon.global.c).to eq(3) expect(Gon.global.all_variables).to eq({ 'a' => 1, 'b' => 2, 'c' => 3 }) end it 'supports all data types' do Gon.global.int = 1 Gon.global.float = 1.1 Gon.global.string = 'string' Gon.global.symbol = :symbol Gon.global.array = [1, 'string'] Gon.global.hash_var = { :a => 1, :b => '2' } Gon.global.hash_w_array = { :a => [2, 3] } Gon.global.klass = Hash end end describe '#include_gon' do before(:each) do Gon.clear expect(ActionView::Base.instance_methods).to include(:include_gon) @base = ActionView::Base.new @base.request = request end it 'outputs correct js with an integer' do Gon.global.int = 1 expect(@base.include_gon).to eq("") end it 'outputs correct js with an integer and integer in Gon' do Gon.int = 1 Gon.global.int = 1 expect(@base.include_gon).to eq("") end it 'outputs correct js with a string' do Gon.global.str = %q(a'b"c) expect(@base.include_gon).to eq("") end it 'outputs correct js with a script string' do Gon.global.str = %q() escaped_str = "\\u003c/script\\u003e\\u003cscript\\u003ealert('!')\\u003c/script\\u003e" expect(@base.include_gon).to eq("") end it 'outputs correct js with a unicode line separator' do Gon.global.str = "\u2028" expect(@base.include_gon).to eq("") end it 'outputs locally overridden value' do Gon.str = 'local value' Gon.global.str = 'global value' expect(@base.include_gon(global_root: '')).to eq("") end it "includes the tag attributes in the script tag" do Gon.global.int = 1 expect(@base.include_gon(nonce: 'test')).to eq("") end end it 'returns exception if try to set public method as variable' do expect { Gon.global.all_variables = 123 }.to raise_error(RuntimeError) expect { Gon.global.rabl = 123 }.to raise_error(RuntimeError) end context 'with jbuilder and rabl' do before :each do controller.instance_variable_set('@objects', objects) end let(:controller) { ActionController::Base.new } let(:objects) { [1, 2] } it 'works fine with rabl' do Gon.global.rabl :template => 'spec/test_data/sample.rabl', :controller => controller expect(Gon.global.objects.length).to eq(2) end it 'works fine with jbuilder' do Gon.global.jbuilder :template => 'spec/test_data/sample.json.jbuilder', :controller => controller expect(Gon.global.objects.length).to eq(2) end it 'should throw exception, if use rabl or jbuilder without :template' do expect { Gon.global.rabl }.to raise_error(RuntimeError) expect { Gon.global.jbuilder }.to raise_error(RuntimeError) end end end gon-6.3.2/spec/test_data/0000755000004100000410000000000013603457635015253 5ustar www-datawww-datagon-6.3.2/spec/test_data/sample_with_controller_method.json.jbuilder0000644000004100000410000000010613603457635026061 0ustar www-datawww-datajson.objects @objects json.data_from_method private_controller_method gon-6.3.2/spec/test_data/_sample_partial.json.jbuilder0000644000004100000410000000002513603457635023076 0ustar www-datawww-datajson.objects objects gon-6.3.2/spec/test_data/sample_with_helpers.rabl0000644000004100000410000000015113603457635022150 0ustar www-datawww-datacollection @objects => 'objects' attributes :id node(:time_ago) { |_| distance_of_time_in_words(20000) } gon-6.3.2/spec/test_data/sample.json.jbuilder0000644000004100000410000000002613603457635021224 0ustar www-datawww-datajson.objects @objects gon-6.3.2/spec/test_data/sample_with_helpers_rabl_rails.rabl0000644000004100000410000000015313603457635024344 0ustar www-datawww-datacollection :@objects => 'objects' attributes :inspect node(:time_ago) { distance_of_time_in_words(20000) } gon-6.3.2/spec/test_data/sample_with_helpers.json.jbuilder0000644000004100000410000000005313603457635024001 0ustar www-datawww-datajson.date distance_of_time_in_words(20000) gon-6.3.2/spec/test_data/sample_rabl_rails.rabl0000644000004100000410000000006613603457635021572 0ustar www-datawww-datacollection :@objects => 'objects' attributes :inspect gon-6.3.2/spec/test_data/sample_with_locals.json.jbuilder0000644000004100000410000000011413603457635023612 0ustar www-datawww-datajson.some_local some_local json.some_complex_local_id some_complex_local.id gon-6.3.2/spec/test_data/sample_url_helpers.json.jbuilder0000644000004100000410000000003513603457635023630 0ustar www-datawww-datajson.url user_path(@user_id) gon-6.3.2/spec/test_data/sample.rabl0000644000004100000410000000006513603457635017377 0ustar www-datawww-datacollection @objects => 'objects' attributes :inspect gon-6.3.2/spec/test_data/sample_with_partial.json.jbuilder0000644000004100000410000000012313603457635023771 0ustar www-datawww-datajson.partial! 'spec/test_data/_sample_partial.json.jbuilder', :objects => @objects gon-6.3.2/spec/spec_helper.rb0000644000004100000410000000137213603457635016124 0ustar www-datawww-datarequire 'rails/railtie' # We don't require rails for specs, but jbuilder works only in rails. # And it checks version of rails. I've decided to configure jbuilder for rails v4 module Rails module VERSION MAJOR = 4 end def self.version '4.2.0' end end require 'gon' require 'jbuilder' RSpec.configure do |config| config.before(:each) do RequestStore.store[:gon] = Gon::Request.new({}) @request = RequestStore.store[:gon] allow(Gon).to receive(:current_gon).and_return(@request) end end def request @request ||= double 'request', :env => {} end def wrap_script(content, cdata=true) script = "' end gon-6.3.2/CHANGELOG.md0000644000004100000410000001720113603457635014163 0ustar www-datawww-data# CHANGELOG ## [Unreleased] ## [6.3.2] - 2019-11-18 ### Security - Restrict possibility of vulnerable i18n legacy verision (0.3.6.pre) installation ## [6.3.1] - 2019-11-18 ### Changed - ActionView::Base and ActionController::Base should be loaded inside ActiveSupport.on_load hook. Thanks to @amatsuda - Require Ruby >= 2.2.2 (activesupport). Thanks to @nicolasleger - Update old_rails.rb to reflect GonHelpers -> ControllerHelpers name change. Thanks to @etipton ## [6.2.1] - 2018-07-11 ### Changed - Update README: correct spelling mistake. Thanks to @EdwardBetts - Autoload test classes only in test env. Thanks to @wilddima ### Fixed - Fix keys cache. Thanks to @ertrzyiks - fixing tests by running with rabl and rabl-rails separately. Thanks to @dsalahutdinov ## [6.2.0] - 2017-10-04 ### Added - Introduce keys cache. Thanks to @vlazar - Add possibleErrorCallback to watch params. Thanks to @etagwerker ### Changed - Update readme with PhoenixGon hex link. Thanks to @khusnetdinov - Fix code highlighting in README. Thanks to @ojab - Refactoring: use attr_reader ### Removed - Remove unnecessary json dependency. - Remove rubysl and rubinius-developer_tools gem. ## [6.1.0] - 2016-07-11 ### Deprecated - env is deprecated and will be removed from Rails 5.0. Thanks to @dlupu ### Fixed - fix merging routes bug. Thanks to @strikyflo - Show what method was used in public methods error. ### Changed - Use 'need_tag' as option name to prevent calling 'tag' method. Thanks to @june29 - Update README; comment out gon.clear from sample code. Thanks to @speee-nakajima - Update README; Replace the include_gon method with render_data method. - Refactoring: use attr_accessor method. - Refactoring: use attr_reader method. ## [6.0.1] - 2015-07-22 ### Changed - Free dependencies ## [6.0.0] - 2015-07-22 ### Added - nonce option. Thanks to @joeljackson ### Changed - Refactoring - Included rails url_helpers into jbuilder. Thanks to @razum2um ## [5.2.3] - 2014-11-03 ### Added - Coffescript implementation of watch.js. Thanks to @willcosgrove - unwatchAll function in watch.js. Thanks to @willcosgrove ## [5.2.2] - 2014-10-31 ### Added - support for controller helper methods in jbuilder ## [5.2.1] - 2014-10-28 ### Added - merge variable feature (for merge hash-like variables instead of overriding them). Thanks to @jalkoby ### Fixed - fix for jbuilder module. Thanks to @jankovy ## [5.2.0] - 2014-08-26 ### Added - namespace_check option. Thanks to @tommyh - AMD compatible version of including gon. Thanks to @vijoc ### Changed - Only inject gon into ActionController::Base-like object in spec_helper. Thanks to @kevinoconnor7 ### Fixed - fix issue where include_gon would raise exception if the controller did not assign any gon variables. Thanks to @asalme ## [5.1.2] - 2014-07-22 ### Changed - Clarifying helpers, dump gon#watch content to safe json before render. Thanks to @Strech ## [5.1.1] - 2014-07-17 ### Added - global_root option. Thanks to @rafaelliu - MultiJson support. Thanks to @Strech ## [5.1.0] - 2014-06-29 ### Fixed - Many fixes. Thanks to @Silex, @kilefritz, @irobayna, @kyrylo, @randoum, @jackquack, @tuvistavie, @Strech for awesome commits and help! ## [5.0.4] - 2014-02-13 ### Fixed - Fix check for get and assign variables for Gon.global ## [5.0.3] - 2014-02-12 ### Removed - Revert changes in gemspec ## [5.0.2] - 2014-02-12 ### Fixed - Fix issue when there is no gon object for current thread and rendering include_gon (#108 part) (wasn't fixed) (@gregmolnar) ## [5.0.1] - 2013-12-30 ### Fixed - Fix issue when there is no gon object for current thread and rendering include_gon (#108 part) ## [5.0.0] - 2013-12-26 ### Changed - Gon is threadsafe now! (@razum2um) - Camelcasing with depth (@MaxSchmeling) - Optional CDATA and style refactoring (@torbjon) - jBuilder supports not only String and Hash types of locals (@steakchaser) - Using ActionDispatch::Request#uuid instead of ActionDispatch::Request#id (@sharshenov) ## [4.1.1] - 2013-06-04 ### Fixed - Fixed critical XSS vulnerability https://github.com/gazay/gon/issues/84 (@vadimr & @Hebo) ## [4.1.0] - 2013-04-14 ### Added - rabl-rails support (@jtherrell) ### Changed - Refactored script tag generation (@toothrot) - Stop support for MRI 1.8.7 - Accepting locals in jbuilder templates ## [4.0.3] - 2013-04-14 !!!IMPORTANT!!! Last version with compatibility for MRI 1.8.7 ### Added - new method `Gon#push` for assign variables through Hash-like objects (@topdev) ### Changed - Fixes for 1.8.7 compatibility. ## [4.0.2] - 2012-12-17 ### Fixed - Fixed gon.watch in JS without callback and options ## [4.0.1] - 2012-10-25 ### Added - option :locals to gon.rabl functionality ### Changed - Gon#set_variable and Gon#get_variable moved to public scope ### Removed - BlankSlate requirement (@phoet) ## [4.0.0] - 2012-07-23 ### Added - gon.watch functionality (thanks to @brainopia and @kossnocorp) - Compatibility with jbuilder paths for partial! method ### Changed - Little bit refactoring - Gon now is a class ### Fixed - Fixed some bugs ## [3.0.5] - 2012-06-22 ### Added - type text/javascript option (@torbjon) ### Changed - A litlle bit refactoring - Made compatible with active support json encoding for escaping script tags ### Fixed - bug for init option - clear if init true (@torbjon) ## [3.0.4] - 2012-06-02 ### Fixed - Fix bug with gon clear with global variables, bump version ## [3.0.3] - 2012-05-22 ### Added - init option (@torbjon) ### Changed - Include ActionView::Helpers into Gon::JBuilder ## [3.0.2] - 2012-04-28 ### Added - need_tag option (@afa) ## [3.0.0] - 2012-04-17 ### Added - Added Gon.global for using gon everywhere ### Changed - Almost all code refactored - Included ActionView::Helpers into Rabl::Engine ## [2.3.0] - 2012-04-09 ### Changed - Don't really remember what was before this version [Unreleased]: https://github.com/gazay/gon/compare/v6.3.1...master [6.3.1]: https://github.com/gazay/gon/compare/v6.2.1...v6.3.1 [6.2.1]: https://github.com/gazay/gon/compare/v6.2.0...v6.2.1 [6.2.0]: https://github.com/gazay/gon/compare/v6.1.0...v6.2.0 [6.1.0]: https://github.com/gazay/gon/compare/v6.0.1...v6.1.0 [6.0.1]: https://github.com/gazay/gon/compare/v6.0.0...v6.0.1 [6.0.0]: https://github.com/gazay/gon/compare/v5.2.3...v6.0.0 [5.2.3]: https://github.com/gazay/gon/compare/v5.2.2...v5.2.3 [5.2.2]: https://github.com/gazay/gon/compare/v5.2.1...v5.2.2 [5.2.1]: https://github.com/gazay/gon/compare/v5.2.0...v5.2.1 [5.2.0]: https://github.com/gazay/gon/compare/v5.1.2...v5.2.0 [5.1.2]: https://github.com/gazay/gon/compare/v5.1.1...v5.1.2 [5.1.1]: https://github.com/gazay/gon/compare/v5.1.0...v5.1.1 [5.1.0]: https://github.com/gazay/gon/compare/v5.0.4...v5.1.0 [5.0.4]: https://github.com/gazay/gon/compare/v5.0.3...v5.0.4 [5.0.3]: https://github.com/gazay/gon/compare/v5.0.2...v5.0.3 [5.0.2]: https://github.com/gazay/gon/compare/v5.0.1...v5.0.2 [5.0.1]: https://github.com/gazay/gon/compare/v5.0.0...v5.0.1 [5.0.0]: https://github.com/gazay/gon/compare/v4.1.1...v5.0.0 [4.1.1]: https://github.com/gazay/gon/compare/v4.1.0...v4.1.1 [4.1.0]: https://github.com/gazay/gon/compare/v4.0.3...v4.1.0 [4.0.3]: https://github.com/gazay/gon/compare/v4.0.2...v4.0.3 [4.0.2]: https://github.com/gazay/gon/compare/v4.0.1...v4.0.2 [4.0.1]: https://github.com/gazay/gon/compare/v4.0.0...v4.0.1 [4.0.0]: https://github.com/gazay/gon/compare/v3.0.5...v4.0.0 [3.0.5]: https://github.com/gazay/gon/compare/v3.0.4...v3.0.5 [3.0.4]: https://github.com/gazay/gon/compare/v3.0.3...v3.0.4 [3.0.3]: https://github.com/gazay/gon/compare/v3.0.2...v3.0.3 [3.0.2]: https://github.com/gazay/gon/compare/v3.0.0...v3.0.2 [3.0.0]: https://github.com/gazay/gon/compare/v2.3.0...v3.0.0 [2.3.0]: https://github.com/gazay/gon/releases/tag/v2.3.0 gon-6.3.2/.gitignore0000644000004100000410000000006513603457635014342 0ustar www-datawww-data*.gem .bundle Gemfile.lock pkg/* tmp/* .rvmrc *.idea gon-6.3.2/LICENSE0000644000004100000410000000206713603457635013363 0ustar www-datawww-dataThe MIT License Copyright (c) 2011-2019 Alexey Gaziev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. gon-6.3.2/coffee/0000755000004100000410000000000013603457635013600 5ustar www-datawww-datagon-6.3.2/coffee/watch.coffee0000644000004100000410000000246213603457635016063 0ustar www-datawww-datagon._timers = {} gon.watch = (name, possibleOptions, possibleCallback, possibleErrorCallback) -> return unless $? if typeof possibleOptions == 'object' options = {} for key, value of gon.watchedVariables[name] options[key] = value for key, value of possibleOptions options[key] = value callback = possibleCallback errorCallback = possibleErrorCallback else options = gon.watchedVariables[name] callback = possibleOptions errorCallback = possibleCallback performAjax = -> xhr = $.ajax type: options.type || 'GET' url: options.url data: _method: options.method gon_return_variable: true gon_watched_variable: name if errorCallback xhr.done(callback).fail(errorCallback); else xhr.done(callback) if options.interval timer = setInterval(performAjax, options.interval) gon._timers[name] ?= [] return gon._timers[name].push timer: timer fn: callback else return performAjax() gon.unwatch = (name, fn) -> for timer, index in gon._timers[name] when timer.fn == fn clearInterval(timer.timer) gon._timers[name].splice(index, 1) return gon.unwatchAll = -> for variable, timers of gon._timers for timer in timers clearInterval(timer.timer) gon._timers = {} gon-6.3.2/Rakefile0000644000004100000410000000036513603457635014022 0ustar www-datawww-datarequire 'bundler' Bundler::GemHelper.install_tasks desc 'Run all tests by default' task :default => :spec require 'rspec/core/rake_task' RSpec::Core::RakeTask.new do |t| t.rspec_opts = ["--color", '--format doc', '--require spec_helper'] endgon-6.3.2/lib/0000755000004100000410000000000013603457635013117 5ustar www-datawww-datagon-6.3.2/lib/gon.rb0000644000004100000410000000575113603457635014237 0ustar www-datawww-datarequire 'request_store' require 'action_view' require 'action_controller' require 'multi_json' require 'gon/base' require 'gon/env_finder' require 'gon/global' require 'gon/watch' require 'gon/request' require 'gon/helpers' require 'gon/escaper' require 'gon/rabl' require 'gon/jbuilder' require 'gon/jbuilder/parser' require 'gon/json_dumper' # NOTE : ActionDispatch::Request#uuid appears only in Rails 3.2.1 unless ActionDispatch::Request.public_instance_methods.include?(:uuid) require 'gon/compatibility/old_rails' end require 'gon/spec_helpers' class Gon class << self def global Gon::Global end def watch Gon::Watch end def method_missing(method, *args, &block) if method.to_s =~ /=$/ if public_method_name?(method) raise "You can't use Gon public methods for storing data: #{method}" end if self == Gon && !current_gon raise 'Assign request-specific gon variables only through `gon` helper, not through Gon constant' end set_variable(method.to_s.delete('='), args[0]) else get_variable(method.to_s) end end def get_variable(name) current_gon.gon[name] end def set_variable(name, value) current_gon.gon[name] = value end def merge_variable(name, value) old_value = all_variables[name] if value.is_a?(Hash) && old_value.is_a?(Hash) value = old_value.deep_merge(value) end set_variable(name, value) end def push(data = {}, merge = false) raise 'Object must have each_pair method' unless data.respond_to? :each_pair if merge data.each_pair do |name, value| merge_variable(name.to_s, value) end else data.each_pair do |name, value| set_variable(name.to_s, value) end end end def all_variables current_gon ? current_gon.gon : {} end def clear current_gon.clear if current_gon end def rabl(*args) data, options = Gon::Rabl.handler(args) store_builder_data 'rabl', data, options end def jbuilder(*args) ensure_template_handler_is_defined data, options = Gon::Jbuilder.handler(args) store_builder_data 'jbuilder', data, options end def inspect 'Gon' end private def current_gon RequestStore.store[:gon] end def store_builder_data(builder, data, options) if options[:as] set_variable(options[:as].to_s, data) elsif data.is_a? Hash data.each { |k, v| set_variable(k, v) } else set_variable(builder, data) end end def public_method_name?(method) public_methods.include?(method.to_s[0..-2].to_sym) end # JbuilderTemplate will not be defined if jbuilder is required # before gon. By loading jbuilder again, JbuilderTemplate will # now be defined def ensure_template_handler_is_defined load 'jbuilder.rb' unless defined?(JbuilderTemplate) end end end gon-6.3.2/lib/gon/0000755000004100000410000000000013603457635013702 5ustar www-datawww-datagon-6.3.2/lib/gon/version.rb0000644000004100000410000000004213603457635015710 0ustar www-datawww-dataclass Gon VERSION = '6.3.2' end gon-6.3.2/lib/gon/json_dumper.rb0000644000004100000410000000025113603457635016552 0ustar www-datawww-dataclass Gon module JsonDumper def self.dump(object) MultiJson.dump object, mode: :compat, escape_mode: :xss_safe, time_format: :ruby end end end gon-6.3.2/lib/gon/env_finder.rb0000644000004100000410000000223413603457635016347 0ustar www-datawww-dataclass Gon module EnvFinder ENV_CONTROLLER_KEY = 'action_controller.instance' ENV_RESPONSE_KEY = 'action_controller.rescue.response' class << self def controller_env(options = {}) options[:controller] || ( current_gon && current_gon.env[ENV_CONTROLLER_KEY] || current_gon.env[ENV_RESPONSE_KEY]. instance_variable_get('@template'). instance_variable_get('@controller') ) end def template_path(options, extension) if options[:template] if right_extension?(extension, options[:template]) options[:template] else [options[:template], extension].join('.') end else controller = controller_env(options).controller_path action = controller_env(options).action_name "app/views/#{controller}/#{action}.json.#{extension}" end end private def right_extension?(extension, template_path) File.extname(template_path) == ".#{extension}" end def current_gon RequestStore.store[:gon] end end end end gon-6.3.2/lib/gon/helpers.rb0000644000004100000410000000234313603457635015673 0ustar www-datawww-dataclass Gon module ViewHelpers def include_gon(options = {}) if variables_for_request_present? Gon::Base.render_data(options) elsif Gon.global.all_variables.present? || options[:init].present? Gon.clear Gon::Base.render_data(options) else '' end end def include_gon_amd(options={}) Gon::Base.render_data(options.merge({amd: true})) end private def variables_for_request_present? current_gon && current_gon.gon end def current_gon RequestStore.store[:gon] end end module ControllerHelpers def gon if wrong_gon_request? gon_request = Request.new(request.env) gon_request.id = gon_request_uuid RequestStore.store[:gon] = gon_request end Gon end private def wrong_gon_request? current_gon.blank? || current_gon.id != gon_request_uuid end def current_gon RequestStore.store[:gon] end def gon_request_uuid request.uuid end end end ActiveSupport.on_load :action_view do ActionView::Base.send :include, Gon::ViewHelpers end ActiveSupport.on_load :action_controller do ActionController::Base.send :include, Gon::ControllerHelpers end gon-6.3.2/lib/gon/base.rb0000644000004100000410000000660213603457635015145 0ustar www-datawww-datarequire 'ostruct' class Gon module Base VALID_OPTION_DEFAULTS = { namespace: 'gon', camel_case: false, camel_depth: 1, watch: false, need_tag: true, type: false, cdata: true, global_root: 'global', namespace_check: false, amd: false, nonce: nil } class << self def render_data(options = {}) _o = define_options(options) script = formatted_data(_o) script = Gon::Escaper.escape_unicode(script) script = Gon::Escaper.javascript_tag(script, _o.type, _o.cdata, _o.nonce) if _o.need_tag script.html_safe end private def define_options(options) _o = OpenStruct.new VALID_OPTION_DEFAULTS.each do |opt_name, default| _o.send("#{opt_name}=", options.fetch(opt_name, default)) end _o.watch = options[:watch] || !Gon.watch.all_variables.empty? _o.cameled = _o.camel_case _o end def formatted_data(_o) script = '' before, after = render_wrap(_o) script << before script << gon_variables(_o.global_root). map { |key, val| render_variable(_o, key, val) }.join script << (render_watch(_o) || '') script << after script end def render_wrap(_o) if _o.amd ["define('#{_o.namespace}',[],function(){var gon={};", 'return gon;});'] else before = \ if _o.namespace_check "window.#{_o.namespace}=window.#{_o.namespace}||{};" else "window.#{_o.namespace}={};" end [before, ''] end end def render_variable(_o, key, value) js_key = convert_key(key, _o.cameled) if _o.amd "gon['#{js_key}']=#{to_json(value, _o.camel_depth)};" else "#{_o.namespace}.#{js_key}=#{to_json(value, _o.camel_depth)};" end end def render_watch(_o) if _o.watch and Gon::Watch.all_variables.present? if _o.amd Gon.watch.render_amd else Gon.watch.render end end end def to_json(value, camel_depth) # starts at 2 because 1 is the root key which is converted in the formatted_data method Gon::JsonDumper.dump convert_hash_keys(value, 2, camel_depth) end def convert_hash_keys(value, current_depth, max_depth) return value if current_depth > (max_depth.is_a?(Symbol) ? 1000 : max_depth) case value when Hash Hash[value.map { |k, v| [ convert_key(k, true), convert_hash_keys(v, current_depth + 1, max_depth) ] }] when Enumerable value.map { |v| convert_hash_keys(v, current_depth + 1, max_depth) } else value end end def gon_variables(global_root) data = {} if Gon.global.all_variables.present? if global_root.blank? data = Gon.global.all_variables else data[global_root.to_sym] = Gon.global.all_variables end end data.merge(Gon.all_variables) end def convert_key(key, camelize) cache = RequestStore.store[:gon_keys_cache] ||= {} cache["#{key}_#{camelize}"] ||= camelize ? key.to_s.camelize(:lower) : key.to_s end end end end gon-6.3.2/lib/gon/request.rb0000644000004100000410000000031713603457635015720 0ustar www-datawww-dataclass Gon class Request attr_reader :env, :gon attr_accessor :id def initialize(environment) @env = environment @gon = {} end def clear @gon = {} end end end gon-6.3.2/lib/gon/jbuilder/0000755000004100000410000000000013603457635015502 5ustar www-datawww-datagon-6.3.2/lib/gon/jbuilder/parser.rb0000644000004100000410000001021413603457635017321 0ustar www-datawww-dataclass Gon module Jbuilder class Parser include ::ActionView::Helpers attr_accessor :template_location, :controller, :_controller_name, :locals def initialize(parse_params) @template_location = parse_params[:template_path] @controller = parse_params[:controller] @_controller_name = parse_params[:controller_name] @locals = parse_params[:locals] || {} end def parse! assign_controller_variables controller eval_controller_helpers controller eval_controller_url_helpers controller locals['__controller'] = controller wrap_locals_in_methods locals partials = find_partials(File.readlines(template_location)) source = partials.join('') parse_source source, controller end def assign_controller_variables(controller) controller.instance_variables.each do |name| self.instance_variable_set \ name, controller.instance_variable_get(name) end end def eval_controller_helpers(controller) controller._helper_methods.each do |meth| self.class.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1 def #{meth}(*args, &blk) # def current_user(*args, &blk) __controller.send(%(#{meth}), *args, &blk) # controller.send(:current_user, *args, &blk) end # end ruby_eval end end def eval_controller_url_helpers(controller) if defined?(Rails) && Rails.respond_to?(:application) Rails.application.routes.url_helpers.instance_methods.each do |meth| self.class.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1 def #{meth}(*args, &blk) # def user_path(*args, &blk) __controller.send(%(#{meth}), *args, &blk) # controller.send(:user_path, *args, &blk) end # end ruby_eval end end end def wrap_locals_in_methods(locals) locals.each do |name, value| self.class.class_eval do define_method "#{name}" do return value end end end end def parse_source(source, controller) output = ::JbuilderTemplate.encode(controller) do |json| eval source end JSON.parse(output) end def parse_partial(partial_line) path = partial_line.match(/['"]([^'"]*)['"]/)[1] path = parse_path path options_hash = partial_line.match(/,(.*)/)[1] set_options_from_hash(options_hash) if options_hash.present? find_partials File.readlines(path) end def set_options_from_hash(options_hash) options = eval "{#{options_hash}}" options.each do |name, val| self.instance_variable_set("@#{name.to_s}", val) eval "def #{name}; self.instance_variable_get('@' + '#{name.to_s}'); end" end end def parse_path(path) return path if File.exists?(path) if (splitted = path.split('/')).blank? raise 'Something wrong with partial path in your jbuilder templates' elsif splitted.size == 1 splitted.shift(@_controller_name) end construct_path(splitted) end def construct_path(args) last_arg = args.pop tmp_path = 'app/views/' + args.join('/') path = path_with_ext(tmp_path + "/_#{last_arg}") path || path_with_ext(tmp_path + "/#{last_arg}") end def path_with_ext(path) return path if File.exists?(path) return "#{path}.jbuilder" if File.exists?("#{path}.jbuilder") return "#{path}.json.jbuilder" if File.exists?("#{path}.json.jbuilder") end def find_partials(lines = []) lines.map do |line| if line =~ /partial!/ parse_partial line else line end end.flatten end end end end gon-6.3.2/lib/gon/escaper.rb0000644000004100000410000000166213603457635015656 0ustar www-datawww-dataclass Gon module Escaper extend ActionView::Helpers::JavaScriptHelper extend ActionView::Helpers::TagHelper class << self def escape_unicode(javascript) if javascript result = escape_line_separator(javascript) javascript.html_safe? ? result.html_safe : result end end def javascript_tag(content, type, cdata, nonce) options = {} options.merge!( { type: 'text/javascript' } ) if type options.merge!( { nonce: nonce } ) if nonce content_tag(:script, javascript_cdata_section(content, cdata).html_safe, options) end def javascript_cdata_section(content, cdata) if cdata "\n//#{cdata_section("\n#{content}\n//")}\n" else "\n#{content}\n" end end private def escape_line_separator(javascript) javascript.gsub(/\\u2028/u, '
') end end end end gon-6.3.2/lib/gon/watch.rb0000644000004100000410000000273713603457635015346 0ustar www-datawww-dataclass Gon class Watch < Gon class << self JS_FUNCTION = File.read(File.expand_path('../../../js/watch.js', __FILE__)) def render JS_FUNCTION + "window.gon.watchedVariables=#{Gon::JsonDumper.dump all_variables};" end def render_amd JS_FUNCTION + "gon.watchedVariables=#{Gon::JsonDumper.dump all_variables};" end def all_variables @watch_variables || {} end def clear @watch_variables = {} end private def set_variable(name, value) if return_variable?(name) return_variable value elsif Gon.send(:current_gon) variable = {} @watch_variables ||= {} env = Gon.send(:current_gon).env variable['url'] = env['ORIGINAL_FULLPATH'] || env['REQUEST_URI'] variable['method'] = env['REQUEST_METHOD'] variable['name'] = name @watch_variables[name] = variable super end end def return_variable?(variable) controller = Gon::EnvFinder.controller_env params = controller.params variable = variable.to_s.gsub('=', '') controller.request.xhr? && params[:gon_return_variable] && params[:gon_watched_variable] == variable end def return_variable(value) controller = Gon::EnvFinder.controller_env controller.render json: Gon::Escaper.escape_unicode(Gon::JsonDumper.dump value) end end end end gon-6.3.2/lib/gon/jbuilder.rb0000644000004100000410000000255413603457635016035 0ustar www-datawww-dataclass Gon module Jbuilder class << self def handler(args, global = false) options = parse_options_from args valid_options? options, global controller = Gon::EnvFinder.controller_env(options) controller_name = global ? '' : controller.controller_path parser = Gon::Jbuilder::Parser.new( template_path: Gon::EnvFinder.template_path(options, 'jbuilder'), controller: controller, controller_name: controller_name, locals: options[:locals] ) data = parser.parse! [data, options] end private def valid_options?(options, global) if global && !options[:template] raise 'You should provide :template when use jbuilder with global variables' end end def parse_options_from(args) if old_api? args text = "[DEPRECATION] view_path argument is now optional. " text << "If you need to specify it, " text << "please use gon.jbuilder(:template => 'path')" warn text args.extract_options!.merge(:template => args[0]) elsif new_api? args args.first else {} end end def old_api?(args) args.first.is_a? String end def new_api?(args) args.first.is_a? Hash end end end end gon-6.3.2/lib/gon/global.rb0000644000004100000410000000141513603457635015470 0ustar www-datawww-dataclass Gon class Global < Gon class << self def all_variables @global_vars || {} end def clear @global_vars = {} end def inspect 'Gon::Global' end def rabl(*args) data, options = Gon::Rabl.handler(args, true) store_builder_data 'rabl', data, options end def jbuilder(*args) ensure_template_handler_is_defined data, options = Gon::Jbuilder.handler(args, true) store_builder_data 'jbuilder', data, options end private def get_variable(name) @global_vars ||= {} @global_vars[name] end def set_variable(name, value) @global_vars ||= {} @global_vars[name] = value end end end end gon-6.3.2/lib/gon/spec_helpers.rb0000644000004100000410000000133213603457635016702 0ustar www-datawww-dataclass Gon module SpecHelper module Rails extend ActiveSupport::Concern module ClassMethods module GonSession def process(*) # preload threadlocal & store controller instance if controller.is_a? ActionController::Base controller.gon Gon.send(:current_gon).env[Gon::EnvFinder::ENV_CONTROLLER_KEY] = controller end super end end def new(*) super.extend(GonSession) end end end end end if ENV['RAILS_ENV'] == 'test' && defined?(ActionController::TestCase::Behavior) ActionController::TestCase::Behavior.send :include, Gon::SpecHelper::Rails end gon-6.3.2/lib/gon/compatibility/0000755000004100000410000000000013603457635016553 5ustar www-datawww-datagon-6.3.2/lib/gon/compatibility/old_rails.rb0000644000004100000410000000036613603457635021055 0ustar www-datawww-datarequire 'securerandom' class Gon module ControllerHelpers private # override this since ActionDispatch::Request#uuid appears only in Rails 3.2.1 def gon_request_uuid @gon_request_uuid ||= SecureRandom.uuid end end end gon-6.3.2/lib/gon/rabl.rb0000644000004100000410000000512213603457635015147 0ustar www-datawww-datarequire 'action_view' begin require 'rabl' # use rabl gem if it's available rescue LoadError end begin require 'rabl-rails' # use rabl-rails gem if it's available rescue LoadError end class Gon module Rabl class << self def handler(args, global = false) options = parse_options_from args, global if global && !options[:template] raise 'You should provide :template when use rabl with global variables' end data = parse_rabl \ Gon::EnvFinder.template_path(options, 'rabl'), Gon::EnvFinder.controller_env(options), options[:locals] [data, options] end private def parse_rabl(rabl_path, controller, locals) if defined? ::Rabl parse_with_rabl rabl_path, controller, locals elsif defined? ::RablRails parse_with_rabl_rails rabl_path, controller, locals else raise 'rabl or rabl-rails must be required in order to use gon.rabl' end end def parse_with_rabl(rabl_path, controller, locals) locals ||= {} source = File.read(rabl_path) include_helpers rabl_engine = ::Rabl::Engine.new(source, :format => 'json', :template => rabl_path) output = rabl_engine.render(controller, locals) JSON.parse(output) end def parse_with_rabl_rails(rabl_path, controller, locals) locals ||= {} source = File.read(rabl_path) original_formats = controller.formats controller.formats = [:json] view_context = controller.send(:view_context) locals.each { |k, v| view_context.assigns[k.to_s] = v } output = RablRails::Library.instance.get_rendered_template(source, view_context) controller.formats = original_formats JSON.parse(output) end def parse_options_from(args, global) if old_api? args unless global text = "[DEPRECATION] view_path argument is now optional. " text << "If you need to specify it, " text << "please use gon.rabl(:template => 'path')" warn text end args.extract_options!.merge(:template => args[0]) elsif new_api? args args.first else {} end end def include_helpers unless ::Rabl::Engine.include? ::ActionView::Helpers ::Rabl::Engine.send(:include, ::ActionView::Helpers) end end def old_api?(args) args.first.is_a? String end def new_api?(args) args.first.is_a? Hash end end end end gon-6.3.2/doc/0000755000004100000410000000000013603457635013116 5ustar www-datawww-datagon-6.3.2/doc/logo.png0000644000004100000410000004673513603457635014603 0ustar www-datawww-dataPNG  IHDR,pZ]8 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FCIDATxyU}33~~or$$vAT[mKՖVZZ놊(DwHٗ}g3s~{ߙG@d̙99gh @︔P\Lh%|ICͭp8a$/b˄n$)<z /ȍ:E2mgI!VJ8hP?0&n**XÀx+kNؽwvC /*5'wU}z!t-AIPnҲ:oUcgUFle_mESFS|q?zpRt7]qկHd@X~-\!S.aeG>\k=ZH9Ph.y}{i ?UaŻIO)wz42ڱ|_vc fYahXu+%J9/Zb:&x1}FUfI"w͗gwX=Fǿ|+)7M֯+ hLi, ccp,]AZw״̰xN G:(;VmyzxYfXX}ZOԜL)tWiJ印].r)=8q{?xx/(7,~CF+y<,}TuF.-R`>kjOo~;/3KhzJ&Һpo/=3,e$O9=r |jh(~֗*k}VzJ`^hqxeat_E%Kk EH޴<wM/g(O-o{4HR gz4w'^dRE+E!{$J=8`FCm`?gJQ>J)n$[FѲ0fX$ܲ5̮]Bog̰TAУT&yBXu\6 K'Xƒ*-D .G KJ„=JJOn]8Q j-Vz^&BzM͖槶 J3k}3es N6י";/M3c|N!"KcFiFt#Q\9@uDۗ](?!C`PcT*RrmfOn{f#G#~%pD[❱GǨ;j@ K*'ܲvu1&4-L5@'4y7^"L)SXwgeeTԓvi|޽@}_t鹄Pxst٧CařCX9t3OWB~7P)!xңgw{PVm|={v!奂'O{Q[_P(vJ1fX*(r6U%aet( F=Tԉw}X*HGw=C{C4{W>j ;h0(/n +/-c{qZKX*S/ $[fG!d|GOִ֮jxS}a|{%O:k8奇#  op=6la's+Qևjh?z۵Xlԧs#73JHibU I;5LqR#k?zyoWseuZ4Aa26j`Ȋv,hw M#83p?RYikǓ2 /!"~KD2@e7۟:B,xZs)i ]fNM>~> x.[q1~+LSU|θ‰2{Kz O`H׼گn㉵+͉zٕCu۩ɧB H@]k} w¥ }B|y充`$؊iOk*V9LiyqPɤ)Uô&;1ppgtyh;,%;WwTr{w'r.jnidh4dimmFa綟6m|P]Ѯ3ϿZ(_Dzo|"7)T߻MOnIz:&y -RѶN{waQ. cY၇fWy=B` aBK/X<8|w?灋_ۓh~񫼿QxYڊ_*ϯܖM7yoH-6E`@"L$WR(z,+Ǔ{iO8<'<,ti-`n\x['KC:g /\ԨmC(#m;5zӏE=(G?M=p<:]دGcKh5`JC{A{~Gȕ_ Rμ*T6iY_.ѝ0ߎ42lK.34ZXS5hp* ZjW_wƖ~;f,Ԩ/K))i9t eE=[H_(v i/~?N~׶v̅=;wH)\Zq`PbWS"Cz*Vsc~:g˅ !JIM}yvlv'}2R rz!{X ݼ>v!ߣ$Ҁ K4c#H+3,i|dCv)/#METjmXGnp.TJӂ f1럃u-ZL}eEPS >sˎZЀLeUk)ہ, s15Vƨk GT&rBaOz W%+>,6=vm3, D#i[ߗKJÃ{97qE߾4}ap]|]q,@ LԲz7ͮOzLfַ^g֔@AQcqb=;q޾E10A>ñŒ05BZv7VG:N440㷬 -i%i2}{b듔>BfXEP"(KIZ>E>k sZS ?Ϝ&4$0>_|n!5V#ᰮ3,*]8)|#fFhAfX,h2@޿C-x ̨g}lf̐QR+wX.ܲ`%UP>OB.E+3٬o?&hAK TA  7+ۓ#;շKlzׁXHq3OMzN+]7G*B0Rvz4ZKT҃,>JزTr3Efr?D?H_Lzsnw,᧧/r[ck|OJɾ  Znz$ >?=9K+ӼYg'hI9jG5TAv2)_`쉱n&W\ KXPAq`OMp]B|#}AǗUpOW;W5bIJ_^+p \^2t`.a)7Èm煿 ^N^:x>b{O!3,?kÑUP8xq <,ɩ/xN/]!!`a)w`ѴI[ei! kq:̰3N&Ƒ 5U{㷂\wX`Na)w^1$ic)c['q*6`, 9`IXG:/_),]2s8yLN~ >{ l,%}torߕtfX fXq\ s̰Wx*%RPfXF_ *Pd@PQRпX3ؽ ,6O`Na)H(-mZ 0>oY;0gH&Xח#b13_-3022jTb%aLhO)ᇐU\5=fiޗ&oO!(y-%\`:]űKT`<5I/nP W`\S%O`_-wX2T``AX0aq% 0>/F;~lYt8¦?3,etlsVoOI<.+/G `,}^߁AlSd33,<'ARvzsFwl'?O` L ;5 K9EP=ΏA94ÈК4UmQߘa)/۩ )5`>C v\"ߊoB0Øa);bҘ$spU?*@p&oP!aQPWRLFM8&EP8Z(5^KL%S U[׵3Mw`FwIto麂t\-RD`0]"UcyŶZ8L!T, 3l4L` w W) aQqgbE@0 Kc$m` 0t K%<-7ǵ)³AIhM`=Ec6;nڮcQp8Gjy>KXJ%):/ӺJ/ .KFJ,Ti+L䔨+C@hSc`#Uc܁Ų >ȏ%zV}jjS9;́N DU`?B($4]c`ZŠ< KfqJ##YrW`=u #FfUrOW\_!aQXar u)MhI=fXʝQҨK,0bA]y  !a); x9z$ :\Nl*(3+_(_KfAEAR0.=\<Q tc&Mqd0-:*0Oi3 -82''z딄wW$`ځ)M灙KaQ^_;,JR*@9x%3,* efD$D% ^ =_1UTEӴ}O N xK$ROi NpT3, E3zF,a ܧt<Tlâ0rTAanh/kaB\~@A`) Et`d'eBha<0#ƊKX}PCD{eIIv҂07 q =k*Pj_ bm~=v#Yt%mlS**Ǩ@"wXB0$$p01âhLrJ(ֶzM E ,V;`R fXqrqh59l_ Iע, bEU`ɤ'I܊Pߣ/fXH֯X=o< Zl=6*HN3xY`v/-̌*3,K)uB t=*y̋>Gq;0nRjqR Eeb`Ey}3,+8*Q ō%~z8jn>[jmFm=h<,dl n]?QߴV&d׃(zԪ +J *zMS߮iS<>q*Fmm3_>&Mc#mOs #Մ|X GVIt(S`ijY5jɺ/ ,XAK@|=d2*QW_15 $/s,c}>'<8jw:0?H)5N])Ee)U(Ө%M`-mՀ.]~G-?fXeRͮ7JZ4H9F kdqǛ󍫾qOT{ljs`ĢlY-@6P >ޡZ@FSc}?d$kBM-kh (T^aD`O2->Klؼ._̆=uL5'Bu`4*G-/Tmvu-)EKsr_<hlZJkc$kcGЃQNe@8TGip`GtQP9Zjk;H4)-sҫǨ z,'0@yլ;{wu'~I[I-P5!FWz6Lk۷B9.z(vԪz8|b~ZhFce\ͭkcGzbIE@ KufOn>7H).K<}|KHIz%<"Z]h)AF%&m;YS*5dҺs_s{{.F/h;'q oeU w7fX(ܦJ:Tbnh!r˯c&Z P'WWXfQZ^p)AN:m 7sZbo{V5JjifԞqg쉱BΆ.{H&<ƑƑPܿ0wH4ZZPOŚ.~ BBC\DdqTcgf֢z1Yҷw-ސB%Fϻԃw_X><-zMr^\tá7S `zlM]tيsb}q߮β"__r6``Ht)~J@Ӵig~ZOԴV0H FF( x]صu'ר]L9FD/{ɻj'5Oi u^{كF'-̰/GzQaBy_xD1OT[Ol FmPok׽H.sb\y`㙍]~賦mZs~] 0"|uo{B$Z7`ιMO,q !BF]ڳοޱ? T`{Ŏ>CM+)GK4[s쥱:KCJÃw]7}Y=o,^ 58]$V(/[5麌ԟ lU٧7|ᵗ.4MePKPKuW!+bJvODh'(<8[,Lܸm0FMYa(hbYYrN:5"D+|F`&4ld(zZ$ZE/x@i-'-H{ǫ V A\FvwZ=?vR{"o,xOmF7qX.#tUx (V@dR]LFG*lo,xbA_R-4$*q[~si?znz~#ƦcOnc)By*A`.e :~o@Fvd6<# rB|vӓ۶] f\{` kc扇/;TG[!=/tLUn]x,,PZȒgu(mdyms */oeeҏ>pA󪺳/- I1O>U~|p7'ԜxǝNi4PYc<{6q2ܦ +vʑ&e;.p  K|{((퇹g~o _kQya>4<`qc^D9)qGMP4@;:9uoxek0B_meaa iSϼ`H4! OBK/SݔCGJM>$=G7m.-Q^Ȣi WN:՗y⑋+V~.~=QBkxsS,J+?즍U}̆/vHk`~>52y㇄VҶ O}]߉,h{WtيWQ`z\=GV[3j해 kh`jC_bI'0JoxX'x`-Ҷ 8;eH6i̳Ao1Oa*XkOӝ|~r0PBM՞]ykǭm gr|iACx`Olf%a> -Ҳ:6)Ҭ]y^a֏D;u0_;\c2{_s{h̑&Y>̰8ؓ{2>gqX^T8ص#^뻥.Ow1_%+[ط#aqkӷk̆]{y?N{GpF BXCOjJ/'S=h%:KҽR̰"=]d!]rG'  BӣS^Mi+ ]BS,HBPI̘=]zfW⫏}?-ٟ|Xm}~c%8J<ȟKiKykAOwڱ.Z AfONx&w8-xOZ̃n=_jP`&{<÷G->B`oJAꏴŚh-ױ2âBfXyzJYn>?F90o;-7R2F!DӁelnZ 6fX:V'ƶOPcrJJۥep$A!h\rR{c;Z ",JKC=6_d~8V'DN:5F6KǶh1,-BRG/>_$Lz7ǚ bh?cuQZ .͓bvyip3}(Ժp %Ai/Cyo:gj\?Sx|YjTO-0sRE)6o-S޽>c|(M뗁=> -@tF5#zyvBkfw/kN8忣V^B1J@G3 +4ZA!Rɤ:) W kɡO\32_rz.1:o],uXLp7;!&Z .fXyp9}z[6%]ȒocJŴp]O,w 'Uwҩ±K0´ftv],0G⏂K٧?q- =:WyKwYrV?_?KW1Â!0lvYz(l{"\jn]ln:^s>OHy,M'x 7z)Kâ6/\떊}x`"dٕK:`iz4VOEN!g<-x#ө|!rZ ^VރB&nk"5ף&-55-Bs@)=ǜE!0 DZBaoi=,(KB66! b֯0j+B-9xb];66Q[FMIFjH&#wa_s.M!0Ų| O#N&ɤv[}/c^EBM-BuxC%)\'}w:mS3(?4̂f;YڃY`HwH l|rWYj ,?(L!,2sRJW> ,*;Yc:%0±}^a|Tf[_5<- pKV,sv:fX!83s$֝p!z`òB_~N! ZA{dj!6I WY@A}M_1k)vlaև(GejN63ӣ/O#"\ A̰jB˙=;hhNdђu .< !mܦ46E"MAHMOW05Z$^H.?疓luĶ- sFazEcO?@3HtUk.P״R0qǭB@)T'7| S,\:Wyű ,3,@XߝAs@ǥmszr( ,M` a*fƨbYT YPŲ§Fƒ0247 nKg fX qb* ,IfXJ @h@1T*XUPX_dbdɺBHXTq N@0TTAe`)Bt/;6{ӅB:C)T͌]H6t%5P-Ҷ®:tbvD%& \vgRb}֘%a*5έWKV{%Kba=LXd{W lzkwVtL"]RPVvm-7 ! `:aq ,ԑvXص n>$a< 0 Šif kVl Mvm{ta>R2sKXs ,tltVՇX,Y.{orR?#r]ه8XqEP ,BΠ8`\ױ{Z}='wSPrt'a0SN>7iw[,l%UfD]o ]MP,3,NM =]J:@X ,P /-fLV h`.K̗,AT%) luHҶG-%*8TL3_) }w2y-G,"uEwXyRdR#_;B.!x'!L̼=>6XV?&aRl۲''_:G# |`@iLzɤuR7:OEƀI.\Izte' >i'tҩ;8O@'f1'b)n.w%]'GH,us5a‰w[(d|>'EG@,uB()sҶ-i[[(e>-K>'Eu E PVmId%BL/-k-Ҁk=2oI)Yq*kYENfA8NE|pY7{|SiҤBK(0m3IENDB`gon-6.3.2/doc/top_sample.png0000644000004100000410000032643113603457635016000 0ustar www-datawww-dataPNG  IHDR+~4hiCCPICC ProfileXY&,Jjehk#?6с0fV`.?l'c9a[&B>~[Gp!"BEX'$i lb\`ArJXXC!AfsAг?#7VoH(8~D)ap_MDծxab/E1mdDۀmr ޠߣGгQ4_n?|x?t[ "bFTP&pWi"JϻZ+O>柵wO>{Nz}˒ [c]Bf"o"d+DA!_F![%bo z[(/> LV{;#ioRK K֕CiTa;6FѣJ&JL^ٳe\{GyEvhX|_&[zrxrJKJIݽjBOAǤ`S舘4n8@G?sAXOi TFG [ǂC dipUpp<04x Xa!rb8 >H!5H2 GBh@i C{P?4f D6?BD#lpD"qQF\A !!Fӈ% ɐH.R4G:!}#ld ـlcr@aP4(NI-:EF]BzPP3/49-VFоXt]nFzc0 p;b0\L%s3ìaX&Vk%b2S;2i='Tz.$H6I)IHIIHIH/>!}G Tq6\ ׀Mྒq)Y%]#{H6C .h |-.%+999?y :S?4q!D('>QRQhRR$PPܤxBLIJOMI FƓ&M/;Z !mmU!:j:Y:;8rNiz$=?!}} 1 l Y O30j0z3f3622dde d*`jedF1 3[22ae^feQadf*jŚzuuM->2;={{{ ?GEN:NM R.V.h*!Mnn[TFI"OO7 /)!˼HN}??/(`( pY`B\P]0\ZFHQ(PRhX!,''\.D!"//R)2"U Ëiň]7Oo$+$Q 'KRN2Hk)j)#Tv/ҞeedddVeEdeȾ3;&-- ! P0HhP ԡ,|CJJ.SV%VNqSVR'Wjhxih| мIKR+BY뻶a:H}l!]j][ӺSzzzV = W㍭OϚD"LLON񙅘sC-1ﭤYYXY[hټsnc_h? p#cΩiY׹KAq]]\;(܈n7[Dsb5qУcS璗WׂwUBy_Uߓ ~~%~W |4 j & vB:&6^aQ El/тGgbbc~ތ ϊp1}PʡÚ@G=-=9}c*f23dʲ~e{eHlz:^z|ω<3KT s'MOqe}+v+/-9{ w*tIi[oY~iӣZY+*8plٟϽүj.99s }/0l׆N_SPWWZwq9+Wu55T57\ע-^w>vFMś M|M4-PK|J_tc-[*ͷovpuwuuһv$Yvwケn?5}@>;;Uv+Ph}$ePn!' OچGt=Uzγ ?5{12>ˠb^mN@OdORNLNUz8-?9338k=zsnmۭwߗ|P7/=߱0n)lis9#NJO>k|\qXy%+oߺ,֦փ7g`qiCq[حm_ƿ&vwvˆĽy#4s/i"4(F4C$q$McȉVJU]` dbgg[*9  i <- W x#(,m)%QQyKVw Jqʚ*8g*TDվjkҩ׭+?b@4T7b4Z54i042ﰘB[30R!73 ۰]M2lx__?-@ `dȷٰ"OD%Eg4ǡ('&;DH+NO<*{t.#E&_Y6AR7sQ1q/^^mx1yoiY9ӷ}Pg^^]^ɧVί}qjt-`DZ:;;B ifI*#O)b)P3>fHedc`fgp,Y][,p^0BHMDY19_$NHKqH}nUziǔʔUT&(pQcRW?ɯ5}]'W[>{bcoS?P` Ks+ka[nØ}r n:D FOskԻǧٷƯ?= 41H#X o\Qne1b_/'l";~D03&95/-"m1̴9͹-ǛN\ϻ_Wp⼒Se}++:wZ|g7j x8P֠hzzЍ盺GZZ۾#o3tttiQuqo~sOmo#e v ?9<rME Z>:]g{Y>`^ǩ1O&o7+VV@Hh88 B24JHˤɲ˶Y-UPho-JIʗU4Uɮ٦eRO{GZBT!YEj#cF1bSk3 ~4 oVoml1=s0pqlv rut)9hvpݵȍϭ]1΃y(*A!C¶GdGZDE>>LnDBP"mCwI|+.$--=s1LtlޜO;P$ɍ%N/-,:}Aŋ3ȫ8e\pZs6Rn]r=•/W?6l\_g!}Ӣ)Gҭ::owY}Ǻw_f!açϵƂ^&f׾mod#2U3G96JA)=? 2@@Ώ́!Ge8@xf78sd } +C=D "pu1[_(}I,Z~QƔa6 kDG"ÑUB;"mJTQԔWithFhmhGһ`(cTeb:J.gwO ~ML!aM~Q'RRS2r L%UT5D4kk%ѣg2`55563 7-51bceo}¦e8Lq;HX|5Kg_!@pQȧ0H|TxXĚÜGʓS p)G׎d.eh.:\4}p֪.^̬YXrUFk77ͷ,}hXpOk{u#BOGBG"8faВϛ_11˭_;{Ǯ@`A0HY ԁ[+b$Aנ!#!pB!n !9n e<*5B'`ߗc;JKF*AZ]!%ϑH \5U,5=u+Gt8Rz1PFƻL̴wYBYyY'89^rVryqK缗]d\nQhP&|剥ҐKd1ȭʿTSlQVUI8֦]SFK;GFEmN~QVek^7J)nA{n#n:L/o+_GTAa ᓑZQu1aqc K’Z;I̚I8.ȟ,^S"{KJ3?TKFҵzWU>^+tsزVn:]>@!1O0OϪGM_01k6}R'_s7 7l "@h 0@xu! C :QF!(VT2j~tbUHLH&I#qkdvx$< EAKYFMHcHkDgIoĠ($naiemck)p\^(i1if/FM Y[Zi[: 7MZͯX[hێ;✮عRyy9{Uh4b49b>*1=v*AÕI?S28du/`*|TS~*tu|>UPuŋu,$5_הRݖ9~}l}u$#+GG ^ |kRw*ͣY۹soK}?pqqgU߸_g]?Z67"6Z66jLٿIش<9Eu}kakqp{`{/_~=kGj{tgp>2{=l!;;;;dcAw;k(XE\92߹r>{0 IDATx{@!.I -B  )" X*b+-"rTZkQ}Zhill񱴴}zĉ-[8NJd@$D;CpX8\lܹsϟF,S2~bccO:5:)))!!a ʂ@ DW[[[[[N STf뽼;|]NJJbI 22G4@ \|ݻv'N<}T*ɕ?Rj9p_~9ŅN^wIlvxxs`9V._\WWWWW?F߿`nnnbbRTTo`xx8"""))I[|jj_~ ũ㼲rΝϞ=Fꉓji"XHt6pwwg999233>l #""ueՙT'WW׆ lll\-[ݻ7:HC눥GB>S6X'GGGKJJzzzdկSSSlǗ/_nccnݺN4wtt޽{bIXɮ'}p};;;]]H뾍3ߟpZB庾2H.X@SSs֬YfffRihh`X_^^ /--MLL$H===vvv=*,, ,]MMM<044iooɓ:$$0//bn,~EEEqqq6mSXǮ7JM=x𠕕ɓ'D"uuu===&ihhh``- {쩫ٻwwᄀ^IɪU̙x… [ZZs 8{#GJKKϝ;C;b=x߿MX(N4//5k̝;w tXK~$x))) 4j\$YEE%11qǎ'<<|\8Q~e 277߾}{wwwE8s466NKKڱtKO ??رcEEE555QjĹJ h 77xar]_bTdҢ{n8m4u<==Heee b>|{t#33*..nhh@}J=zttt@ 899EFFfee͚5hR 888$$$H$uܱc_|K  sWZ\\\Lӱ]6..?DgPׯ_߾}Ȉ@ {ҥKnDjv@ /z-[^^ٳq"H pp033RSSֶLwAj\GoRJee/*֨q`UUA 8Q~ߕ?klllLfii=xEq\PP088\z`͚5[}yyyl6`B,=O]+**B庾2q+֎z۷/^,bD?kjj _d CCC9 -->O$l˥Kз>lddTSS}e\vTTTx(FVVVHH̙39aÆ,ԙ3gnܸƍRRR`鉕`0Ο?cee%KWWWss,ϭ 8A+c7u?EDhXHWVVFd``K|#r :{{{ACqrr7nLLLr%%%hR x<:>k,hR|ggEutt HmmȸRX, a``p%khh?$''H$sss###ae|2F5k̙3CCC Xi4NQQ L&SSSB0˗ ЁHW*8qR[[o3 h"p}FR deGdɒ%L&L&H$&9o<Ap .\2"""<<|Ϟ=SRT}~TQQd2WX #T*533Sva9V<233?Xկ۶m!Hh#4N6l`0LLLDoXɫ'"-~T*J-..v횦6XzbO455I$ի544~g @ 2}K:<<,ioii -]^?(•'>_]]=66&)SJXzJ/X$%%d'WROOC ?Nquݱ*Տ2QŠ~'c? ~eF'OJM.=QG^u?mnn3*v}!djPB! ',,D"ƾLuuueeeſǿvIR]]fee;͋Ǿ ț:}vvv~~W#77_L6-,,Lbq@ o@ r@ _W9EDv@ FW TWWK]&Yϟ?JLL?/VƁ2q5~Pe@ ">u떉뭭:$dTÃNGGGŋ)))~~~d2Jڹs[PP`nn~i|Qpۮ)\lܹs[_ @ !ٮ]innR}}}=??bddUKKKJHUUUbbbhh,~LJ ?bxboo/z`Ʌ$;66xb??q0ۮ)#͛uq@ 򆃹ŋ/d'OЏ7oOs?͜$62222k֬:? ,3J)7999...,,L/~ڇnݚ8~~'CCñۛ@ onstt.4{lʪQye1?(NNNFFFB˸Ҹ\QV]]])))7nj/**۴iS__ߔs466NKKu@ o*Rǎ(((ȼ$T?۷ԩSXgIGɓ2,wǎ_|`hhH$*V,CBB>R秹`ppݝN.@ 7ɩt##Q_YYYIIiu@ yo @ u\ @ Ǿ@ 78@ )/@ MaǾ=^ϟ˘Y_^0477wwwKֳzdd%+@ 2i{m̙3R@uuuRRRBB~/~۶mvڄ+#---t:=::ZH$wyGh&T*J;wnj YdMjjx-[[[:tHǢCOOOli@ LClCC )500pܥjuuuUTTΞ=vZ>?!E˂vRRRLL/^{оlٲ֞{{{OAA͛7򋳳3@`0,} 266٩X}cqm{{{ryyb~ @&quu{QaaD SWWw^t>o``ŅFeddǏ[ +WܰaÑ#GP={(͛dի===|}}iii^^^)))k֬;w.zVQQQ\\ܦMP;vp8p iii\.wŢi豕UccX}9::XI/{O?uuuݺuP1?@ ~reeqvv6 22RYYBűXCCC>۷w.]ڵk|>?!!AIIںbhh[nQ(r _WWb>z꾾JMMM[[۲i7wppHHHE'b'`UUA a* 'O͝reArcǎeddLIݻgcc'un%@ U1μ֭[ˇ555Q@@ 999VVVcccn:.J[Ǐfdd={Vu(GR(2 hTTT}UWl PSSsqqrh۷utttuu577!zCaɓ'wyp}pK@صkWCCCzzzGGp2@ OtGOOV r @044yftŋ3f<}T \zu/_FFUUɓ|>O>A100A?鍎8jbbR__/}:)TP1T?A3fdggx1?@GGFOx}-,,FFFZ[[QǏ#%*\U&77?\?@ SƟƾc0ӦMcuuG!rMCCC*Si4NQQ iii$h?3V%̙:gΜssiӦ}hjoo̙3WZ%z Ͽpʕ+#""#LҲq())aX ECCҥK~BCCtE] Q(Q& WLL̸Q>̞=055UhX}cէw̙[lz@ 2e(!<|ӧϘ1C8000::> oooWxQ444.[lٲe~hr ~`0Č|Mddd}}nU@KKtwwHy\zB L8}_+ʊ72lH$Rll쫮u@ Ȕfggxyyikk OBO [} @@  @ @/@ M}1࿈=F"ab{[q3-xѣR333=z~ljjlnn~B!y%H^~}?w@yyrر'O9oܸm۶/ܶmǛLÞ\.wѢE H$L&T*JUSS;wj?>YmLnݺebb~zkkCkKg,=Buvv.[lܹ~QW>vj1Џ?_%B Cl߽{Λ7999 ,@166d~׳gF(//g0w~EccMϟ:uOǏGݻkxboo/z`f844Ν;ij=uڵ+++ Af*ׇoKg,=* ymݺUlӻb\[N8Q!J4[[[W_-Yĉ6+VRk׮>{lbbؘ5BYlb$7wfl6;''MIQQjZ`6l`ccrlbffv= ˗/㏻ GDD$%%򓠥e豪jgg縧H$ !>>QwwYb(l6;??zzz]]] ellL2K( IDAT )nC6miiPUUeaaajjzm pݻw [7n{ՙTQ{SS?rVA Zonnٳя, b-lժUs\xq…---h_RXXbP;@سgO]]]NN޽{Q{dd`ZZWJJʚ5kΝ;44iooɓaEEEqqq6mׯx+Vpvvp8-ϯc.!-- ?~G/^PRRZjUccꆣC^^ /--MLLDP o>GGGɍEb`錥\ }6mdkkp\ggg p&illlmm6n{ԸX ...4-##->> ~@ O>{LlVtgF__ߖ%%ݻw <"MGAԹSdddVV֬Y8`kk|׷o>22"޽tJMMM[[۲2mqqqCC cT*ѣ+hٳg...Ϟ=+)):88hbbdaa!*ɓ'sssK.[YY͙3oܝ GiӦ[98;v,##@F$X:c)nXqhѢ/bll>~~yinnnnn.((ttttww8b @$  s׮] JJJCCC8@ ,,,V[[;**իo^x1jhq}}~yJJJ|>=>lddTSS}e`0Ο?cee)++#",Wn?Hd....]~蒜w\pA4W} PSSsqqrh۷utt;;+WܻwOUUuʕUUUخf 8yΝ;\Bdia錥aŕՒ%K:t5kXgK,755urryJ*t:]J?nA 𧱯ծ]o 6SD)O^z <[[lAE|ƍ\nII LJFUUU|}}322"""Ξ=!~~~~~~vvv<O8-tY'P8; MMMVVV$~ZZZЂڮ^*6_?1 yg}rʻwNn:` [o%>gΜy󦉉ɍ7C7,W7DEE…+WFDD ߅q㆑Ŋ-ZKKrdddw_x9gKK`&H Eoff/hhBKW_>>>/^XݤP^^nhhH$i4rEbbbAA ??ߎ8zʥ>(;v1\ aabb"e^Zd $$dΛ7ijjH$##իWkhh2LMMM d2/_wV(!Ҧgz{{ 3555uuu Bz{{drGG*BM3lٲe˖}BKkk|>_YYYgtvvKK&SSSImmm8_Ȏ\l7DFF׋1`/Ug=eGy敗q+O{{d-eybX\@ +A/Azzz]]]YYYqqo6|H$Rll쫮ȤS__֭k׮uvv;vl܇Q} fggxyyikk@e&Y* 7o'!@ 7/<@ @By!@ p @ ySPޱcǸzzz_DQ__ ,=zq8ṿ WC@{v݌u@LQyA7ZkxxWMMMF455ݺuH$2,sEvZ__\9HYr!yAAA~֭[o޼ hkk=uT:)))!!pm̙3>| <7,,t򪗜L D"H|waOOO.hѢ?5^z/,++C?^|y۶mW=1ETgňaNaBBB,YbccZ***=%%Dz{]Uxxxq ǏרsI\wQ>}zĉ-[Ԥ?#UgNȍz[lYti~~͛7lp;w l׭[ O"RSS e9lؿT?[YYݻwAGR.] ӳ}UO.:+ԍ"??bddUKK A+W.]455uΝzzz7nܐݧ횐c122RUU:]8HLL|z޹sb:C "/W^ptt\xO?doo/LnddXUU`}}}  펎l6;??zzz]]]˗~Ǩp\nmm-jp8׿֮]+: 377gB!+V3gΆ :;;rpp077711)**HJJhIIIOOe豪*ZL}͛7T*Nq.nXGX>34seeΝ;={-zb/`Xׯ~mvگ*$$dmu%5>qB F!ծ@`!c]GQ>S6~b;q@ D!>r6m:|pAA0)??رcEEE555@ ٳ.''g޽ﶼ<_ZZH"<==>>Ǐtww|!!!yyy, 5mڴorUTTwpÅx+V8;;1__3gΜ>}zCCC ]R9sΞ={ȑs=|qmhhh``#MMMgFIuuuׯ_OOO'8#5>qϓqu߿?%%`R˝8@ dP}v''ӧO9r7==MZf k^^ׯo߾}ddD ܽ{wҥiӦ[] 9pJ=ztttڵk|>?!!AIIں뻿%A {]]ݒ;99EFFfee͚5 $i\UUUMLL,,,---Ϟ=sqqyYIII__Z7.M&-,,ȥ@i>X:cWVV뭷nnnyyyg644\vm\\܇~hdd4h2yv55ҏ>D8NJIE8AjzѤJGG_~wE-XO%˝8@ eӼ/ȑ#eee9凢D7\`` 8|NN|*@l~"f]\\.]D t`*Uݭ[7Ix544aaa622|0J``ᅬD"#o555+Wd__ߘNGG… !@/^nݺӧ8Q7vI3HJJJ###R Bn9ȇn/}[n}w Ƨdz D.zrrƍUJDSQp⤷+ @ IOcߞyyy~SSS+**|||h4Znnnaa!~a??????;;; … SNݻwN>7|SQQ100~ɉoܸ111喔x<:>k,Y---hڮ^*gp8455YYYЁrll|ؘK7vI3( 4A{{'FGGQ; o,]b۷GGG$'Y|~AAzXO痫]r1Qq}QDD'SQD~@ Ȅ!訊kkk+ T*J_vMSSS[[:hnnn>>>:::EEE円D"F1L.+,ƍFFFFFF,+..ijjH$##իWkhhc0ӦMcuuG!d&I&I$ɜ7o Ǐ'k֬RjjjVVVŨ :>|ggEuttT[[eii922233xŋs̱ Fnnn***h333ee[b9W@7vIKg,ߧhT* ;;L&kkk˗/hYf͜9344Y3(!!!s%33sƌ5kֹs`Kj|'\*))aX ECCҥK8vyA@&IPLQu+**L+xD"Jfff"rSrqtFwLJȟ***,,,x<ތ3d= ʵEkk*F5vٗA^*䎎UUUɪ|eeeɷ200$-Nuuuuu?K*8:K.8 s---Q)zҢ.{~` '>+3QT@~@ Ȅ >@^0+2]@ B&AyvA Ǿ@ 7- @ +p @ ySk}=k?ŌdKeb233333_ϥ&Im/V~Bp⳾>33ѣGS\%,⪶Oqe^~-axz2znOOυ &ܳ$[B իWKt!z˗mVQQ!k׮m۶m۶m۷o]\\|!s+Rtӻ`2v9|;sٲesoEGxXv,bbbeo\?~믿FEE\ZZZ<<gkkSy Yr3gvAӯ]r.!K-ǐL&>}͛vvvT*Njkk/_wuu6m4cƌO?`jj:{lt~.**j͚5YC~]]]6lr[l133wܜfVyyy1L}}gϞ>3a{yy988 #""d`0t+ZD+cϟ?ѱ{ӧDzKrΝϞ='UUՂ -,,<(rA ^Rlj[,lv~~͛LMMPĊOϦ&rkkkvz N\kkk -Ꙛf?|ruuvvIX:K-""fs8޴46fϜ90G%%%===}vWWWBCuP >qW߷ՍqwBy߱1__3gΜ>}zCCC!OOO{{'OTVV~Ǐ߽{UUU.]C]677gee]x 22rpp0--+%%e͚5sX +jggѣ9sΞ={ȑs=|=믿 ),,cXcccBoEEEqqq6m|\>cNJ[%/X:wuulܸQ,\zo߾ﻻQꌥ۞={(͛dի===|}}F|bsEEE%11qǎ'<<|\=۷ёb)'_;v(==E3α@f~@_rd2G744 >aIR=::::m4mmmCtQuu5:l駟KKKWZgffVVVjjjږMA9H$/egg"##)J\\jhh044TVV뭷nnnyyyg899EFFfee͚5Bo 跲,ZJII)88XtA'O嗴777777 :::~R144\vm\\܇~Ά>۷w.]TF5^+DLaڴi***֭xzz '@vOHHPRRGAj\/yyǎ_|:y)Dz*++k׮0R{{{:c馤~իW??@'>8:˫[```ppࠉIPP(ǎ(((@?*'NY\]]l6>@8NJ[yߡ!@/^nݺӧ~"f]\\.]$E~}KJJlriAp(++#200($Ú  M D"Q8_va##oo˗/ 6s̍7ݸqC~m}}}/YD__IX,;JJJ##`0Ο?cee%:τCWWWss+dD v\r(8q?twwtT*u\#nB],BBBfΜyȑ 6deeE6H$"3>>>=JMMP('>%~%n$ KVSSsqqr jljۓ'Oܹʕ+4 ('Nijj_)+ng 7>@UUG#B x<"ۆpvzّ#Gpfd IDATdDDD={ŋ[[[޻w/h )NNN|>ƍ\.DtYdnoo?x`…?$yyyCCCeee3!8v( y{{'FGG_QQCrss - [o2CWXq+/8q?,\?uؽ{?>$jK,:˥[KK zb[[իWXz9s&**͛&&&7n@#S@OMVܢu@ TTT<==y⅙֭[q㆑ŊCAEE/<~8Jr'Hd2ȑ#ܿ_OOoX~.\XreDDDxx]%K0L2L"LyP;bhhHR{i4J-((& t:}΋-VKKrdddwI$(CCC Es,  Ixx,v,._Lf͚5sP>Nh㣣STT H`` ԤP(L&sB?t3.%%%,Bhhh\t XR)//744$4dr\aV|bV|ijjH$##իWkhhXqzɫ?(ׯРh mlllH$=<8:c Hoo̙3WZ%+>^w33q+x+..FWK,..v횦6ڵ@c-"}@^gYDhii|Rxzz:tH?mmm]]]DjooLE׮>_]]=66&*,ӧOˎ@ l>RK$2,W=8O?R.i7|^/7d;;;{544xB̈X/UgyuxR&oE0[ڢ^WWWVVV\\o F"bcc_uEP^}}}ܬ}}%>A } DW "/dxM_ӦM c0F@ Wk4@ @&- @ +p @ ySistʿ4ϟ?777K+/bDz=z4##cB\gff>ze`/fXk&+OR[[%RY^U{_U R$j~ 0t\+W S _?}˷cǎ=yƞ:u% z_~.D|m***^ҭ,xxxh%Kؤ H$wyGh&*jjjΝЮ I;K///===u떉뭭:$zJggeΝߢ#驉aI\>}Z(`xxӓ.ZH׃ºMj{_+}||,--ѝ{EiWxER+ծ^^^!!!Gݿ@DtX&_Ϟ=[Ν; TҥKzzzO>}I022RUU*jϷimmֹ~xboo/z`t!W.YHOO_nbb閒 HMMоk׮,ATj__jۺu0fjj*+dlll~~~?(UA?[YYݻwy]ҹA3fHK?&LF0tRPSScffp!Ӽ+TڵkϞ=(vvv%!!f[ZZ644TUUYXX޾}`nnnbbRTT033#ɣO>y󦝝J˗~]]]gggGGGccc##M6͘1O?vxx8"""))I!>@055\_~qvv& b]~]4::ZRR# ]d2%I޷oj b1ܜfNBlv~~͛LMMQhjjp8\.Veeet,]]] ell?cӧO:K7 [XX>>\.믿 ),,cXؘ3gN>zjtk!OOO{{'OTVV~Ǐ߽{UUU.]C]mڴIhQٳgVVV豊Jbb;8Nxxiii\.WQjaÆK?zȑ#3fؾ};b=x߿M<_ZZH"tpqqhnnn {O?uuuݺuP,þ}ܹsd[[[ ɮ @سgO]]]NN޽{1ҥK߿_\\zzz***L&@8={(͛dի===|}}tV7ٱY~=[b3YhbIm9sΞ={M 3@ @8.%HuԣGy|tYf͚o)аL}FuVssN&%%3g8㓓z3fPPP*((@$?u{GC쯨 t:F{]$خo=˵WWW6l\Mq`>7$}V^rEOAw-fϞўϞ=矓ƍ't:2dH~P_`0``aa1q.i4Q4F {11@tLUTTFuE{avv1IV/B󍌌222P_-]af ڕ644}А% N_n]|||qq7HIIdXpذa***b#FHKK;wvO:ԩScǎEdmmm\ΤIK9=$$dO8WTTf{egg ªR___$@ TUU]t :tHtYˍ߿ML9vXGGǝ;w<(zn Xd… y'N^իFcǎmmmwE cd[KKÇCBBX,VVVݽeϞ=#G.]e2U#GB"h4ZLL/{nb_ɞeYYܹswE]}hayy}&+;gff e߿d'k)33Bsrhdv k;@'r/`09/]pfu{K.%hW˗/1v5kֈfekkf >zZFyZIIiٲeŒ .rMLL 4?x𠶶vaaapp*DGGݻwݾw-333&fbbrԢEojjL/^NLLJ 0LW)EƓ'O_xqq]]]4z{{s8MMM 3dLMM p8D>!<|˝5kӧ)^Z|||F[^^^hhnllP($ңAnn.q*22Ғmڵ,KOO'$$D__͛\+++6mii?X,sss]]ŋ#SK3IWWwƌYV{",Xf=zDadAEEEn{=Tw^ .+ )ڻx :-600@O%vW&Y(͛C a78龀`>O@IĤQT6"NBEK|>AKKKQQ+++{_hII ;CIP(D[uaǎǏzB[ZZȂM\YWW'}yF\.r'>_&>u;wttHKzx&o}\^ oEv/^_/__MLLz~ȿl35> #%޾}?@!!!C V P|^L0`;S`0Ы/`0  -0 `0O<`0 |.|ogggqqm[ZZ=ZW8mkk{ꕸU%%%%NzOgg͛7/^HI|9g{ .˖8|5cE;mnn~Xn[ Ko[Ν;WXv+WXԩS.]+V<|_ ,0`ݻ ׯƎkddt1B$}v('oKV.Y>e">>^} O#١CԎ=Y[[{n&yƍ"mmm___a{{SuuuT[n]zz:kkk777# Ϟ=311! 3;k,+++]]]--kkkMMMPX]]}Ugggmmm6jkk[|;j\ d2;::<;;`iiQׯ:VVVF߿q???B/_>x<މ' puuy&Ɔuسg5Ɔ())?~9s8t:J|". PRRB N%''鉦<{ 9LGM6!00000ʕ+Hrss;###+++TO9v۶m(믵.\Hf{{{i&&""͙3PTTp#""!Xp! ''Px֭ׯ_K)'d3gθt333 SSjkk7l@姟~={4Lرcz<8~xGGHO@CCCddcpppll;w$ݻK,6lGV2;[2K~ѣ</''](,,OLL\zu||a„#GΚ5 }211QZK,!/^!3f Q_akk5k|#t…Oniip8nB)mll[[[CCC'L zر b֭,+--zjС ::|~ضm)--MNN~׉掎 ++m۶UVVoBR__<{fԄ2Ĥn;vXpaggǏ;:: Fcc5k466yzzR}矡C>}vD>8ٶm7nɷ~ۭ,Naaa[nE3gܼysĕv !\tù\n˗/BrϜ9parrrnn.z^b|B.\8k֬w]R3N{nܹ)))/^$''섄_a1u O>|ucccEE+ikk+K\]]njhh& _MMM#$wqtt444422O5jT}}[uttʤ$.]gϞYf577:uѣGԈ#VZnnne'''*Aӻzj--GM>G((((++I mmB:.Adƌ QQQk֬oѤNgg@ `0DzaJJJVVIGp\{{{uuaÆi4ҥKϟG+W\ݻw7n)) IDATUTTspp`Xl6Hĉ"""թSVRRRb2 fffeeed Μ9_PW(eeVKKˈ[[[ 9YP3%I;|>Gܢ"uuu###:ۿn%%j޼yGGGsmzBuuu''w***%JJJ3g8p '''2~d-BܿdP7333H:Nt޼y SLAO޷1Lσc:D<t:byzzΟ?_~c&>qD)LIIx""t:}ݺueeeG>_~?w6##" Dŋ'O$''2L$޳g}Y```/[GM<#G ,,,,,,FuMCC~ 111Hh"]]}EFF766F?̺H N:u5{{. 0FuvvX]]=??(///##eѪN>UUս{tyF"JhhhWQQ5jŋdqB&766~1:~qϕw+@NÆ 6661bjkkԋ\---@eee3 UUU]HO%%%۷oQzbH1nc0DSO2;[ɠ/E?@l65$' FH,""b)))fB@nׯ4i耣fK3:qի^jiieϬ%K,\?ppp@oRC'Op8ٳgO>]CCܜ\/޽[=#Fl߾=88߿><==}Ŋ!N svv.**"f5 vvv@333PSSs}B/_͝;w׮]W:t(88IÐOnAAA111>>>ߴigeeѣG!mmm7nD jK1556m O%N***ЅUUU.]"dqB&  UUUw+@Ncǎmmmwuww'.133#iP[]]eDo߾k,ٙ,>BCCSSS/_N|_2A?rLa E|g233!/_$!L&Bȑ#.eob09#q%gHHLJFC߼ycmml2tDGGΎXGqSD"y^^^hhnll,Zx捿A좢yaa+bSN覦&]]3f mmmlaG][[GSSSCC 2ɿK555pX,V\\gddp\.kbbbff@.[n1L555 . ޽{544lll\h FB(L~ȼyttttavv6)`X'88HvZMWWW~b~!˟LODssD" ˱0 ^ĉ+Vχ^vm+V(..*"..N  oYzijjFGGرc=<<C###455555Oj9"77F9r|]\\\͛􍍍ƍ0`LIIHss1Y石gϞ0aw)7|~ziR dvՏW^533ڵkW,2=!<oĦZIIIt:NO@XΝ; /_-=b0 ?c|{{{SSӷo>y$66vذaYXYY*/_>f̘遞n޽{/^,*?x̙3ѱ=18Bv!BHB󵴴жA={fbb"^DaY<<<)!ӟqݺuB>L-]B?C YlYkkh7oH[[Bnddm$+=b0 ?kndd4lذvܸqfffl6PRR2~xCCCCC9s444 W^boo6mڄxsp8cc㈈z͍~wFFFVVV xp޽{6667o$R-_|ǎy'''x?qG8>}:rHccc[[m۶ /EO&ztICD}6Ϟ=&%#u-,())<;;`iiqE  w7t[/ܿ?11155̙3~~~v+--xɄݻK,6l˩3L2;Ǖ+WzyyLfGGGH Ydz:uvÆ YoݺkBbmm) ^쬭%2$3Gx999???w5@1 Cz˗D <uܹUUU###pLMMMLL"##}}}.]ɓ}iii\^^^O<mHH*"''aܹƷo޾}<(((ؼy\hQ~~~NNYGG͛ _uss3u#""lllV\9a„F???N駟JKK]qFt/|Ž{ ˋD3좧Lvc(X`AQQQPP;,ga111dIg۶m))) I&L644_SSSGHի&m'..:33Ϝ94hܹǾ}n߾}ǏwLPAni&777 RA.yucaa1`Çh۷Yaҥ#44ĉǏ5k@ `Y?3cƌAΟ?QQQ(#`}E***k׮B-[8  MMM͛0eĉ"""թSVRRRb2 fffeee4mҥ9s/ #FXjUzz-[S[n544{?JJJ_}ռy...W\Yrw:;;oܸ755mٲMV={)X/2***GU__֭fm!)))YYY]YoEvp"3f(((DEEy;w8::/B7mt1i%Qzbv0)) PK>]^RRR9s>>>999F1)D믿uL._'ӓV777???(eeVKKˈ[[[@MMM[[[off& gP:N_G1 C>!!!UUU `x< QF]pN ]^666VWW722@cٶ6uuuFEoc3wޘ4a޳g}Y```ZZqFO8QJhkkfU N:u5{{{4֦J L4BOY&zId޽򋾾sDfggwJ\h"]]}EFFKnLLuFFu֕=zvDⴴ4SSSi%Q[[ی PP)=/444|cJJJ\\ŋY,%dr _$OaüFAĹrʨQ.^t:byzzΟ?_~c_~FAAM*Dv `0{m۶Fk:\TTDL&ݻ#GB@PPPLLO7mxԔ`X,?|A ٳg!l6{ذaG%)))ѱ{]XQCC͛HvZNZYYlKKK??ZOY&zݺǔd\p߼y?h ;;(K՝L!\`~u{jhhp\Q#兆 BQå><ˋfO:fBp4555448ΐ!C cXyyyzzzD4ǩ['~g&77Ze;_򧈷HKK˥KŋNLLDB2VRRZl%3’ChU$iPv`0$@MMMTVV*++?3zJGGGϟwtt|SSSҒv.FSSfmm2\IIIn]?~W_}5fSo߾ tttz.U/jTUUUUUȫ ӓɐĚK@ccceeqELj##,&cΝVzEoԐQV{BgMMr}l7 g%:Kb?0 ).. 񱷷8qaDGGkhh_c+`0 {ddQQQ (,,liic_Lرc`0Oz`0 YA`0 /}?BboQ̿_ `>}8msΉM>AlIIIYz|^z%^nqqĽ[ZZOJJM^xq'O& /Z[[3!3G_HRQb})}Hٮ1 ?c~Ŋ}˻~1ک#GS%**JSSS[[[[[[EEɓglll?mz2yEEرclڵkEs믿,--,X0`ݻwׯ_;H^߼yݾ}ŋE]n]zz:kkk777#9@={fbb"pbbbtt4S<8sLtlootwyxxdeeeee9;;;;;wo;ysZY /WVV^~dv͵}]eeNCCCt/dA29`03fy<ۂ vuȑ/=).--x]&ݻjccciiy.c xnӷ-_|ǎ ЖdϞ=~699OOOOdr:.qw+WzyyLfGGG]]ggg,--зBΝ;B"kCH~T3gQ͍~wFFFVVV Ι3 O>9rmۈ|gΜ\RRB](A^~700r%%%v9sݝN]rEqOVޞmڴ I"""x<ޜ9s%¸իWǣdr@?w޵^dɰa D?`0ǂjWss/fffߟ9sfUUhqѢE999fffg%ӿ ZddҥK--+WvjddD8 o@&'A͝;?طo۷O_VV!D+_8  tz{{+WV\ݻ7n^|}֭  x@ vB^~1cBTTTAAD;'G.8qBDDS||@ $~GkSSy%$$L2Et@O&/(( %%3g8㓓C`0 @5늊  ::zϞ=\.ٳgiii)UUս{JFO8Qz IzzEtuuNZ./X,BH׭[WVVvLMM/;w`kkUTTBa\\.Ӑ--- YXXXXX5… t:n``pԩk׮ۣyF6M<CCϗHB^~Ս@vs?611!2!/ſFFFyyyc\ wj$nR!.W`ty.$ `cߺyEFFP\?bĈ۷kfjj:mڴ˗(lsss':A_|YVV6w]vRsĉիW_z2##LlEEŒ%K.\(:l2)kDzBX^^noozZÇ9NPP`hkk={,=DGGݻwҼ'LW,Xf=zmz[n1L555 . 91B"y^^^hhnllP($>|AEEExϟwtt|SS!|ꕎN&I&?1 =ƾLoX~V`0 +x싑?B<`0 Ǿ `0b0 `0`0 Ǿ `0<`0 |./`0 s}1 `0 x`0 \c_ `0b0 `>`0 Ǿ `0<`0 |./`0 s}1 `0 x`0 \c_ `0b0 `>z*::0}S^`0ixcб9yȑǏ)}||<==<!TPP033766`_rɓuuuÇWTTo~|jXXҥKwHHȠAiii999ӧO///(0`!GE9w?~ó.]!vS~mmm3f=%/xTVV^dIEE!s̱X!$$t:}Ŋ***,._,ŗ_~)'?Ç׷ UUUJJJr)wÆ +WڵkWGGcXX 55jjj3gAԮ/_|5"tvvJGGf333__1cȪ'Y|\v"N8M([(7n8|0{E@@ƍ)ssswJ+++˫r󏳳իWߓ]HHHϝ;QQQ , ZdɁIII+Vttt,XҥKl6L044hǼyQ&&&Ν2eJkk~ggիW555?w^fMfffRR\~c0***:::௿b2dݸqOwر2@d~700(//~:x\.7!!὚KJRSSNzQw(uuu _'r߾}{ƍ!C444|9MMMe_Ο?eʟ!kKKKZ[[\Ba}SNegg@OD>qcǎo̙3Fr$+̞dLΝ;y<ў={))d՗,)K?,>}x< 6TUUx 25IHl;yiE'Qd?/=' ۉhN0o޼_[XXttt_:#Ç޽{WQQhkk777C\1c\Ґ!?ݻO:E}||BBB֬Y!ʚ2e ;ARRRBCC7n8mڴFH/Ho666G .vHrrҥKH|zzz޻wH d~_ 999AzÍ7UUUFGQ_8\h/"r 7n<}4ƦѣGJJJ4==Y$@ѮW^n:$ϟ)BݻwǏD} I\ݻwOII4|>~@2IQ.Y"K䔕SRR""")+d՗,W?,~fɒ%N2嫯"g$ =)nTv'}$:NQ?joYYh///^cLNEVV߿?iff:::!۷o>| =qg͚]R!h'22r߾}/_$S١2mڴUVyFAAaƌJdꂬFr]\\D%^^^ZZZpΝ7Ξ=۷*#G\\\Ο??jԨ؉'^|yʕvھ}#kccBxݻwC;;; Ƶk @͌= ;v hjjϟwww_ٳ'//qر=q}qus8šc.Wܞ#""gh gX.E}UO̚5k̘1Ǐ~'Srg$ }dz5{B؍]eiE'Qq4q˗/CCC+**6l SvZZZ_n7ZF466.dQUUeX@MMM[[[t"C0R333tJEEeڵQQQd~;A.\hoo?hР0_ AoPd=5h(=Ez tttL|MMMGܺuʼn'&OL]߷o644[^ss7FCT:@zJUUUx ky{5 Yr#?o߾Gʪ'#B< +@RRһw6662I].Y~?ׯ+**PIQ_x&(eS"CIKKhD"~F}dz5{Ivh@v{}zۅDQĉqu\}V^}ҥl\J^~]QQABϯ"&"}NgXׯW455MMM?}0;A/^xeeS>} !1X,۷o/DV33qƝ>}ZUUuݺur,WV 455̿GI%} L͛7/22R֗@{uÇ###,ĉ(O4IYYJ755eee?~<)))))СCqEl۶Cڡ+==%KL:ƍ_zqP(tR@@$(~c2aP;eʔ3fL6E666ϟ9rĉ=ƾ&&&m{?~<ūv-u,Oׯ'OLemii2}Dj'110{ӧkhh˪'ux̚5KB{h/B^p/LJJzZ':%A257)n7v*z7&޴ Y%8q]{6M8ZLpԴۇ#ꚘXZZMtԨQ<,55=zlggޏh7oX[[+))-[L>h eeAutt(**N4ɓ f'%%A.\q7⋐7o DQ[mmmpp!C͛' K{ OG+1n 4HƑX[[۔)Sb"(uttΞ=qF555ccz90~xtx9t8yA?88P)Ab޼y&r{6oLfPHLLLܼdғ,~BWWWfN=%'!!!E/ +dLaY$ LJd"@tW_;Y}͞v*k>kF/qB6"K PUԣ珲2ĤK***,뽖֦~~D;|*z 3D(^xq„ gppp/7::|СӦM#[z]?|ֶȨ۷v>eSE9/d_M{!N?!.>-Q#/inn=ztss[-Z`0 Fx`0 \1 `0 x`0 \c_ `0oyyyKKr@IIĝ$kkkׯ_;w9Hϋ/Ξ=ɓPֿ>O|v}5yikkLC^~!^,..FsBYYYkk|oɑt*%|Bx%ӟ">ߟێޫ.Bu 9d*HٳgϞ=Τ[8*y8nܸ0̔n\vȑn`رCl...?ijqqq#S>f̘/Rf-?W.\hgggbb^|GɇijjFGGKS_?=k KB@( A.#EJ_ ZAAZ,jR/ T ҊnȡPL6 J$j~y%& +;k{Y&3ƅ=ޮiܮx&TWW@WW׳g*\.9::!;OU|zZ'BCC]\\vޭ?(ƼkAuڵ[n4OpEݿS3SW8㸏4u~wGiiiAܼy緷OCgnnyd2LxJ{bb)Fh ʕ+:Au\LHHXlYNNδLɻ{ ׾yyy0,cbb.^8066yrUW233A}Jw=չOLL XZZb|/=ݻwsrr~5/ @orrlr E"EB[XX v< S?|m۶-888???33ήRkB9|D"Qݻww LMMƔ fOp_D>x#T #88aLfggi_ԯyx9;;Hvl;A!!!jPG^S(GM۷}}}Lfzz:b|'|q1?> {~~Kaaaddݻzbcc===zzz-Eڵkd2֖f^W?|~:C?xAL&?qaY*&--mt\H$GCyRQnŊ;w| ѻ|CCC~(wk֬p8)))EEEhyJ=zW B!J ?~xڵ?nnn2l߾ֺ888ܹ3++k֭ȷI t;wBbH$dO622Zt/b_]OuJ G;rӧO3L*􃗞YsשP(gĐ JKKoў={Ly ̐T*U5"FFF? ҏ𰍍r0|Xhם;wIW*֔g/ccxC44.ƫofN{{T߿kKJJ233ZpaJJ͛7+++5O@?|^> H,X}7$~~~ ,Xh"oENLo_]] OqtLj3x#NTJ&}||ϟԾX ,Xv?OZ楗^Bzǎ'?߿?00> 5~JuqqA\x͛d2ȎYaQJENH$ƐqddV8߷o޽{@ŝ={V@vOO{Ap__4魭 ~瓓@022r1}}}re6\5WشiSMMBappN'''Փq/=3:͛gK/]Q]]\YYbUU AmmmOrd2Y}}\.%6lJ㭭nD211Q"|7yJ::z…SLMMmll~WlӧOCCC/_g/𦠩`0_fffH`o.\,0G277xH㢢"333sssGGǷzo%K888{zz,--=<<&&&iWxѷTl6N755y иogj_s9cVV=vԫ~*++033cX&&&NNNW^Sړhkk|!c5XXXddd0\SSCӿ{Gp\' 8_)ǫ}qG:CCCa~D:|4t&''}'oIR:v(NPNqwwG[nhhdzX,333:b"##{ee=VN1^}UEY, ÷o߶b0UUU42۶mBz+ܹAcW(G!kƶGDDTUU:T:@'D"]&''5'=^G~fsEsA&uuurU#yRW|=|P'NjOs4^u>{5+oG['jAnB7888<$ՎGPtuu>fBO\~]yOA}#^W?xA~'}{k^P^mH$vкX===2 g}1h\x G׼q8i/HlWVVVVV&f .NaaaK.%%%o ޽[vj6zYb1<ow^{{<}.zR VX2ֿH$ hF<5/`߮.Yx]v->:@ ZϠ6/85z@q j9҂yM>>~uEŨC4mu|-[3?ؼ'N˛z훗pwwҮP(|||>,HTۃ ?ǏaX$1QFMff&Q:wwKK)¨k{]१066yry^bbݻ999-yvʂ0l900  aDm8aXr<000&&ŋݻ;v YYYcccʏh?^zиPGNP7`0advvv>F'q\ѷ|/|>_/_PSS rvv&H믿ϟdIKK[~=At:].?zhzp8/߾};<<|ʕٹQ۷o2uJ0%׮]'ɶl6?>>?Sm+W8Brd 7/ @qY*fN[[[GGGH$A#^!X!!!J5k8CJJJQQQjj /h=h\N] Z'q jqssh>e0666WWt_PDw8k?֣B'22d2;vb {~~Kaaaddݻ %??_鼵m߾}~~~|>_X,NLL򊊊JMMusskiiQӦ^nܸʕ+b~ fX/^tiQQ=?^j}״_~裏_xӧIII l6[.+?RWWWPPX\\=~ [d ޿ؘ;N'!!sӦM֣֭o)Qj"(++ɓ---7n8ydvvT*Փ$U@mD8s -))RnAvX|pp000[lA,/h^թ} =yGqC? [/vDPwxk?ѣ=&MMM0 gggC`0.\099 dt;wBbrƚJddHe˖AT[[dDRVVaff:oMPP( E$!3g#7nXPPmaѱZ -hiiqrrjhhaxbb1ߙ3g߿hѢ7o"v}.\0 P~y/Wk~'))ѣBl?xO?5/ߤ"ܕ`oM*ׯWnAvKKK+++*:ׯ#]v0#00PG]Nj :5 GqS?Ϟ=srraw~cN󋠙?Qm^_@}BpDDד/Ree';cVV|~wq{~Xq߿o߾{*lذV*cA~.]Q]]\YY9k_}#G իWd'6m|P( Vicc_'OO{Ap__o8`;o<_ oMgUU AmmmnAŝ={6""B2DD7ߨ>h\\tON|R)rA'lBPR֭;5+0LadG>#FFF2WW %&&&::_|Z-\__pIշmmm:4GuCTWWYkomjjbX,Uff&bwww_n MMM `455_233FM;IIIK,qppWXZZzxx(Ocǫ_\<}444t{^뿹ftSSS{{{zyA#o(*Ν377p8YYYJ;hbgLMMmll~W ,,,LLL222`S5.gz FuOT=8 5"H$Çѯ:uq\ѷ]/ ,̌NXH^YYhoofS GDD9rܜ566"W_}bh4sss۷ F}}}UUFFRL&~m|CP~ R( )~Ǔ'Oh4B@I:d$I+8=^ѣG&&&&&&Sy^_𚗹/PޛU:r{/^yqh݂ qEc8ϡglwmzW_ P(++)푑xWf"R{ S U\͛AAגbPO?iRz_ldd1gq3LB.P%G% xQ (/zbtt}bbB;1-粲2H4?.\(--H4<Gdڼ'NaooK.~z{{\.sttp\?㉚7#G ޼y緷+?u4qͶ7TaÆ+Vh.[NS}bbb`W Ç%j{gbbݻ999 y7ݻww LMMƔfOԼ`0advvvG\y U?(ql@q),,E^s\01kjjjx<A$CCC~Uۃ ?d2U gX-ڵkǏX,NLL򊊊JMMusskii H(r8|V77}|=q52lkkfm |>O?:::BD" BʼnAZZ!rѣGd&{$gI*AP~~~HH u٭XsΝ^RRRaa!U75k8CJJJQQQjj fOԼF&''>|X]]`0lllߺcAՎf[OR Bxq+Wr8ggF===L&dرC,c]\\ ###vޭԯkTQ}7nxX?†?Xŋ/]Hd+###ׯ066k!oK$𼼼۷춶(,_<..ϟW^s[d ޿ؘ;4u.[RRBRj*]@qPD'OܸqɓR AM,奤6~:1֛P(,//BCC ԸAwܲe b1s=J\.tҗ_~[o!1U3~-k\2'$$tvvnڴsݺu3W?))frR444ݻwC"awp6nܘ;<<tkTQ]DDDKKɴcX]$DzDjժ{W JOO'Ht:=++fZ[[utty{{>>JdBD".[ Ze*$]O!uG;rӧO3Lc3 =oў={TO((((--ש(jvByJ#olljgZpaJJ͛7+++}>55LL IDAT!(UTT'''?{ a++c^> H,X#W<PMk߽yyyO-oHR2lee3|F4̺EcqGܹ茌 """_cǎiw?ܰ0PgϞQTŋo޼L&ȟ yARMLLT+fe~}ݻW}eÆ Rt||Wa?y򤋋 B.--/_6M6LNN>x@(+촱qrrRF{\K^~!lkk ץK222+++{{{(7o.AF߿wYuNd2Y}}\.(nwH%7|?㉚7R)ĉ[lP(jo݂>5{]󿧧{ aN_Wd)))999QQQy< d29&&&&&׷aTNN@ 9v þԶS[}}}tt… SSS'''UJLLuvv>tДvf6MMMMo޼S< ,̌NXHĎj*$0 dׯo۶:t;bWY,F377gX>>>0 ߾}ʊ`WUUh4kk_uzR_4,Yj鱴𘘘Ц=^?Ν377p8YYYSJ-yM\k;>{0 '$$ب%SsYXXX,''WX*q~XXXddd0\SSCӿ{Gp'j 266 aӧnnn$J?[yLS?(ql@qyihh=<<٣͐uݺuCCCTUVV::::::۳leJ#""9ennuSE၁WWWcc! P(Sڱ蛇Ο?_S'BXXXXX޽{ šD32D":=^?r޽{/FYPޛm൏祇_y葉 >TG&@\~/soُH$_{]GuLuuBեa @͇yIBEsaAB~1:/x/g~f~$^Lc~A g[W=3c}}}eeeeee"h&~pBii)n4o{644{(BBBh4U'&&h4FP\mG366uxx#{zxx飽~pѓ;o<2L&[sk:Ihj6zY-2}sQaoo/xN :a3h]|>ڵkniii~: cYs^p t\i=pXXҥKtzII b9҂yM>>~uEEm^`1-[3m'S8q/o굯B9|D"QOLLܽ{7'''99Y~ƍ'O ׬Y#0 /5)$j_PWW>11100`ii)m:uJuwyq E"զd}aFÁPðH$y:azP߽{wǎ4++kllL)ǫS08ΨNPNG~bbb`G #88aLfggi+/~~pl; k/<|CCC~Ud2Umغ!R>d (???$$z&!,p8_|b}vxxʕ+9scc#oe23k׮d[[[6]^^o{]`~z&''GFFu/hDZZ!rѣG,|`ʇH$G>G` ZW]]]׬YpRRRRSS,Xթ_gyQ'_qMNP555< gggAF|auu/FqͶGz&*===L&dرC,c]\\ ###vޭ\'BḸ+۷֖+ʼn^^^QQQnnn---jkߟb-^xҥEEES(**jJX,KII3*G}ŋO>p8OJJjhher\bdN__ߒ%K\.ƬwygtttJ?999G^N8CN~@;-3:5hiib2vvvy>GNQQQ4) n_T pl54ijja8;; q…IL&Hܹ ///%PT2C=l2jkk,Y"H:::̼[[[Cz`E!o^z 899ٳg0 [YYEDDL_/! h }QnnnXX333JE%Yhם;w&ɓ'T*U+g/ccxj,Xv󟪵@,))̬R};jݿ/66w1 … SRRn޼YYY?Gy5ڿyyyS-S__Ǐ;v9%JdU``0VEqͶGz@\JgϞQTIŋo޼L&ȟ yARMLLT+LR$ ᱱ1z9aÆZT:>>1ŋQOk߿wiS^{o[EEő#Gիe2YJJJNNNTTTssLM6LNN>x@(+촱qrrRF{\KO?r]T?uxu^t)##ٹRyA~͛gKAjpp@qQbbD"oT?58N::z…1((844OHÇO_]u~QÀf[W=yL xeffFY,Vdd$bttttttg.@#GxyyxFꫯX,fnnb|||`}hHHe2׷m:z&_)VgAv644DPt!&Pobb~d2D jWCu-ȏ:gKlj>[x1dxg]Sxqyxxx``XjVUNylzBѼEyW^yEKw^5~A@@@@@@@@@IWWWtttPPݼy37ZR\\, [[[~'[g,FFF37T(ގy_/Q(k UR6vz{{%LtDApBii Da^zp/PQ(]]]j;0w偙A͇d"I@^/t])[<PkV?H 6X"%%E!|1i굯B9|D"QOLLܽ{7'''99Y~ƍ'O ׬Y#BaHdaa1222|>_&Е:wwKKKXo{]/?}0 D"1::/@/@y;?$''kza偁111/^T{:Q[__߶mۂ333*++ Ը޽cǎ@`jj5666xN ðL&~S[y U?(ql@q),,E^s\01k롡?pv2zWp6l)=:::BD" BE#,kѢEvz1bʼn^^^QQQnnn--- B⒟to>???[[[>ȿ0׮]'ɶl6?>>?Ih_HKK[~=At:].?zH~ PHғ$T@kkkO^'z[bΝ;{、BCB5n:;WW5kp8 (|ח`(?uPqͶ7~r +Wp8΍{zz"##L&ܱcX,ư绸FFFzyy޽[_: T謁^,kK.-**>(EEEF9s喔PT?ihh{א%IQQQxxx^^_~elv[[[ll~/_w W޹sGa,YrǷ~0766fee;33q ?xժU)]$eee*J&.H'H˖- (((V DSxrQ\L&-LCh_((((--ש( џ*(=z)B!JTsԩZ"nppp_7UPF}W^^uLz܍Z@qQQQ4) n56aJp?^vǏGGG---^:==);;qSSSoo/ 1 .LNNd2D"8p`ΝyyyX,@ ]4DQ)Q},Xh"d~-RcSSSK/!ƾp”7oVVV;̐&@djjJ&R)Daxll m,T*%-R~sNDDOPMk߽yyyO-oHR2lee3|F4̺EcqGܹ茌 """_cǎ)?= lhh裏rss@={FR]\\?/^yf2 #2 J511Q,*uz9aÆZT:>>1ŋQOkګ!lkk ƿ 0<>>~I ]ZZ/_clڴfrrB088XVgg0/^zhhrҥjgg^c30o<] (ݿ7..ٳjlrdz\N )L Pܦ'&&J$oF5oHR'lBP.ߺ1}%8k?OO{Ap__F^Z&DEE577c4x0 䘘__NAvS999`ddرc0 *RzOo·Rl6N755y-TJw5?sΙs8GGǬ,޵$>>btؑU`0VZaLvm۶CG쯾*Ţh,۷o[YY1*fmm믿N[ ERRҒ%KU===ڴǫ__PQK^uuu|j`w\Z-O IDAToa!!!F-9<뭬̌b899]zPA$##ᚚ:+?Ktuss#HVߺcAՎfUHӧOCCC/_g-=666~~~֭Bzޞf+ GDD9rܜ566"v]4P / BBgQr޽{/F>|8|{w~d2Tx ( ?芮y>z^6sy葉 /=/׼x |j6zYwꌍ?sx]O> Ϡ:S*nذ! `Ŋ)))S+z@ ˖-ə)ywO87ԩS5e^^^LL J7e0666Oo}hTo;. s@:+B ls+Wr8ggF===L&dرC,c11Pp\\\[[[gkkoD//T775m굯qNNѣG===:oܸʕ+b~ j,**R}t?b/^tҢ"MbdX,{{{d/vp8iii7n ccck׮*-- O/I__ߒ%K\.Ƭwygttt&~t_ D"QVVɓ'[ZZnܸqlTjH Uyyy)))Ϝ9rKJJT*d% sss?P;0>~Ϟ= E"8;;ڵ///&iggpIIɭ[H$%ɪUBBBT===!Z~}mmΝ;n݊|D!"Hعs'A^^^,K D"Lvi##K/>5^@~+W<}4=?FK?:ٌOjP(gĐ JKK땖GtPssJ]ZZ:sLwڴihiO"&&&&GhppB1m8Ngg'(ν߿gϘL?ۏ_qqq%v~ 6&dRMNNb$$$xA.ӧ'&&޺uwՃ~vڥrOpڿ{YYYqqq%%%O333/_k &)?V^MavOz GL&zF!244b=1qJ]/wܹ}v+_x,[L*Dlv}}=… 2 ߞQ[[;00p!A嗯J.MM]V*--d]]]!!!,,,f͚|=),?k@~!)S/8::޺uK\{ƞ}zBB(=""b߾}>>>UUUhlSSS>~zcc+Wh!5dǎs̱;}|###'_6`2_ l\}葞q8H+uVccc ~ :uŅ秥xө~offfbb񌌌f͚7w!z\PoY333##AJKKl7W"8qSlhh ϝi4޽{.?a6_$ g}Ƭs`:?5{m۶iꊶx7{zzP{\\311a<oŊ֭[|>+v1z-bLMMy<{.p8,kƌR<::ZPP;¤$gY־x񢩩 }ֱdcUx OG҄O Q\\D&)BAHe2NiOVd!_^+FGGr~UDG^xx%c RY׉KBs_~MڣOjbǩǴ&,,zd9***88mհ ATT%KUl߾}ٶYYYhO!D,k׮]Azzz-[^Y{{ '''O*8qCYlkksssǏWa!z BPx;w+ i1Ǚ円.\@xN¸aB|P+HPX,:u*`<}߿ܽ{155ĉ)))Bc >}Z ;wnŊ[lQ舉qwwliiׇWtKKK{{7o۞B/Pqt:I~˷~'(f>D% /]frbↂY*N%h4JU_u'h";;iӦA','~yz3fS7d#q9;;X,Lɓooocaaݸ&U3Q?w/\ѱ }KKˊ+6nׇcǩZ[[]\\ӧ띝wkii) _{xxDFF&'';;;թhS} 322<>lWH\}}}?ckkkee%jߺukSSӪU|M kNyyٳgrrrЌ422644xvvv\7o+Wfff򡡡ŋsܼ'NGkEGGǜ9snnn'UUUZZ|0880(*xsA~y)ǎSrD"QZZѣG]vtT#IrssL&j\'P?Nuwwٳg͚5E:DחɄē 9y3.\uůzx- ?cǎʲ2{{{\X*<~Q"a޽{111]]] ^^^.]/kkk_8p@"dgggeemذ7Pgw\\ܶm D"qttܼy[ArssܹDDDyxxXYYY[[+·bqooŋ{{{kjj_6lpww,]L mڴ)--mڵ$ hw޴iÃ֊D>`ܹ ^B ̏}…}cHO5_D"H$H$~~~'&'zټ 666a_ysݺu۶mF#z8q͛k׮MMMAk=$ك^JrmBIT< YdddDDruuEZ&͚5+==quuu[[ sLtz d2t i4ZLL̼yeees̑H$&&&S`Z*iӦ-^S73gδQXtÇ:(O:(((ظqKd2#b``O( [XX( N농>{d*ǿa\\Ѕ]~ E}N6 _~=l_pMMM-..r*_699CtN>=11֭[.'{ャ̸$oQQQNNNBB‹/r1!$u%Jt: ?ԩSWqBτk׮ʇ~駙˗/5~W0;z=/IR&^$h %X,FOnܸRן?^V;wܾ}A:::4O l6}LoȨ8t ށW_}%Ν;Gȿ*V*--d]]]!!!,,,f͚|=)գE~bAQ/˖-+++JڍWא_`\x1%%֭[*+3SLo0{*o_?NJ%ɕ+WhO~Xkoookk=y9ēI<T*E;9rd͚5 Ce)|\G&&&fddDFF4FdAӣѭ1" FtttTTT^^P(tv;߾%$$XXX:;;8qB+TfUPQQ5}dL?<,,k۶mĿTWWs8S]]?̘1  ׯ_rf͚>}zBB(=""b߾}>>>UUUhlSSS>~zcc+Whucǎs̱;}|###'_Bz`YSScoofmmm _:. H||cRRKӯ!k`8+ AGg0N255uqqiiiEwqD=Ξ=kfffdd Hii);qtbꙜq֭[-,,~7d  y3Fۻwlܮ IDAT|͞LLLl6[bju] 걷zX,SSS7|A޽r9NEEEqq1Ś1c:%GGG yPl _:::0]եrP ӧO4O*]WX{%K;VrC bL>::J;=YңE~ƥ>_P ǫk/DmR!?~|3z8QL|#gOЯ<xa0l6[í:;; .vzLk/_|۷FsssTTTppիDAAAAAAAAȭrrrZ[[뫫'G aA,466N;H)(((((((^sȭǬkkk __xxRPPPPPPPPVP/F;_oD꛴I$u{GG}0?:?((( +??C_|!K,a`?Q?Dۓ.ZZZFGG탃 /3cJ|3Oƚa_w6_`vsx'ykl:"Hw9s&//4w*<̜2e N#l߾}ٶYYY c[[?~߿|sܗ)EEE|>X?}-YC_|!E,aHe˖.X 11Qk?DۓH$ eXv]/円.\P6􄅅 -[tvv*ܬX,`0._<))) rrr:yV*/-- Bիw W'l`8'L'߷o_]]gaaP(lhh Q ByN&[uxܾ}{֭]/~#GZ?~9宮###}}}AHdff600ڳy𡭭K蚈ԾlٲE?}M6_,= ˓Çv388D=<ظqc```mmmeeqZZАb O|A'8ONoSS Adttɓ'$A(qcIdP(iK.FW JKK}||4!rrrAYY 44T ܾ}ݻ .tqqqttRl믿Z+>>ӧ???>@wuuuvvwrrruuE_ҢŠݿB/,aS oZ!ڞ,t~3f(۞O>D=e5Kw G3CM7ѿNX߿ҥ6-yh";;iӦ)\x ]:8ON㯳3ŒdO<)))p8PǴ;IUa&N}IKKˊ+6nׇc?}@ 8w܊+<<A 9[655Z* 7Ώv'?}}}YYY*988̝;7;;5DG]vѣRT###LN<9v옟9ٳfԢq6_pNuŽ &.0\.x_~zS}yf'k\D3WHҰ0Ǐ766J$X͛]\\߿r~N߻w/&&K+66ҥK_~emm7|s}H$𬬬 6*T_m6!H7oFjݺu۶mFϷ"""<<<1 `ܹ̓K0?* ~gVVVh0bqooŋ{{{kjj͵]ك^<JaC$D Djaa166a_yaA;w7p<9{l^^^EE?͛k׮MMMAk ǥO|G: ;b'xtbFFFFDDX,WWW8%1$U& J궶6A̙32 f4mݛ6mxxxxZ :ɤ*?h111͙3G"766xzz+.[jMx666[M>=11֭[.N>|СCߏ(~:<<ڵ+((Ç~iffѯ8aԩCCCghh`0X,;;;ip:;;׫}T=Y0..N <ԩSQQQ)))7 '?EEE999 /^@墡6mzJX[[d@{{oLLՖΜ9UÄ̓b.h ?̌+))Ÿ /8H:aAONT*\.7((hSNEkD- @y)SLȭoϟ _',O.^RRRx- <>>^"\rEƥO|uvDSW*GYf PhcI׫RL8:2tztttttwSS 0;UFFFmmC0a0QQQyyyBҥKT~`aa| v1g;;ӧO+N255uqqiii {EEETTӓe2KeM`UtWWWT@@oӃ ȹsL 8δiܪYpsq8H???k׮p8Zcll?#mbbbjjׯ_oll|GJۿ---gѤ=Y0?ϟ? ={m4 dQSScoofmmm u֭[-,,~71>>1))IG0AR)?ѿNX(rTY333##AJKKl7If{l[[۬,]',=_|ܹslvnnK#Amll>}a{!k`RRRbootI=33sʔ)t:N@WYͅߏש:&l٩\ZZ* BիWܹ# ߯<@\azt=ollbX,|2~& WWW),, ZKxܹ"FFFŪ@}}vrrZh]bbbvvvrri sCr`[xx8чo2Xt^YY944o6o+WfffhcΜ9g77vr㿪*-->BzV\y徾R_^ʱc_4448x𠻻{RRjDiiiGvѣGӥR$is?N?x<sfgg+8swwwPPО={֬YZ/?LNGk###_縩*:ryTTŋף7y矻2L|x5.,?%Nr=eee666֭\v-00P,bcc/]_~7DZݻե$IvvvxxxVVֆ x !(P}ك"IR4bwŽ555Bmڴ)--mڵbh4NKKokkhw޴iÃ֢Wn(tKd]rQ/\>?FC?DDDyxxXYYY[[ ;v쫯ڃٳg***m۶1 DyfWWױ1ŕ- :1H$***$_hh(z g}yڵkSSS}||E(=ځ Hnn;w~D4b\]]BPoqSG(֭300ضm[uuZ8cƓqQ6ɯgʔ)III[l):g3o<@pppYYZ&IU~^"766xzzzj[TT A\nDDԩSQQQ)))7jKkʏFMLLЫccc:8p8&idd|,llldWٹϞ=c2Xo?~qũziиtÇ:I:ׯ_swwdrssSSS86mŋ;WWW[[d@{{oLL b܏ӦM_~=66^VVVfff\\\II j00=8yH(--9s&縩*:R)NrAAAϟ:u*zpO0 oݺH %ɕ+Wi>^<$Ev?^8qzЯS*GYf P@wqͣn@ww{qH}Zbnn>{쑑Mړ/YzHSQQ5}dLAQEEh^ /< ___gg'Nl#=?; ?_p||cRR7ٳfffFFF)))7n(/ӣQ'nRf?bS?qDtœi4޽{(yt)SSS> f1I4: k3ɯΎdr\<+ IDATeĖmmmwrb͘1~y뭷x<255xGhAA;# pz>}jdddddD*guO<:u²bŊݻw/YD_GbrQFGGi4)8=Yg~;;;o҂Wr\%A~!PGG)Odlj`y3!yCWWWa' 9?vppPY qI|˗o߾]zjo(((((((((^ rrrZ[[뫫'{a%!!!Z`ee566^[[y ^5KAAAAAAAAAڗZ(V~YH߯n_,jOYz?1"mmmD~IallY1Ch(`+//744p"J-[`D۷o={mVV߿|sܗP*J'Z`!K!?"(44bڵK[󿭭LJ?~\PRRbootIBhAYُZS^ZZ* BիWܹ# ߯<;.;~>:z3}? BaCCjz<'q\00{ff)St:N(DlzpD$|0j_\}yܹs111g777EtvvhA>|hkkR C~FFF:qf拮 Ӄ禦& 訵'O8 ~X1qtǏ'>L6=8RK,!EKӡ3fP6S ӧOW^ 閖7oD>>>GGGЀ(w _pcUUjQXXŚ9sfttᅬAyyG}dmmhiiYbƍQ#^__sN___KKKP-quuΝ[bǖ-[x6668q"%%СCrrrAYY 44T ܾ}[qX>՞B/Lt: Ғh4}uؿҥKl6[.+;ZgP5t%8vy;dĴ;99-Z.111;;;99yڴiZ v\w|Pu;̼]3,K&=y򤤤ۛXXXh/!pLc9/jjj4L6=uu ^R}v@Q־}}}YYY*[655Z* }mj3gͭr˗/㏭ر^.BBB޽[]]Ԅ/++sww055Jaaa>>>?nllH$+66ҥK_~emm7|s}~t?۷o=z͉͛7߿ʕrАڢs~ݺu^^^===k׮b-ƥ`@V{~pWUU}C?wsse25ǎ#DM ΈDG]vѣR\I 'h>ywwwPPО={֬YZ;8(We:0=8򨨨/~ׯG3?UO=[T솆twwOJJijvL=uѺ^Bihh>~xVVCPB΃ٳ=Jhډŋ l|jQWWaeeemmEEEfJOOOϞ=KOOG+3Lbhhe@XX At9sL&ƴt3o<@pppYYٜ9spyGFFh4ݻ7mx>>>6mJKK[v-z֫@A:UBZZk^B ̏}…}=!vn:m۶UWW+_5gϞ˫ 3ufllLq0/͓Ih>o޼vTXŸ`fǙGDQw"0=qDFFFDDX,WWW[~?{ qqq۶mc0qͮGfeggGn~~~W^FruTkߢ/^ r#""NJIIDDDlܸ`cc^ܿm >tPsso(v |᧟~|a###G(*M/^`2at:fGTJL&=7..woMLL-[Gp8 ?FFF?400P vxxX[ DžHʳgϘL?ۏ_qqq*~0C>}zbbbaa[}ݗ'b.KsB댭mrr27&&t=D!'h>{wWRR;8(_x`Y*t.4S5~3>롆キ{vE10mڴŋw׾Jf݅~y݂_;v,11睱p޽ؓ'O*A:::PUJKKe2YWWWkk+zQSX,޹s0DMLLȈDŋE… ʷ䪃NGGGGGG{{{755!}ůos;w(񄒑Q[[;00p!AQ;ͮtww_pA&<==ioo/((Q$MMMfR~_hwwwݻqHŋSRRJJJoݺF ʔ)S0o?Z DuGK$+W(Bt\~q):a/l:JR)Zp9rd͚5 Ce]~Oh#q\00X,F]]]7n@dӃYwh^ivvvP( S|0uVccc ~ <<,,k۶mSncǎ9sٝ>}Za>}zrrL&{ZXX===144_~AΎdr\s->mmmpwrb͘1fr3f~gΜYUU HDDľ}<<ϝRtB =3p#… T*]lY`` o߾}ٶYYY/m(/_ްaʕ+9k<Թ}֭[͛1NW?Ö-[֬Y駟?~AFd(%۷{]]w}o߾<{L;o@b{~C,/_>w\60@e˖NM6?%%%AAANNN'O$?,SLt:}E2z~/,,b1˗/vHbvڥMwab߷o_]]gaaP(lhhЃNBq@(6777>.qylvثTT:͑AAAdIAAAϟWϝ;~vssS_yyHggy__~{(}Q``;wܹ|B8kߣGΟ?͛o^h+jOMM<'O/^iӦa-\DXgeeEGG#C[[ۗklll{H$/mL".**BD$q8ArpqyX]89\hH$B?>#22299ٹ떖+VXYYYYYmܸ/;;Zx |]ooo++(~~~>vrrB?33۷kB zyy͙3}4!?d'P(/Xi4ZCCoO>Qx_t)fr)8qd555[kJ!<<},ÇwtN?_8;;;X,Lɓooocaa6:8hii4 .qylavثݻ .tqqqtt4668q"%%СC6999 *n߾yQXXŚ9sftt￯A\\xZeee%&&طnԴjժtcΜ9g77v0;!JJJx }iigVUU3PVVkccS[[ajj ѣG.]ZZZA:Qn߾_~嗿v| =Q?8>嗆kX\}}}?ckkkee%988̝;7;;%Qǎ󳷷'-,twwOJJB"(--ѣuuu׮];zhzzT*%W>8dggGFFo;aqQQQ/^ׯ_ѧNM6:aA?-77dNNɦSdB_@cǎʲ2{{{\022644xvvv9u뼼zzz׮] wVWWwtt455)P]]},}uzz:9sF&tNKK_0awwwҥK`ʔ)III[l1O2e̙3fpwwr|>ŋt u DOɺb_pg}fee{~0DDD]] H$D/44T:9{l^^^EEaq۶mH$7ovuuS\2/  w|cQQdddDDruuE 88hdd!!!Æضt:]*4 A!CCC@BׯL&Zlmmׯ_OP:;;D/^̙3GSST%~4WU'J`` zZ;I0?|@`2&n?y`~FGG/iS;.XÇ:tŅGOOO===+++enܸ1SR\\ljjJsX!zzz+Vmmm! owAqFSSS__ŋϞ=!4sqAueΜ9EEE6mA*ZExJ@ݻ}}}+++>}_(ߌBGGsjribbal}}cǎ߾}[rQ<ö֨ӧOc˳g BԾnݺѮYf]|;9=J \ɓ'7o~͛ٙ ѣG@  FDDDxxxnnH$|2q?H􈈈wwFBhiѣX.p'K'~`hll4337oQU,=?JGGǮ]v1y5k֔꼽UtRrrrII]QQǧ4n޼W5kRZ5A .LZ GQT*E#Glذ`(@n ꄭ̬Ne-ԉ=;a?d2 /^DM6D@p۶m300033Qh"gg۷7޹smll2331#=hhhXt@ Xz{g,p8^^^hF`dH$JHH r l6 EEEE<Y[[Tb---+Vp;_] IDAT8"RUUp8NUUՏ?hhh8wz&ijjr0?.];fX[[>~q秫 @ۧ*qY:x###GGGM3SuY;ujU>{0y^reOOэ7LMM͛7gΜ8mnn^d9z9zeyy]@@A=zr׭[ Hcc#p8yyySVKjżxB______ѡ/0>RϟϞ=[Y̎*N1߂{{{'bʨ,?|d4M9GU?yioo/tww3G{ P{{;.⫤f固0663[[iN$EիW&&& ]&aWWDN[ZZꪪ~'NAAAAAAAA%h7b||<88*|)(((((((P})((((((((,P})((((((((,P/şh, ׯ_+7'پU"(uo|5YUCB%?rL^JYظoyǛ@#qEK[bWnxxիW[A,zfXTTo?a 3㨽=/////O,OɄ={6774ww>+//սx"fJk֬YdI|||;v8;;[[[gddLؾU(zxxxǏx6 y<ze u$Wz UX,`0\2W*Kdp(bbb:;;?jjj}KJJ|ӧ'#qS~~aۂHT__f͢t:}tX,`XwV؄ 򧴴T$Dk׮ݽ{W$%%%d"X`\XX X,p8v⸩OJmcc#GD&YZZ=\:?=?H'O A9֭[y<FMt@ (//_jiiiooۛ-Ν;&=ZnݢEbccQ=NέOmƍ666nXX$Qx>^U?߿'?4v\Ly\YYYyYl\r ,Bb855ѣׯ_?z'R)9v옗qӀ~U۱K.}7~!*F:uuu<⒐0a{|Eww޽{7l؀Z0.X?66FX*zxx<{A"DEEطn蘔v>NFFFvuua-Zu寿o}1с$IVVVpppFF͛~my;x޽{/R=/_\b˗/MLLjE>پ}{UU3k,]]݄@`` fG_tڵ[XXTWW{zzo[r޽{.\)ESdQ/]ԩS m;.AwNt% uK,⊊ D`ff6>>/<|ܹ܊IQ0Я|%,,,$$b999tFGGo߾`H$;;[:99@x\ܺukƍ)))h5q O0C$W>^H7Hԯm,/vUחe˖8pp޼y'Npss#h\UUڊ ȉ'ٳ0;Nh{裏\.d2th4Zdd… ~~~eeeϗH$yyy nnnuuuW} ^~ iHH̙3-[Zhc(s̉/(((**ڴiAQ> ]qxxX#={@(;'J7oެ*&)CqK_WW7::ZPSWii[oeee5ḈUdqyzz顑Ylٍ7mmm!&'''%%tB;n4_V*tSSS__ŋϞ=4bŊ@x\%%%S,zf0 )?1Eٮ{n__ʧO~AAAƯ_f2}kkk~z:o:d* 60L$1FCdhhonnb9ö֨ӧOcpqqyAvP׭[WZZ:::OܾC⁩|ѣGCCCǏ/租~J?!|466͛7OW'Kq1q]pa2<V/0`ZfMYYT*Si֬YʗK.%''ۉ>*ͷRvȑ 60 է==uMF<66V"|w&?.X!666L&Ԕ内a577/YܼL&sGOOO(VUU;\f&B|@yddd2D=HR6oM~h ㊍577KHHPh믿jgآR^^NlG>*ͷ~~~4m߾}gffpI^]]luAAA>(Ϲs猍)--e7oޜ¸;e=3OXTk@?L ]V?Opug닓zz{{\GGGs\CCC6rCCCQ{QQx|>2~WWW###wyX,###.xbA>4222~ɂU"(UfPM.ÝWa k>plQ7>>K,ocgggkk댌 k``bX,r )"J㡩),,w:NpժU1)| ~CXbv='%%%|>ӓل,/ BwqN& EyJOO5kN}}}AAA ,`999{zzALLLgg' "H$]vݻ"())I~ K_|]w4u%]?z~ahHT__?~'<uҞGbsζm.\^>#G pf<|dd$Z(byV^^422ibbۋگ_>00^|X,&?Uz@.[j4LSOvvvLL )fX>^U?d!ȓ'O&3Ç""9d>d---bcc~Ni~aq=:322"""y5f_x}$ f|ɖ-[|||jjj*++ RSSn-ޞӧ.K_%RRR^|yCa8445&&sKK@ Ĝ988ڵ\$a7ykތxm׭[>.ϟ?}- 6ʒ4̿J[ZZr\kkk{KK˝;w=ՠ}Ν;+++|ؘǏgddH$͛700=R400ٳg $** 044b SS\??'ON'Zń0!O>dppp:~:.cǎyyyާP/R(0Lfb855ѣׯ_?z'R:$)tuu<⒐:׮]{ʕ۷oTVV{q\[[ deeow 6>.X|; @1/)a籱K.}7~!\y~U F?3qٷn蘔v >Ȯ.E.__|?F?o*?x޽{ѯ8R]:::^|bŊ/_VWW(l AwN_%lll>ԍ7g0d2٭[FFF-[vy8q ۤڵk_PD"khh044tss?A'N8ٳgGGGGLv) پ}{UUyDZ3:E3'VaUtt D"ۺu uuu?bX\QQ!Hߺukƍ)))hBŐLU'ɬw8 aXNNN躣Ud F?3A t:F۳gG}puur555/WL&N+qFEFF.\WVV6|Mڷ0;;;..Μ9  ߲e ?~6(--}뭷&?ttt4{]zp͚5ݻwVVV>}/HOO B??vX||۷_"h4 CCC~)0z^~d2vt: ;,9NggԂmNO~ՍVzG䤤+?]}9smڴ :111+ފ+{'''-I>|С&䇧:3/[ƍ￟]RRH?_XuA%E?lY*tSSS__ŋϞ=5qW q\oP3#Q}pL&S___WY\dA&b9ö֨ӧOc;ٳgAۅB!j_n]iihWWWKK z… ' O6]WWxׯ=z޽{l2L&_3M6D@4 #"""<<<77W$]|mIWp:؈ _cccϟr |hll4337oIn~d险q]t)99ήuj~T,0ѧwww?|g2[͚5K×櫎4OWW͛7hNL]v؁]fMYYT*ccc%w}'g 7غn0Bpq,JGٰaPQ}q_qAό@PG)`vtC!HX?mf```ff?=00pѢE۷oosdffۥR)ƽ)p SSy͙3'..N&!tܹ~~~[ou}A<== IDATW\Ӄ ȣG\uilld2'//AL{D?00=EEE<Y[[TqVV )BCssdړ/YzHS]]luAAID/9sёa2Q|~w|''OTh=:+**̙8::*866.!!;wX__?99AR6}MlRƥ/ n; C:k{w=Un`` :o߾);y1\+H?B$::l.a~WWW###zw\.222r/Fb͝; )~Gz^x`766Vwuum& A^zebb"nhhhttf˷`X=== C ڱc=NL&X>d2idKLVcccϞ=ŽKjooתa+iooxy`h>?a ڦL_?gjunk ݳgϪUHSTaho"---uuuUUU?bOAAAAAAA硩)<1%ͤߟ=Sb)UCR755)?VD2d~qJ0 hooǝqD;,ڦخI 9<<+5*75ZUh~T &ܻ^xH5k,Y$>>^;322=== &&5X,`0\2=FCC`ܹsg۶m .LKKS7X>^U?d!OII ?}NZ[[B;~d%< qnjj}sg͚Et:zKv `6a7KKKE"H$vݻwE"QRR@~Ytq;uD {n?߿}[PP Я{CA IIIJK$bpj߱1__߈ .`GFFB!gNNN###&&&}|||H$ί_>00^|X,&}H*R"X>^U?d!Ç gppOgggKK ظHŝg\Ǐڦ3###""AOZ[[cv~'Olٲǧ 55uhhqwXM'[pM622ɓ8pdnnnϟ?BB0W?Ҫ-A*q޽UVgBpy ;wck k׼t9ϿujzjOOm޶ӧ=١2//ɩ533S ?>445&&믿Xz+""?Ƽ=x944b˖-z_---퉻xSYUCxxX$}WիWl'0y<FGwj ;HWBhuuuQtzxxh4Z}}=jG<_|M|||VVVbbg-ԉkw&qFӕbFGG?^RRp̦֯J{CaxAppҥK߿hhhHIIyɓ':^-Ν;z eǎ ::Z}cQ}{{{322۶mkll\nʕ+Q{{{B }}=.kkk`,厳u=y-Z=>>N|qQQ֭[֮]066644okkF[yys߿fT* xYCCD""OYYKTTUMMMZZ4%!O>dppp:~6cǎyyyM_~P(a2iO6M,=zG=qT*%W.iiitqqIHHZk׮rJoo۷[ZZ*++?%؏yw 68kNMO7/]7|ᇨsM~SU?d덨f>lΝeee|>ll oiirmll|Ezzzׯ_cǏgddo,rܚW^ 8qW^^yfիAUUUkk+ 'Np8gώt~a~f͚ r(UO!uGtSNYXXuL;w.77b>۷WUUGF}ycg>tfNFGGo߾`H$;;[:99iΐZWWW KKKInڸqcJJZ[8.~'aI'窰[8y`B?$Mfe˖8pp޼y'Npss|G7nDeWOӱǪOXCC׵k򗿨u,oaaavvv\\ׯ155 9s&<<<99eǏm?~6xzz%enܸ!괴 ֩`0X,icc9dc`_X{(z5v/Qb?e``dN~ՍVjGq䤤+?Ɯ9s 6m4ɭ3qNLLyzzFFF{ފ+{6t:Çjjjrqqy?ݏ<|322ӣKJJwXM'[`&Y ⦌T*馦/={6Z#j&oq#,*!q\oP3#޽׷ӧ_|EzzzPP7ttte c/1}}cǎ߾}[#QÇmmmQQQO˳g BԾnݺѮԾf͚2T:<<\WW-˅ y¿ξvږ-[˱jjj: ׯd2A.^(~Vwj~h`hll4337oNI,=dtRrrrII]QQф+..tww?|gjQu ga֬Y=`n޼B]vر; ۏy*H$} aq60;ld TGٰaP@}y ۏxq)Ll2L&?26]WWx(ͭA|%q=fcci&H(9"n۶mfff?3j-Z}v;w?Mff=66.!!A.JltxuCCCSSSSSSp ݻ HHH]]]<<<߿nR^^nooofffggA*p~GCCùsiQQx|>?55r l6 E~q0LSSS.6Ph!|hnn611qvvL{%K)~?@yy9Μ9cdd$WyA_<==N<)V鬨3gNbb(fG<600.((@OWW700@7~UxS'~ǥ=,3o+W>qㆩyֵ̙K,177G/677Gŭ=zr׭[ Hcc#p8yyyjjxB______ѡoll`f0.ss;yBCCٳj*OLLL&N1ߦ?|d4M+8=YgF5663[[[)0Sqm=::;;0fp?A`l$?@Q7,`lOyꕉB*Nc䢡bhp???P~z9aP >*::: {KAAAAAAAARPPPPPPPPP@վoss3vSbYb1geoz o/Ϟ=;MϚWA>^U?d?MMM?RW翵U"(۵py \`:a_m nr|0? yDQdz=/////O,O1$uw>+//սx"fJk֬YdI|||;v8;;[[[gdd{zzALLLggQXXjժ?X駟9rdRRRR4eL7X>^U?d?%%%|>ӓbq@@ڽ{: Bwq`6USS>k,:NGՠщ<_ZZ*D"ѵk޽+Bָm W?I~x?ZmAAH$rx|>KêrΝm۶-\0--mN&DnBpj߱1__߈ .`GFFB!gNNN###&&&}|||H$a鐝3~dWYzfÇ gpppPȓ'OῳAXlllߏ322"""yVqqq 9~we;~>>555CCC& w}6aqMr7?9? 2SW%w w\VUl"H/\󐙙$厎ٳg Ƌ/׮]|>֭[ի===9]U###]\\š1{KK@ ̔oK:::ݿА˓'O&'':ta׮]kll rVVV[n}%@ssshhŖ-[z{{!?<<,i!K.IIIW챱1S7t:]w777xno^ZZh[s$7Io󼽽mll㳲 w}6aqMr7?X,KJJ9U E|7?jaQ\{ff@ 8|hhkLL 6.ܺN퍍uuu KLLtppUЦXfdd+طmظn:ooot}kPֆw˵]`AVVfW+VlΝeee|>ll oiirmll}hѢ˗/555~ǏWvww_*++}]?R400ٳg $**X,jOMMO>?d!رc^^^|>KPd2Qڵk\{햖JX,NMM=zhmm׏=z TiiitqqIHHPn _P',`<w޽6l@-$ ֯T~غI~(ccc.]o>CԹ&㦠G|@Q7?փOu Xoݺ1))iڵ}}}huN8p@"deegddl޼Ṽݻr0>>.Jpttt|rŊ/_411QVX,+ ď?(N:`G'4ɤ,[;qℛ棏>JMMݸq#FEFF.\WVV6b44fV*'Np8gώà)N9(ؗ.]z) s&,=;w.77B~>@GGgUUU<R[[jaaaiirؙ6۷og0n֭NNNا Eku+[nmܸ1%%QHAZs:Hn8  aXNNN躣)c¼A⸴Qx`Nh={|GWWW.[SS[i$//ͭqoaaavvv\\ׯ155 9s&<<<99eVk?~m ӳBu U KkIݻ}}}+++>}_+L&cxxu```@ӱUׯL@ @ڮ_NOA,PL+/]]hv ~TƛR\\ljj:a79smڴ @>|С&˺ubb"322Rc I@OOoŊ=VS*- 7<x322ӣKJJ_mө*0u,QOTJMMM}}}/^<{ltLp1UEa q\V[n< Q}pL&S___WY\4 А!\yCrÇmmmQQQOb3 B[tttYL*y{{U?ϿOɲed2Y|||ZZZXXXuu5ͮtww_xqtt׷3;;AG l*ApM#"""""7X>͛'=)G~ptRrrrII]QQQkkmwww>|#iGGǮ]v؁Ř5k.Aƥ=}uM<~|TyllD"{`jNU釭$T*E9rdÆ CF vҶGzae(e`̎nVSS!A݉%)`0"""sssE"˗n۶mfff?3j-Z}v;w?Mff=66.!!a2v244422x~w} ;rY,]x1{ʕ===7nΛ7oΜ9qqq2bͷӦWIDAT; zp8///t RTTx<5OMM%&&&###iOVdQ\K@yyBuu5g?s挑# A***̙8::կ{š󆃃ɓ'1;~a)Ν366ONNFf߼ykOָm W?I~x槟n`` *F۷oNe;o>.mԧ6ÀQ\.АfsP`yxxܿuuL&D"QBB=pTŋ }}}ccc{ww7]%d2Yww™!,`lOyꕉ$>|a~:;; o*L&hA'_ϟgϞ_ioox9L144ޮֻ^7%0`a&1ĝ74V?dQ)u gϞUVMd ڱc} @AAAAAAAAA' ׯ_$nii駟ooN::: xpppMM Aڗmnnd ƞ0bq__z>^no/$' Rګ,=~ꕲ]Z[[%ۓL?)35^\嘌}Q5w'xSScՉN)kv7UuUo;ԧ1߶!ٳý[yyŋ1T*]fϒ%Kر:##C(bbb:;;QczzYt:NGoq& WZ賩),,חD<`@V{UG%?b8 b޽[`63VP?>OyxMMMonllbX ʕ+9|#gT$Dk׮ݽ{W$%%%p%X|___{{ӧO`]ҀN|_[[-((DSWUprp>.mԧΝ;۶m[paZZڔLȧ~zԾccc.\ϟD_ B,˝FFF:;;MLLz{{Qŋ'H?~> ;;;&&\[j>H!K~FFFS:U7|V|AXp ҀN|hllp8d2KKK77ϟO_U_(lCQrHڗ\py ;wck k׼t9ϿujzjOOm1::Z]]?s^^^<O>166n\ xP(ǎClݺU Ͽnll rVVV[n}%K װc@mnn زe xB?0`@V{UD_}4Bq2PZZh~y<FGwj~NjYꓤLpp0zɧO'3S|#g~厎666YYYzzzXɏ7=yzjC#uk0;47X,KJJ9U [o\?KQu}yAppҥK߿OV333CCC]]]cbbq8:: Ly]]î]<==E"QooollkXXXbbCmm6ڷ7###>>^m۶uy{{\ϟ?}- r ,ꦥlΝeee|>ll1.ٷn蘔v >Ȯ.E.__|?F?:pD" ؼyo Oܻw/`||\*x+^|Y]]=88hbbW+X,+**$W@@=,::z C"mݺɉ8̚5뭷ޚ;wkjjd2٩Sttt,X#4ׯ_;lݺСCRիhh4NMM666fMHHb744xyy]v/ jjmmEĉsQ:N:`_tS,,,`F&G%BBBjkk]]]-,,,--'D>@GGgUUU3\񎏏cgt&O"s]bTf2&6nݺqƔxaTC'Νͭߜ~au0,w!M~a?ftyA3$EˠIid1@ȂJ >(ER؅ 4HSXym/3{\mO9ss4jZ$EDDqqh igGϟ?|ڵ8Ƹ^bXEEEGƒ$Յ\peXyyy۶m(^@Msosssmmmaa P*j@uuV-++ꆆt@@@j HLL @T[ ]v=}j_[PX쥥 Lf wDb4szՠ|>ñRǫtϞ=CW"fff C BBB9\< Bfv/ŋ111QJt:]cc^]οx8yHbbb^^ [ֶqFhn#x3.:tͪV:'8wޅ ZZZRr؉4yívRb69T*MKKF-|=G=.wC3Δ>}:--˗/W^5ED"AlRbR !1ł 䤿?ڗ===###Gqubbbh$jkk[XXLOOG}$7 h;266Dopwݿqq͛7555֏t:R@~Z˗¬SC.斖T*41M׷=.}}}2,88vwA%gc0N:uĉߞL&dIMM]f.[qܹs|ox򨠠`nnV:\X,HrDr TJFA?|@dVV DR__! BP]rFϿ .}~_~-u=NyuPPX,HѡjJJJ~TuuP(ܺuB@A2w<@ׯ_WaB,)a.߾}ח㕕AbqSSSƍ\X{ċ/\k':EZ;)ATlJ!gXgΜ~r8<@~yZ>{]_""")))wG|$X,&I233)"Z>{lllP(ܱc˗/|޽$ID"PHd||<۷RT"tttD 6!X, ,---..|sx<;`xvrr䳳{bL&߿rۏ~hF.kw n bUg8211a4lfncqqq`` $$/}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_CgggI) pHYs   IDATx} ]Uy~sL&Ʉ@B J-\_ ^mQRRڇvhZ mm-W*ZKdE$ Ad^33^[o}[yizwOjnP]׭|իN-cf;t+ѦFZӍixxa$ݖfXmgX:j9yqci=Q ~npºs2 y׻ixr=n(>>5lm3ZOՐMZV];o4dgr9 grN6v~X?cɧ.lgV^ߖWg\3\gɯ_Ck=}q[Ĝw띧ƴyrrf̖VC3 շ׿-NyJ _yreOF7z8ǯ0sEMs%j+Ly90rpJw> nS)f䱥۲kl J`]m"Ԥ6~JhO[4%}Ljгxp7 1C6+ԭ[Gm +[!K46l6ix]!nP#IL]փb:s2{w=œHgx==J%, mwiVj׾c>d$[.[Z4XAթdA,u?PN%ď.`Q$gLȁ$XSnJ.ݲ4("̜wcA'^ҷoh:_;\YMͰ^и0ybGL N΅k{D@/A ;( L4Z4{xŽ̑ܟ|SĦXV^oX\7~6m_1;rF)a`Ԭ)d1 jؚf[V<~߾}_)մk:CkO hU<T)F F`# HPDNfv fi5$aDgǠ6|NaŅ@Hn>cwޱOК`uR`n7o0Wv}QV\ ۦƵiE=Lx;87^tC| sי+HmuqXPhE,%wƘnsxS ,Vbls񂟙m΂Y XZ,*F`:IZVıOw x[,IZDx˷\}3:B;7##TpfB>1?o=ƀMP4}[0Wi[*3F zt^EsYGW(|\C*5%#. p=I% j,uc4n[܎_4޶l )8 _c\"F+N11KClYD>n@PצMO|Q]?^7yž4*u@&x Q( ޲C?~5Min+V!ln#YN]/&7} jiz2uNo@Ϳ7ҭfk{0Y RfC@i! M", Bў e4u)5MuePv,˰RZXIc2z.X=NKW]Z`Bobc:eYXF"%żT8@blm_m;^oϬN=%jLԐiwcRӓxj"`&$+!>OaeFwugV 7/G҉ 52^vz_C^ppq(Mmן`,}WϸVQ+%XnxVqSV^S(Ҝzfz:uퟸ%ufK\.ִ#UwĜ'> ՋDb|NKdG*}ɗ!ıܥ${A@ѽ[&wa[µR&m1;zkU<9}au]+W (/9y8'#oIwOtzMˋMU5)`i]]:mԗLmꛠKK?JpLllwX=]6:CeK}mܛw|W;.;/`Z I;^s_}|e7<Ş3ONNv?KZvgS: BP?3?S>p2#6ˌo +N s%>xz|5r6 o-ps" Rˆ 6 EK#捍~G͊gK 掎~0_pe8C4BLK%ᙊÃ?1LYY1~[GIe|'$b26k dNXu9N( չ-D!-@c5b(jmK&cbDbב#rܸC@rN7;̀`{[<{X7yREf̕vm*_ѓB"d16ADoɢc=Pfz CSv !/wކĂMGs NmW81WV J&W4/oi󼉸sbwŭhSmnj5T^K. WБld UE+Nf%њXaTY-دHa(@8`7d4,uʲ4Uٝ2>pX/^b?sG +<=< )8ڱ1CA3uحrMi'ֶ}SI ,4opd|(N ޲0޾2v^Wa !nG/i* Zu??leLl/r=q4$ xVf.YhlnS 3KM-Wj؀d .6[3yVJ.\Չ->de-Ji;0c\*0ciّ#SCYoU2mEl*1BHyE/,/IO7Wu 1١SV]hlX>F2l\B`bBc[O9Sb >HO T1AT4W,"H~?ٖy|m,7ޥzXT#,14VO5K)2TIk@CRiӽ¯!![L[.9U_QE Oy!?eXUQ""t dRi.LbbYpN<:O:Iqh8uį)h7k3e߅V\ j\8 UՑ9"JgljB\? 3Q?@TMlWPx¯d /|*>Bo:,( kEarNMRW_o,O2Ey.=Ibڦ7ԺDuK djjI=6H(̑b@Q"\H'yN'j *GM YU誑 b>kZmidQX<95|]zTCkz,ΫNNMMQIW! rLe|1Iq~ߊL`I}nA'{a.^:=r u@8AuC.1/݀KwZS c]14Ӯ82ev繈RߐFi# pH!S/QqA+N !_Mg:$ve1 'P-t&gvvrt3s?P⊘83S^ֺ^:kmXVꩨ$U=34Da*pf/):M!ֱ9Gd9w8 ?4O$1ImިC&Dٔhi3 Lz R d/us(Q}~xH[3zfUj'r se0zwmZbg)<R]Q$h ꒠(dLXɪ2ALu ^ F1O64:ff @VOO])EV>T|vΆed?wc :jF>&Wd:05yH)g-pCKkcq.RjB&kgUiQG6%ݴ /! Y.?Qk~U7̺4zш1z꒠4F`UF]],(^:> D!W0 ؆}+Bc;EEQWY0*OQ h@[=t%yxTE%B _IRŪk;Cb~`8MC Di+*Ktr_#4v7=DQ]˸#Twtm4Pt8*@!#Hy:;*|-ekٰe~cQ K`-v33^޽j}y"95^T#,)P|5 2:#cZey)Xa}!. >>vv@`=DU5uLZ/0 uo2,LBXN=;WetSf˂?h:LU] |_31T p*$URFbtpe(Ze@06jVf3Ijn#wU62BUJa.\NC Ќ%W1ov8i4+% ,0yn#Sd9H9fGYպaC'akvd@NI?)DnZ+gaTXWgapsOgԴ6*9w bY6lK5/i; "@Ǥܰ;FH*/fyt8U(dlanV Ӡ +!.ڄ ]MX)s:}Q(DD^Y N_HF#|JX[^' ԀgYW7QMl6Tc S'lXU}Jh:}f @!'/!e|ᝅ@[ {tχfQjjj95)F#PMR\~r1FIkYx~vM "%AR-f1MNM4k5ģmӵ1ZHS2) CqOdh4,߈g,NP!8,̌aR"؈R̺㚘PbPkyj?Hs';%ڳj:iw٥mJ3WO`V*h_sҎ~.U7_TP%GbQٰx N-;:\ '…Ӣv{E.lLSBFDG"(dZ /HK e˹NͶ;oϢR-jeMxɡA KE<,eFpcڵ''䊎ƈ$>D13yOߵyڝtÊ _5EHo"Kp}ğcF뙠(uЌTRXMk*eX%%ȺI`DMA񶒶+xv^Z0HxV]7V,#EUAM$ $>Jfti5Zd2ȵ;.dxMiXTq}#͍iؚ U)# `.gϿ[ ۛʥo^Q;6lzl:dD,Q(TSJ)Wŭ5z^1W($EcP Xf2녜ݻ+~|\z Fђl: zsy.Ύ0ih?vvz86?zUPHjeM Z}u`?"?,EOz>L."hm(cF\ly_(7&VNHO.|.b.s|7vJ4RybGMPm5$(=j̫2X.GJ^ѳk`XZ- -z:G`W2g4/3cbK5& ^B0TR1ذ=CrT5D}m=k{=XJY5sM uAۡFJ>Zղ_ hOr]41tk~_h˖n t3웵>oӗ襽byG_s|#y , Wgn[WaZHD^.S˸24 N@܉wLO~mb#k;MނB; ]|?}#v59WtlV#>-)3hGSTk|Ya>Uܮ@Flt}F<9eԐw\B2ږ6Jx@۽sjYv710R]n4Deo پ\r>!+s"g}r֘7vlܸhIq :B`֡zgAHsa&x՚_hȧtZֱc_GTv3e;oj+W}uU8]3?8ի 1|dg>/ h4^gQtEI*=({[򰎤V+ P@s.:V ?Yn)j K -(*ZZ8h Zk-'4~QIׄʁ<;D}>5StwS_u˗~cvHZa- 7*&8`>é @L*# +J]O jyA!#P'jځ?F)m6Lp#RD~ ce3*"eB'lKuWwg(-8$vX--w?]7=QS+Z 83άTpH•Z _m$SPSMQr}AM_)\X \/nz?VL`ڍIŗ0ʮCq'DT0} k 18rUe=豮cZ*t߰"Fxt/jax29wt|='+wV b 2yI`u꫌OPhM'9Vi8#'o?!˯^ݜbBhZFPqfXr6K"KE3ٰms-oĈV075Ck+ТZi8tTZIRhCC>3)Ֆ-Z 񯭗]ލUٍ"bzp{au~QpwlƯQD  ;VNJ3kE qk P=NyՐW* Gޤ_qi>{hME:홆|UUG"|iHeX\t KOhv"$QƳ6zgW冤aSHѹ' /7:Np1ߡ} Xbӓىy{/1Z_ͰLs7^y* Iz)Ω|iOa_7{} oyָ~4`6 WY2;4Ic |eu~(ix~]k\= @krOa_?׷Z y%mاA9LYH1ȆRaEh̀aF}/Sr^nɌ0kDM'uǎxdN6O's!picsF3,iNGq޼Y_B=yjNS`Ia]X XsNgd}wn5: Nٱ\)bPaz ;Whn+K)\+xdݛNXX s>.zUa?(yҶmK6m;yaz!ZU(M>"XO>Aa0 cl]ro& >;4>=ò`xq B!WL7-عO+j??]< c ~# y{WOܯL #@PA5DkpQ\¶eN~4J? T |Wu-INht]WD=a3q :^WJmLJcڌ hW_C߬s%ނ*p s,wV;F450޸}) V۰o??xk/H_'Sp.~5|) 6T:2ء5Njɔd?<^{&)0%|Nj,SvS!tF̳)@:WH<NSrBzfЍg7d*U7*Ү jEde\Uƽna|h0j&P ٮq4Bxڙ;3x|cR^%l#7D͝<7Ψ}0R)=hx ̈́ }z96@پAA 9_irZ{,mp Il%1*ck6$Ga'),Y\2KJA 3\ExI‚8wT%]a-rx,2/E~AßEjȈchǏ`.=;~0z.sS/_vMj@U`Lb1ܡr6ȷ^bv^VWk)u̷R TDfҡ+4<)E&N",4gtK+}ɏ2徹/!3ҬDJNU\E;ȾXۢXA\"x18 sAiϡ zţ A璊1 c!mLl N=\SG?䌍*yH%lPXշ~+y+@oy1*Epmat5FqL'&ƞt-v1,[O)Ϩ7mЛiu2k}""秢 X]4L Z4-4+5A ?){xJtB-|avj ;|hK]`P+V;XUS.* +,ǎja/ۂIl!5:"]WN ꦅ>DOR/.y1@$փ:Vb!\]]֘RbU#Ovkz[ce'@Z͹ef@2AݶL.XX`Uz 89uAng\ޓ( ot@=|m9#=/]GO{dfO|U~C4Gn\~,kPI!'9+ D.FQTU2o xJXR Ϳl>o(X.TcP*Gh#Di>TE#1 _ G@;8OOth^_1 s GBJ¹hgGC*3.&F R, aHk[}3Id+K[/u'ىv6zsktR#԰gb]XRegS:.cԆ)ooYֻ?=VԪ?$|po/ֽ8&@J%۬WG1Ǡ.ӳ4mpre>OZ5DֲrRՅ雌T;H!h@lle8, ,^ƇZND]\m>!HuWYeJBx.\R`v  98<ǚs1մ^uV}pÅGit Er1$fzm %7G'<&E1U"UqGk%~,\|ݏag6m 6=ByU$'JqsǾ/#"*We1Kڰ>j,EC3Bagw=}_#P`V<΂iWc)+&X*_Ua-k12b2#ЩOvqep1` ŎzKXm SؑgtFD8<#UxWsW#?, fD@32DXm2~.b3#(.3e煍|ʌ?=h'n%V }Ow.򪙚i`f=wmqhnL0Oװ(Wd0WM3d[s)oQ0J\f@3 @?,-aElGZE7{xǙ Ɠaϼ'N1K = K+N!f@B޶GFݻg.YFHd\t@s `~L+vxU& hg3+qa&UqY1M5EVۭڅOtM!%*7;=:}c5}?q!BE Պ6, 3P+҄tzGD nnf n:$J@|Oа\ DhM\?@ x/V#PRƁVEmp#|?*|mΓHcbF@5ȱ} j-_C,bI"~R߰O~UB 2IiNТS)'B'80s<$ˌQS@yЎ&ay>a{dY1+*z\7Hmjq!J*яB@qzz{Ba^,<IcA5s@yXN!_ˌ݇~8GľRޣeivc`7))x92aqY~=p gX!ܗRZ?mS%M(#0DIIENDB`gon-6.3.2/gon.gemspec0000644000004100000410000000225413603457635014504 0ustar www-datawww-datalib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'gon/version' Gem::Specification.new do |s| s.name = 'gon' s.version = Gon::VERSION s.platform = Gem::Platform::RUBY s.authors = ['gazay'] s.licenses = ['MIT'] s.email = ['alex.gaziev@gmail.com'] s.homepage = 'https://github.com/gazay/gon' s.summary = %q{Get your Rails variables in your JS} s.description = %q{If you need to send some data to your js files and you don't want to do this with long way trough views and parsing - use this force!} s.files = `git ls-files`.split("\n") s.require_paths = ['lib'] s.required_ruby_version = '>= 2.2.0' s.add_dependency 'actionpack', '>= 3.0.20' s.add_dependency 'i18n', '>= 0.7' s.add_dependency 'request_store', '>= 1.0' s.add_dependency 'multi_json' s.add_development_dependency 'rabl', '0.11.3' s.add_development_dependency 'rabl-rails' s.add_development_dependency 'rspec', '>= 3.0' s.add_development_dependency 'jbuilder' s.add_development_dependency 'railties', '>= 3.0.20' s.add_development_dependency 'rake' s.add_development_dependency 'pry' end gon-6.3.2/Gemfile0000644000004100000410000000016713603457635013650 0ustar www-datawww-datasource "https://rubygems.org" # Specify your gem's dependencies in gon.gemspec gem ENV['RABL_GEM'] || 'rabl' gemspec gon-6.3.2/js/0000755000004100000410000000000013603457635012765 5ustar www-datawww-datagon-6.3.2/js/watch.js0000644000004100000410000000407513603457635014437 0ustar www-datawww-data// Generated by CoffeeScript 1.7.1 gon._timers = {}; gon.watch = function(name, possibleOptions, possibleCallback, possibleErrorCallback) { var callback, errorCallback, key, options, performAjax, timer, value, _base, _ref; if (typeof $ === "undefined" || $ === null) { return; } if (typeof possibleOptions === 'object') { options = {}; _ref = gon.watchedVariables[name]; for (key in _ref) { value = _ref[key]; options[key] = value; } for (key in possibleOptions) { value = possibleOptions[key]; options[key] = value; } callback = possibleCallback; errorCallback = possibleErrorCallback; } else { options = gon.watchedVariables[name]; callback = possibleOptions; errorCallback = possibleCallback; } performAjax = function() { var xhr; xhr = $.ajax({ type: options.type || 'GET', url: options.url, data: { _method: options.method, gon_return_variable: true, gon_watched_variable: name } }); if (errorCallback) { return xhr.done(callback).fail(errorCallback); } else { return xhr.done(callback); } }; if (options.interval) { timer = setInterval(performAjax, options.interval); if ((_base = gon._timers)[name] == null) { _base[name] = []; } return gon._timers[name].push({ timer: timer, fn: callback }); } else { return performAjax(); } }; gon.unwatch = function(name, fn) { var _i, index, _len, _ref, timer; _ref = gon._timers[name]; for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { timer = _ref[index]; if (!(timer.fn === fn)) { continue; } clearInterval(timer.timer); gon._timers[name].splice(index, 1); return; } }; gon.unwatchAll = function() { var _i, _len, _ref, timer, timers, variable; _ref = gon._timers; for (variable in _ref) { timers = _ref[variable]; for (_i = 0, _len = timers.length; _i < _len; _i++) { timer = timers[_i]; clearInterval(timer.timer); } } return gon._timers = {}; }; gon-6.3.2/.github/0000755000004100000410000000000013603457635013711 5ustar www-datawww-datagon-6.3.2/.github/FUNDING.yml0000644000004100000410000000003113603457635015520 0ustar www-datawww-datatidelift: "rubygems/gon"