I''m working on my first custom module (with custom types) and have a question: what is the recommended way to distribute it? I''ve been reading: <http://reductivelabs.com/trac/puppet/wiki/PluginsInModules> but I just can''t get my head around it. The first paragraph on the page says "replaces the pluginsync" and the last paragraph on the page tells me to *use* pluginsync. So... can anyone shed some light on how I should distribute my custom module? cheers, /Martin --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 12, 2008, at 11:38 AM, martin wrote:> > I''m working on my first custom module (with custom types) and have a > question: > what is the recommended way to distribute it? > > I''ve been reading: > <http://reductivelabs.com/trac/puppet/wiki/PluginsInModules> > but I just can''t get my head around it. The first paragraph on the > page says "replaces the pluginsync" and the last paragraph on the page > tells me to *use* pluginsync. > > So... can anyone shed some light on how I should distribute my custom > module?Use pluginsync. I just changed the wording to make it clear that the behaviour of pluginsync has changed, rather than it being replaced with something else. -- The chief lesson I have learned in a long life is that the only way to make a man trustworthy is to trust him; and the surest way to make him untrustworthy is to distrust him and show your distrust. -- Henry L. Stimson --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 12, 6:50 pm, Luke Kanies <l...@madstop.com> wrote:> Use pluginsync. I just changed the wording to make it clear that the > behaviour of pluginsync has changed, rather than it being replaced > with something else. >Thanks! That made it a bit clearer :) I still have some questions: now that my modules will end up in /var/puppet/lib do I need to add one factpath entry for each module that contains facts? cheers, /Martin --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 12, 2008, at 12:18 PM, martin wrote:> Thanks! That made it a bit clearer :) > > I still have some questions: > now that my modules will end up in /var/puppet/lib do I need to add > one factpath entry for each module that contains facts?Fact syncing within pluginsync isn''t really working right now, so at the moment, I''d distribute facts separately. -- One of the Ten Commandments for Technicians: (7) Work thou not on energized equipment, for if thou dost, thy fellow workers will surely buy beers for thy widow and console her in other ways. --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 12, 7:26 pm, Luke Kanies <l...@madstop.com> wrote:> Fact syncing within pluginsync isn''t really working right now, so at > the moment, I''d distribute facts separately. >Ah, I I''ll go back to using factsync then. I can take a look at auto- adding <module>/plugins/facter to the factpath if you like. One final question: Is custom types working as intended when distributed using pluginsync? cheers, /Martin --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 12, 2008, at 12:30 PM, martin wrote:> > On May 12, 7:26 pm, Luke Kanies <l...@madstop.com> wrote: > >> Fact syncing within pluginsync isn''t really working right now, so at >> the moment, I''d distribute facts separately. >> > Ah, I I''ll go back to using factsync then. I can take a look at auto- > adding <module>/plugins/facter to the factpath if you like. > > One final question: Is custom types working as intended when > distributed using pluginsync?Yes, I think so. -- Never interrupt your enemy when he is making a mistake. --Napolean Bonaparte --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 12, 7:43 pm, Luke Kanies <l...@madstop.com> wrote:> On May 12, 2008, at 12:30 PM, martin wrote: > > One final question: Is custom types working as intended when > > distributed using pluginsync? > > Yes, I think so. >One more question :) I could not find anything in the documentation about the structure in <module>/plugins/type, i.e. should both the type and the provider file be added directly in that directory? E.g. custom/plugins/type/shadow.rb custom/plugins/type/parsed.rb And how do I debug the search path? (other than using truss/dtrace) cheers, /Martin --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 13, 2008, at 12:59 PM, martin wrote:> > > > On May 12, 7:43 pm, Luke Kanies <l...@madstop.com> wrote: >> On May 12, 2008, at 12:30 PM, martin wrote: >>> One final question: Is custom types working as intended when >>> distributed using pluginsync? >> >> Yes, I think so. >> > One more question :) > > I could not find anything in the documentation about the structure in > <module>/plugins/type, i.e. should both the type and the provider file > be added directly in that directory? > > E.g. > custom/plugins/type/shadow.rb > custom/plugins/type/parsed.rbExactly duplicate the structure of existing classes, so tpyes should be in puppet/type/<name>.rb and providers should be in puppet/provider/ <type>/<provider>.rb. Note that you do need to specify ''puppet'' -- the plugins directory becomes a normal Ruby search directory.> > And how do I debug the search path? (other than using truss/dtrace)Hmm, I don''t really know. -- Do you realize if it weren''t for Edison we''d be watching TV by candlelight? -- Al Boliska --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On Tue, May 13, 2008 at 01:55:07PM -0500, Luke Kanies wrote:> On May 13, 2008, at 12:59 PM, martin wrote: > > I could not find anything in the documentation about the structure in > > <module>/plugins/type, i.e. should both the type and the provider file > > be added directly in that directory? > > > > E.g. > > custom/plugins/type/shadow.rb > > custom/plugins/type/parsed.rb > > Exactly duplicate the structure of existing classes, so tpyes should > be in puppet/type/<name>.rb and providers should be in puppet/provider/ > <type>/<provider>.rb. > > Note that you do need to specify ''puppet'' -- the plugins directory > becomes a normal Ruby search directory.Now I''m confused. The PluginsInModules page says: So, if we are using our custom module and our modulepath is /etc/puppet/modules then types and facts would be stored in the following directories: /etc/puppet/modules/custom/plugins/type /etc/puppet/modules/custom/plugins/facter Are you saying this should be: /etc/puppet/modules/custom/puppet/plugins/type /etc/puppet/modules/custom/puppet/plugins/facter instead? Btw, I''d prefer /etc/puppet/modules/custom/puppet/plugins/type /etc/puppet/modules/custom/puppet/plugins/fact (note `fact'', not `facter'', which is the name of the implementation) for obvious reasons. -- Jos Backus jos at catnook.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 16, 2008, at 2:24 PM, Jos Backus wrote:> > On Tue, May 13, 2008 at 01:55:07PM -0500, Luke Kanies wrote: >> >> Exactly duplicate the structure of existing classes, so tpyes should >> be in puppet/type/<name>.rb and providers should be in puppet/ >> provider/ >> <type>/<provider>.rb. >> >> Note that you do need to specify ''puppet'' -- the plugins directory >> becomes a normal Ruby search directory. > > Now I''m confused. The PluginsInModules page says: > > So, if we are using our custom module and our modulepath is > /etc/puppet/modules then types and facts would be stored in the > following > directories: > > /etc/puppet/modules/custom/plugins/type > /etc/puppet/modules/custom/plugins/facter > > Are you saying this should be: > > /etc/puppet/modules/custom/puppet/plugins/type > /etc/puppet/modules/custom/puppet/plugins/facter > > instead?Yes.> > Btw, I''d prefer > > /etc/puppet/modules/custom/puppet/plugins/type > /etc/puppet/modules/custom/puppet/plugins/fact > > (note `fact'', not `facter'', which is the name of the implementation) > for > obvious reasons.The plugin destination becomes a normal ruby library directory. If Ruby couldn''t find that file, then Puppet can''t. In all of these situations, you have to install the file at exactly the path that a ''require "my/file"'' method would find. So, for Puppet resource types, that''s ''puppet/type/<name>'', for providers that''s ''puppet/provider/<type>/<name>'', and for facts that''s ''facter/<name>''. Note that this isn''t something I''ve chosen, other than that I''ve chosen to use Ruby library directories as everyone else does. I had no idea the docs were so off; please correct them. -- One of the keys to happiness is a bad memory. -- Rita Mae Brown --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On Fri, May 16, 2008 at 02:40:38PM -0500, Luke Kanies wrote:> On May 16, 2008, at 2:24 PM, Jos Backus wrote: > > Are you saying this should be: > > > > /etc/puppet/modules/custom/puppet/plugins/type > > /etc/puppet/modules/custom/puppet/plugins/facter > > > > instead? > > Yes.Fixed, thanks!> > Btw, I''d prefer > > > > /etc/puppet/modules/custom/puppet/plugins/type > > /etc/puppet/modules/custom/puppet/plugins/fact > > > > (note `fact'', not `facter'', which is the name of the implementation) > > for > > obvious reasons.Any thoughts on this?> The plugin destination becomes a normal ruby library directory. If > Ruby couldn''t find that file, then Puppet can''t. > > In all of these situations, you have to install the file at exactly > the path that a ''require "my/file"'' method would find. > > So, for Puppet resource types, that''s ''puppet/type/<name>'', for > providers that''s ''puppet/provider/<type>/<name>'', and for facts that''s > ''facter/<name>''.Maybe this should be added to the wiki as well? Btw, I looked at ticket 1002 and it mentions factpath = /var/lib/puppet/lib/facter i.e. factpath = $libdir/facter whereas PluginsInModules mentions factpath = $vardir/lib/puppet/facter i.e. factpath = $libdir/puppet/facter What is the right value? -- Jos Backus jos at catnook.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
Hi>>> /etc/puppet/modules/custom/puppet/plugins/type >>> /etc/puppet/modules/custom/puppet/plugins/facter >>> >>> instead? >> Yes. > > Fixed, thanks!hmm now I don''t understand it anymore where it should be placed. when did it change from $module/plugins to $module/puppet/plugins ? I can''t find anything on http://reductivelabs.com/trac/puppet/wiki/UPGRADE about that. As well I have in all modules $module/plugins and the plugins are working well. So did I misunderstand your discussion or is currently both working and people should move there module plugins to puppet/plugins ? thanks for clarification. greets pete --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 16, 2008, at 3:04 PM, Jos Backus wrote:> > On Fri, May 16, 2008 at 02:40:38PM -0500, Luke Kanies wrote: >> On May 16, 2008, at 2:24 PM, Jos Backus wrote: >>> Are you saying this should be: >>> >>> /etc/puppet/modules/custom/puppet/plugins/type >>> /etc/puppet/modules/custom/puppet/plugins/facter >>> >>> instead? >> >> Yes. > > Fixed, thanks!Argh, I''m sorry, I''m apparently exhausted and can''t read. I ckeep transposing puppet and plugins. Puppet looks in the ''plugins'' directory of your modules, and Ruby will look in the ''puppet/type'' subdirectory et al of its library directories. Thus, you need <mymodule>/plugins/puppet/type/<type>.rb.> >>> Btw, I''d prefer >>> >>> /etc/puppet/modules/custom/puppet/plugins/type >>> /etc/puppet/modules/custom/puppet/plugins/fact >>> >>> (note `fact'', not `facter'', which is the name of the implementation) >>> for >>> obvious reasons. > > Any thoughts on this?I don''t understand the question. What kind of thoughts am I auspposed to have?> >> The plugin destination becomes a normal ruby library directory. If >> Ruby couldn''t find that file, then Puppet can''t. >> >> In all of these situations, you have to install the file at exactly >> the path that a ''require "my/file"'' method would find. >> >> So, for Puppet resource types, that''s ''puppet/type/<name>'', for >> providers that''s ''puppet/provider/<type>/<name>'', and for facts >> that''s >> ''facter/<name>''. > > Maybe this should be added to the wiki as well?Seems reasonable.> > Btw, I looked at ticket 1002 and it mentions > > factpath = /var/lib/puppet/lib/facter > > i.e. > > factpath = $libdir/facter > > whereas PluginsInModules mentions > > factpath = $vardir/lib/puppet/facter > > i.e. > > factpath = $libdir/puppet/facter > > What is the right value?Facter looks like $RUBYLIB/facter, Puppet looks in $RUBYLIB/puppet. If you want facter to see it, it should be in $RUBYLIB/facter, so you should put it in the ''facter'' subdirectory of your plugins directory. -- Football is a mistake. It combines the two worst elements of American life. Violence and committee meetings. -- George F. Will --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 16, 2008, at 3:15 PM, Peter Meier wrote:> > Hi > >>>> /etc/puppet/modules/custom/puppet/plugins/type >>>> /etc/puppet/modules/custom/puppet/plugins/facter >>>> >>>> instead? >>> Yes. >> >> Fixed, thanks! > > hmm now I don''t understand it anymore where it should be placed. > > when did it change from > > $module/plugins > > to > > $module/puppet/plugins > > ? > > I can''t find anything on > http://reductivelabs.com/trac/puppet/wiki/UPGRADE about that. > As well I have in all modules $module/plugins and the plugins are > working well. > So did I misunderstand your discussion or is currently both working > and > people should move there module plugins to puppet/plugins ?Sorry, it''s my fault for not getting enough sleep or something. plugins, then puppet -- Man is the only animal that can remain on friendly terms with the victims he intends to eat until he eats them. -- Samuel Butler (1835-1902) --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 16, 2008, at 3:15 PM, Peter Meier wrote:> > hmm now I don''t understand it anymore where it should be placed. > > when did it change from > > $module/plugins > > to > > $module/puppet/plugins > > ? > > I can''t find anything on > http://reductivelabs.com/trac/puppet/wiki/UPGRADE about that. > As well I have in all modules $module/plugins and the plugins are > working well. > So did I misunderstand your discussion or is currently both working > and > people should move there module plugins to puppet/plugins ?I''ve now updated the page with what works. I''ve also clarified that for now factsync still needs to be used for facts, since Facter needs an upgrade (which is done but not released) before it''s smart enough to load facts from the plugindest. -- Everything that is really great and inspiring is created by the individual who can labor in freedom. -- Albert Einstein --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On Fri, May 16, 2008 at 03:35:58PM -0500, Luke Kanies wrote:> I don''t understand the question. What kind of thoughts am I > auspposed to have?I''m proposing to rename `$moduledir/$modulename/puppet/plugins/facter'' to `$moduledir/$modulename/puppet/plugins/fact'', in order to be consistent with `$moduledir/$modulename/puppet/plugins/type''. Maybe this is too disruptive or just a bad idea.> > Maybe this should be added to the wiki as well?Thanks for updating the wiki, Luke. It''s nice to see this clarified correctly. -- Jos Backus jos at catnook.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
Hi>> I don''t understand the question. What kind of thoughts am I >> auspposed to have? > > I''m proposing to rename `$moduledir/$modulename/puppet/plugins/facter'' to > `$moduledir/$modulename/puppet/plugins/fact'', in order to be consistent with > `$moduledir/$modulename/puppet/plugins/type''. Maybe this is too disruptive or > just a bad idea.I don''t see the need for that. in the folder ''facter'' are plugins for the external tool ''facter''. Therefore also the naming is currently already consistent: $modulename/plugins/puppet $modulename/plugins/facter in one folder are plugins for the tool puppet in the other one plugins for the tool facter. They are used by 2 different kind of tools. A module is more just a bundle for a certain usage, which will be used by several tools. The additional subfolder for type makes also sense, because there might be one day (just guessing, don''t have a clue about that) other puppet parts which are extendible by plugins. greets pete --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On May 16, 2008, at 7:09 PM, Jos Backus wrote:> > On Fri, May 16, 2008 at 03:35:58PM -0500, Luke Kanies wrote: >> I don''t understand the question. What kind of thoughts am I >> auspposed to have? > > I''m proposing to rename `$moduledir/$modulename/puppet/plugins/ > facter'' to > `$moduledir/$modulename/puppet/plugins/fact'', in order to be > consistent with > `$moduledir/$modulename/puppet/plugins/type''. Maybe this is too > disruptive or > just a bad idea.It''s not really up to me. I mean, I''m following standard Ruby conventions for library paths, and since facts are for Facter, they go in $LIBDIR/facter. -- Meeting, n.: An assembly of people coming together to decide what person or department not represented in the room must solve a problem. --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On Sat, May 17, 2008 at 10:50:45AM +0200, Peter Meier wrote:> I don''t see the need for that. in the folder ''facter'' are plugins for > the external tool ''facter''. > > Therefore also the naming is currently already consistent: > > $modulename/plugins/puppet > $modulename/plugins/facter > > in one folder are plugins for the tool puppet in the other one plugins > for the tool facter. They are used by 2 different kind of tools. A > module is more just a bundle for a certain usage, which will be used by > several tools. The additional subfolder for type makes also sense, > because there might be one day (just guessing, don''t have a clue about > that) other puppet parts which are extendible by plugins.Makes perfect sense; I was basing my suggestion on incorrect information on the wiki page which has since been corrected. -- Jos Backus jos at catnook.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
On Sat, May 17, 2008 at 11:21:30AM -0500, Luke Kanies wrote:> It''s not really up to me. I mean, I''m following standard Ruby > conventions for library paths, and since facts are for Facter, they go > in $LIBDIR/facter.You''re right; I based my suggestion on incorrect documentation. Thanks again for clearing this up, Luke. -- Jos Backus jos at catnook.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com To unsubscribe from this group, send email to puppet-users-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---