')
+ .appendTo('#qunit-fixture')
+ .one('show.bs.modal', function (e) {
+ e.preventDefault()
+ $otherBtn.trigger('focus')
+ setTimeout($.proxy(function () {
+ $(this).bootstrapModal('show')
+ }, this), 0)
+ })
+ .on('hidden.bs.modal', function () {
+ setTimeout(function () {
+ assert.ok($(document.activeElement).is($otherBtn), 'focus returned to toggling element')
+ done()
+ }, 0)
+ })
+ .on('shown.bs.modal', function () {
+ $('#close').trigger('click')
+ })
+ .appendTo('#qunit-fixture')
+
+ $toggleBtn.trigger('click')
+ })
+
+ QUnit.test('should restore inline body padding after closing', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+ var originalBodyPad = 0
+ var $body = $(document.body)
+
+ $body.css('padding-right', originalBodyPad)
+
+ $('
')
+ .on('hidden.bs.modal', function () {
+ var currentBodyPad = parseInt($body.css('padding-right'), 10)
+ assert.notStrictEqual($body.attr('style'), '', 'body has non-empty style attribute')
+ assert.strictEqual(currentBodyPad, originalBodyPad, 'original body padding was not changed')
+ $body.removeAttr('style')
+ done()
+ })
+ .on('shown.bs.modal', function () {
+ $(this).bootstrapModal('hide')
+ })
+ .bootstrapModal('show')
+ })
+
+ QUnit.test('should ignore values set via CSS when trying to restore body padding after closing', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+ var $body = $(document.body)
+ var $style = $('').appendTo('head')
+
+ $('
')
+ .on('hidden.bs.modal', function () {
+ assert.ok(!$body.attr('style'), 'body does not have inline padding set')
+ $style.remove()
+ done()
+ })
+ .on('shown.bs.modal', function () {
+ $(this).bootstrapModal('hide')
+ })
+ .bootstrapModal('show')
+ })
+
+ QUnit.test('should ignore other inline styles when trying to restore body padding after closing', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+ var $body = $(document.body)
+ var $style = $('').appendTo('head')
+
+ $body.css('color', 'red')
+
+ $('
')
+ .on('hidden.bs.modal', function () {
+ assert.strictEqual($body[0].style.paddingRight, '', 'body does not have inline padding set')
+ assert.strictEqual($body[0].style.color, 'red', 'body still has other inline styles set')
+ $body.removeAttr('style')
+ $style.remove()
+ done()
+ })
+ .on('shown.bs.modal', function () {
+ $(this).bootstrapModal('hide')
+ })
+ .bootstrapModal('show')
+ })
+
+ QUnit.test('should properly restore non-pixel inline body padding after closing', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+ var $body = $(document.body)
+
+ $body.css('padding-right', '5%')
+
+ $('
')
+ .on('hidden.bs.modal', function () {
+ assert.strictEqual($body[0].style.paddingRight, '5%', 'body does not have inline padding set')
+ $body.removeAttr('style')
+ done()
+ })
+ .on('shown.bs.modal', function () {
+ $(this).bootstrapModal('hide')
+ })
+ .bootstrapModal('show')
+ })
+
+ QUnit.test('should add padding-right of scrollbar width to .navbar-fixed-top and .navbar-fixed-bottom before open', function (assert) {
+ assert.expect(2)
+ var Modal = $.fn.bootstrapModal.Constructor
+ var done = assert.async()
+ var $body = $(document.body)
+ var scrollbarWidth
+
+ // simulate overflow scroll
+ $body.css({ height: '2000px' })
+
+ var $fixedTop = $('
').appendTo($body)
+ var $fixedBottom = $('
').appendTo($body)
+
+ // patch setScrollbar function to get scrollbar width
+ var setScrollbar = Modal.prototype.setScrollbar
+ Modal.prototype.setScrollbar = function () {
+ setScrollbar.call(this)
+ scrollbarWidth = this.scrollbarWidth + 'px'
+ }
+
+ $('
')
+ .on('hidden.bs.modal', function () {
+ $fixedTop.remove()
+ $fixedBottom.remove()
+ $body.removeAttr('style')
+ // restore original setScrollbar
+ Modal.prototype.setScrollbar = setScrollbar
+ done()
+ })
+ .on('shown.bs.modal', function () {
+ var fixedTopPaddingRight = $fixedTop.css('padding-right')
+ var fixedBottomPaddingRight = $fixedBottom.css('padding-right')
+
+ assert.strictEqual(scrollbarWidth, fixedTopPaddingRight,
+ '.navbar-fixed-top has padding-right (' + fixedTopPaddingRight + ') equal to scrollbar width (' + scrollbarWidth + ')')
+
+ assert.strictEqual(scrollbarWidth, fixedBottomPaddingRight,
+ '.navbar-fixed-bottom has padding-right (' + fixedBottomPaddingRight + ') equal to scrollbar width (' + scrollbarWidth + ')')
+
+ $(this).bootstrapModal('hide')
+ })
+ .bootstrapModal('show')
+ })
+
+ QUnit.test('should restore inline padding-right for .navbar-fixed-top and .navbar-fixed-bottom after close', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+ var $body = $(document.body)
+
+ var $styleshhet = $('
').appendTo(document.head)
+ var $fixedTop = $('
').appendTo($body)
+ var $fixedBottom = $('
').appendTo($body)
+
+ // simulate overflow scroll
+ $body.css({ height: '2000px' })
+
+ $('
')
+ .on('hidden.bs.modal', function () {
+ assert.strictEqual($fixedTop.css('padding-right'), '10px',
+ '.navbar-fixed-top has inline padding-right restored')
+
+ assert.strictEqual($fixedBottom[0].style.paddingRight, '5%',
+ '.navbar-fixed-bottom has right padding-right restored')
+
+ $fixedTop.remove()
+ $fixedBottom.remove()
+ $body.removeAttr('style')
+ $styleshhet.remove()
+ done()
+ })
+ .on('shown.bs.modal', function () {
+ $(this).bootstrapModal('hide')
+ })
+ .bootstrapModal('show')
+ })
+})
diff --git a/bootstrap/fonts/js/tests/unit/popover.js b/bootstrap/fonts/js/tests/unit/popover.js
new file mode 100755
index 0000000..f8fd613
--- /dev/null
+++ b/bootstrap/fonts/js/tests/unit/popover.js
@@ -0,0 +1,338 @@
+$(function () {
+ 'use strict';
+
+ QUnit.module('popover plugin')
+
+ QUnit.test('should be defined on jquery object', function (assert) {
+ assert.expect(1)
+ assert.ok($(document.body).popover, 'popover method is defined')
+ })
+
+ QUnit.module('popover', {
+ beforeEach: function () {
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
+ $.fn.bootstrapPopover = $.fn.popover.noConflict()
+ },
+ afterEach: function () {
+ $.fn.popover = $.fn.bootstrapPopover
+ delete $.fn.bootstrapPopover
+ }
+ })
+
+ QUnit.test('should provide no conflict', function (assert) {
+ assert.expect(1)
+ assert.strictEqual($.fn.popover, undefined, 'popover was set back to undefined (org value)')
+ })
+
+ QUnit.test('should return jquery collection containing the element', function (assert) {
+ assert.expect(2)
+ var $el = $('
')
+ var $popover = $el.bootstrapPopover()
+ assert.ok($popover instanceof $, 'returns jquery collection')
+ assert.strictEqual($popover[0], $el[0], 'collection contains element')
+ })
+
+ QUnit.test('should render popover element', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ $('
@mdo ')
+ .appendTo('#qunit-fixture')
+ .on('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ $(this).bootstrapPopover('hide')
+ })
+ .on('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover removed')
+ done()
+ })
+ .bootstrapPopover('show')
+ })
+
+ QUnit.test('should store popover instance in popover data object', function (assert) {
+ assert.expect(1)
+ var $popover = $('
@mdo ').bootstrapPopover()
+
+ assert.ok($popover.data('bs.popover'), 'popover instance exists')
+ })
+
+ QUnit.test('should store popover trigger in popover instance data object', function (assert) {
+ assert.expect(1)
+ var $popover = $('
@ResentedHook ')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover()
+
+ $popover.bootstrapPopover('show')
+
+ assert.ok($('.popover').data('bs.popover'), 'popover trigger stored in instance data')
+ })
+
+ QUnit.test('should get title and content from options', function (assert) {
+ assert.expect(4)
+ var done = assert.async()
+
+ var $popover = $('
@fat ')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({
+ title: function () {
+ return '@fat'
+ },
+ content: function () {
+ return 'loves writing tests (╯°□°)╯︵ ┻━┻'
+ }
+ })
+ .on('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ assert.strictEqual($('.popover .popover-title').text(), '@fat', 'title correctly inserted')
+ assert.strictEqual($('.popover .popover-content').text(), 'loves writing tests (╯°□°)╯︵ ┻━┻', 'content correctly inserted')
+
+ $popover.bootstrapPopover('hide')
+ })
+ .on('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
+ done()
+ })
+
+ $popover.bootstrapPopover('show')
+ })
+
+ QUnit.test('should not duplicate HTML object', function (assert) {
+ assert.expect(6)
+ var done = assert.async()
+ var $div = $('
').html('loves writing tests (╯°□°)╯︵ ┻━┻')
+
+ var $popover = $('
@fat ')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({
+ content: function () {
+ return $div
+ }
+ })
+
+ $popover.one('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ assert.equal($('.popover .popover-content').html(), $div, 'content correctly inserted')
+
+ $popover.one('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
+
+ $popover.one('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ assert.equal($('.popover .popover-content').html(), $div, 'content correctly inserted')
+
+ $popover.one('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
+ done()
+ })
+ $popover.bootstrapPopover('hide')
+ })
+ $popover.bootstrapPopover('show')
+ })
+
+ $popover.bootstrapPopover('hide')
+ })
+
+ $popover.bootstrapPopover('show')
+ })
+
+ QUnit.test('should get title and content from attributes', function (assert) {
+ assert.expect(4)
+ var done = assert.async()
+
+ $('
@mdo ')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover()
+ .one('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ assert.strictEqual($('.popover .popover-title').text(), '@mdo', 'title correctly inserted')
+ assert.strictEqual($('.popover .popover-content').text(), 'loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻', 'content correctly inserted')
+
+ $(this).bootstrapPopover('hide')
+ })
+ .one('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
+ done()
+ })
+ .bootstrapPopover('show')
+ })
+
+
+ QUnit.test('should get title and content from attributes ignoring options passed via js', function (assert) {
+ assert.expect(4)
+ var done = assert.async()
+
+ $('
@mdo ')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({
+ title: 'ignored title option',
+ content: 'ignored content option'
+ })
+ .one('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ assert.strictEqual($('.popover .popover-title').text(), '@mdo', 'title correctly inserted')
+ assert.strictEqual($('.popover .popover-content').text(), 'loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻', 'content correctly inserted')
+
+ $(this).bootstrapPopover('hide')
+ })
+ .one('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
+ done()
+ })
+ .bootstrapPopover('show')
+ })
+
+ QUnit.test('should respect custom template', function (assert) {
+ assert.expect(3)
+ var done = assert.async()
+
+ $('
@fat ')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({
+ title: 'Test',
+ content: 'Test',
+ template: '
'
+ })
+ .one('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ assert.ok($('.popover').hasClass('foobar'), 'custom class is present')
+
+ $(this).bootstrapPopover('hide')
+ })
+ .one('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
+ done()
+ })
+ .bootstrapPopover('show')
+ })
+
+ QUnit.test('should destroy popover', function (assert) {
+ assert.expect(7)
+ var $popover = $('
')
+ .bootstrapPopover({
+ trigger: 'hover'
+ })
+ .on('click.foo', $.noop)
+
+ assert.ok($popover.data('bs.popover'), 'popover has data')
+ assert.ok($._data($popover[0], 'events').mouseover && $._data($popover[0], 'events').mouseout, 'popover has hover event')
+ assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover has extra click.foo event')
+
+ $popover.bootstrapPopover('show')
+ $popover.bootstrapPopover('destroy')
+
+ assert.ok(!$popover.hasClass('in'), 'popover is hidden')
+ assert.ok(!$popover.data('popover'), 'popover does not have data')
+ assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover still has click.foo')
+ assert.ok(!$._data($popover[0], 'events').mouseover && !$._data($popover[0], 'events').mouseout, 'popover does not have any events')
+ })
+
+ QUnit.test('should render popover element using delegated selector', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $div = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({
+ selector: 'a',
+ trigger: 'click'
+ })
+
+ $div.one('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+
+ $div.find('a').trigger('click')
+ })
+ .one('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover was removed')
+ done()
+ })
+ $div.find('a').trigger('click')
+ })
+
+ QUnit.test('should detach popover content rather than removing it so that event handlers are left intact', function (assert) {
+ assert.expect(1)
+ var $content = $('
').appendTo('#qunit-fixture')
+
+ var handlerCalled = false
+ $('.content-with-handler .btn').on('click', function () {
+ handlerCalled = true
+ })
+
+ var $div = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({
+ html: true,
+ trigger: 'manual',
+ container: 'body',
+ content: function () {
+ return $content
+ }
+ })
+
+ var done = assert.async()
+ $div
+ .one('shown.bs.popover', function () {
+ $div
+ .one('hidden.bs.popover', function () {
+ $div
+ .one('shown.bs.popover', function () {
+ $('.content-with-handler .btn').trigger('click')
+ $div.bootstrapPopover('destroy')
+ assert.ok(handlerCalled, 'content\'s event handler still present')
+ done()
+ })
+ .bootstrapPopover('show')
+ })
+ .bootstrapPopover('hide')
+ })
+ .bootstrapPopover('show')
+ })
+
+ QUnit.test('should throw an error when initializing popover on the document object without specifying a delegation selector', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+ $(document).bootstrapPopover({ title: 'What am I on?', content: 'My selector is missing' })
+ }, new Error('`selector` option must be specified when initializing popover on the window.document object!'))
+ })
+
+ QUnit.test('should do nothing when an attempt is made to hide an uninitialized popover', function (assert) {
+ assert.expect(1)
+
+ var $popover = $('
some text ')
+ .appendTo('#qunit-fixture')
+ .on('hidden.bs.popover shown.bs.popover', function () {
+ assert.ok(false, 'should not fire any popover events')
+ })
+ .bootstrapPopover('hide')
+ assert.strictEqual($popover.data('bs.popover'), undefined, 'should not initialize the popover')
+ })
+
+ QUnit.test('should throw an error when template contains multiple top-level elements', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+ $('
some text ')
+ .appendTo('#qunit-fixture')
+ .bootstrapPopover({ template: '
Foo
Bar
' })
+ .bootstrapPopover('show')
+ }, new Error('popover `template` option must consist of exactly 1 top-level element!'))
+ })
+
+ QUnit.test('should fire inserted event', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ $('
@Johann-S ')
+ .appendTo('#qunit-fixture')
+ .on('inserted.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ assert.ok(true, 'inserted event fired')
+ done()
+ })
+ .bootstrapPopover({
+ title: 'Test',
+ content: 'Test'
+ })
+ .bootstrapPopover('show')
+ })
+
+})
diff --git a/bootstrap/fonts/js/tests/unit/scrollspy.js b/bootstrap/fonts/js/tests/unit/scrollspy.js
new file mode 100755
index 0000000..be6808e
--- /dev/null
+++ b/bootstrap/fonts/js/tests/unit/scrollspy.js
@@ -0,0 +1,278 @@
+$(function () {
+ 'use strict';
+
+ QUnit.module('scrollspy plugin')
+
+ QUnit.test('should be defined on jquery object', function (assert) {
+ assert.expect(1)
+ assert.ok($(document.body).scrollspy, 'scrollspy method is defined')
+ })
+
+ QUnit.module('scrollspy', {
+ beforeEach: function () {
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
+ $.fn.bootstrapScrollspy = $.fn.scrollspy.noConflict()
+ },
+ afterEach: function () {
+ $.fn.scrollspy = $.fn.bootstrapScrollspy
+ delete $.fn.bootstrapScrollspy
+ }
+ })
+
+ QUnit.test('should provide no conflict', function (assert) {
+ assert.expect(1)
+ assert.strictEqual($.fn.scrollspy, undefined, 'scrollspy was set back to undefined (org value)')
+ })
+
+ QUnit.test('should return jquery collection containing the element', function (assert) {
+ assert.expect(2)
+ var $el = $('
')
+ var $scrollspy = $el.bootstrapScrollspy()
+ assert.ok($scrollspy instanceof $, 'returns jquery collection')
+ assert.strictEqual($scrollspy[0], $el[0], 'collection contains element')
+ })
+
+ QUnit.test('should only switch "active" class on current target', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ var sectionHTML = '
'
+ var $section = $(sectionHTML).appendTo('#qunit-fixture')
+
+ var $scrollspy = $section
+ .show()
+ .find('#scrollspy-example')
+ .bootstrapScrollspy({ target: '#ss-target' })
+
+ $scrollspy.on('scroll.bs.scrollspy', function () {
+ assert.ok($section.hasClass('active'), '"active" class still on root node')
+ done()
+ })
+
+ $scrollspy.scrollTop(350)
+ })
+
+ QUnit.test('should correctly select middle navigation option when large offset is used', function (assert) {
+ assert.expect(3)
+ var done = assert.async()
+
+ var sectionHTML = ''
+ + '
'
+ + ''
+ + ' '
+ + '
'
+ + '
'
+ + '
'
+ + '
'
+ + '
'
+ var $section = $(sectionHTML).appendTo('#qunit-fixture')
+ var $scrollspy = $section
+ .show()
+ .filter('#content')
+
+ $scrollspy.bootstrapScrollspy({ target: '#navigation', offset: $scrollspy.position().top })
+
+ $scrollspy.on('scroll.bs.scrollspy', function () {
+ assert.ok(!$section.find('#one-link').parent().hasClass('active'), '"active" class removed from first section')
+ assert.ok($section.find('#two-link').parent().hasClass('active'), '"active" class on middle section')
+ assert.ok(!$section.find('#three-link').parent().hasClass('active'), '"active" class not on last section')
+ done()
+ })
+
+ $scrollspy.scrollTop(550)
+ })
+
+ QUnit.test('should add the active class to the correct element', function (assert) {
+ assert.expect(2)
+ var navbarHtml =
+ '
'
+ + ''
+ + ' '
+ var contentHtml =
+ '
'
+ + '
div 1
'
+ + '
div 2
'
+ + '
'
+
+ $(navbarHtml).appendTo('#qunit-fixture')
+ var $content = $(contentHtml)
+ .appendTo('#qunit-fixture')
+ .bootstrapScrollspy({ offset: 0, target: '.navbar' })
+
+ var done = assert.async()
+ var testElementIsActiveAfterScroll = function (element, target) {
+ var deferred = $.Deferred()
+ var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
+ $content.one('scroll', function () {
+ assert.ok($(element).hasClass('active'), 'target:' + target + ', element' + element)
+ deferred.resolve()
+ })
+ $content.scrollTop(scrollHeight)
+ return deferred.promise()
+ }
+
+ $.when(testElementIsActiveAfterScroll('#li-1', '#div-1'))
+ .then(function () { return testElementIsActiveAfterScroll('#li-2', '#div-2') })
+ .then(function () { done() })
+ })
+
+ QUnit.test('should add the active class correctly when there are nested elements at 0 scroll offset', function (assert) {
+ assert.expect(6)
+ var times = 0
+ var done = assert.async()
+ var navbarHtml = '
'
+ + ''
+ + 'div 1 '
+ + ''
+ + ' '
+ + ' '
+ + ' '
+
+ var contentHtml = '
'
+
+ $(navbarHtml).appendTo('#qunit-fixture')
+
+ var $content = $(contentHtml)
+ .appendTo('#qunit-fixture')
+ .bootstrapScrollspy({ offset: 0, target: '#navigation' })
+
+ !function testActiveElements() {
+ if (++times > 3) return done()
+
+ $content.one('scroll', function () {
+ assert.ok($('#li-1').hasClass('active'), 'nav item for outer element has "active" class')
+ assert.ok($('#li-2').hasClass('active'), 'nav item for inner element has "active" class')
+ testActiveElements()
+ })
+
+ $content.scrollTop($content.scrollTop() + 10)
+ }()
+ })
+
+ QUnit.test('should clear selection if above the first section', function (assert) {
+ assert.expect(3)
+ var done = assert.async()
+
+ var sectionHTML = ''
+ + '
'
+ + ''
+ + ' '
+ $(sectionHTML).appendTo('#qunit-fixture')
+
+ var scrollspyHTML = '
'
+ + '
'
+ + '
'
+ + '
'
+ + '
'
+ + '
'
+ + '
'
+ var $scrollspy = $(scrollspyHTML).appendTo('#qunit-fixture')
+
+ $scrollspy
+ .bootstrapScrollspy({
+ target: '#navigation',
+ offset: $scrollspy.position().top
+ })
+ .one('scroll.bs.scrollspy', function () {
+ assert.strictEqual($('.active').length, 1, '"active" class on only one element present')
+ assert.strictEqual($('.active').has('#two-link').length, 1, '"active" class on second section')
+
+ $scrollspy
+ .one('scroll.bs.scrollspy', function () {
+ assert.strictEqual($('.active').length, 0, 'selection cleared')
+ done()
+ })
+ .scrollTop(0)
+ })
+ .scrollTop(201)
+ })
+
+ QUnit.test('should correctly select navigation element on backward scrolling when each target section height is 100%', function (assert) {
+ assert.expect(5)
+ var navbarHtml =
+ '
'
+ + ''
+ + ' '
+ var contentHtml =
+ '
'
+ + '
div 1
'
+ + '
div 2
'
+ + '
div 3
'
+ + '
div 4
'
+ + '
div 5
'
+ + '
'
+
+ $(navbarHtml).appendTo('#qunit-fixture')
+ var $content = $(contentHtml)
+ .appendTo('#qunit-fixture')
+ .bootstrapScrollspy({ offset: 0, target: '.navbar' })
+
+ var testElementIsActiveAfterScroll = function (element, target) {
+ var deferred = $.Deferred()
+ var scrollHeight = Math.ceil($content.scrollTop() + $(target).position().top)
+ $content.one('scroll', function () {
+ assert.ok($(element).hasClass('active'), 'target:' + target + ', element: ' + element)
+ deferred.resolve()
+ })
+ $content.scrollTop(scrollHeight)
+ return deferred.promise()
+ }
+
+ var done = assert.async()
+ $.when(testElementIsActiveAfterScroll('#li-100-5', '#div-100-5'))
+ .then(function () { return testElementIsActiveAfterScroll('#li-100-4', '#div-100-4') })
+ .then(function () { return testElementIsActiveAfterScroll('#li-100-3', '#div-100-3') })
+ .then(function () { return testElementIsActiveAfterScroll('#li-100-2', '#div-100-2') })
+ .then(function () { return testElementIsActiveAfterScroll('#li-100-1', '#div-100-1') })
+ .then(function () { done() })
+ })
+
+})
diff --git a/bootstrap/fonts/js/tests/unit/tab.js b/bootstrap/fonts/js/tests/unit/tab.js
new file mode 100755
index 0000000..83bdd67
--- /dev/null
+++ b/bootstrap/fonts/js/tests/unit/tab.js
@@ -0,0 +1,216 @@
+$(function () {
+ 'use strict';
+
+ QUnit.module('tabs plugin')
+
+ QUnit.test('should be defined on jquery object', function (assert) {
+ assert.expect(1)
+ assert.ok($(document.body).tab, 'tabs method is defined')
+ })
+
+ QUnit.module('tabs', {
+ beforeEach: function () {
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
+ $.fn.bootstrapTab = $.fn.tab.noConflict()
+ },
+ afterEach: function () {
+ $.fn.tab = $.fn.bootstrapTab
+ delete $.fn.bootstrapTab
+ }
+ })
+
+ QUnit.test('should provide no conflict', function (assert) {
+ assert.expect(1)
+ assert.strictEqual($.fn.tab, undefined, 'tab was set back to undefined (org value)')
+ })
+
+ QUnit.test('should return jquery collection containing the element', function (assert) {
+ assert.expect(2)
+ var $el = $('
')
+ var $tab = $el.bootstrapTab()
+ assert.ok($tab instanceof $, 'returns jquery collection')
+ assert.strictEqual($tab[0], $el[0], 'collection contains element')
+ })
+
+ QUnit.test('should activate element by tab id', function (assert) {
+ assert.expect(2)
+ var tabsHTML = '
'
+
+ $('
').appendTo('#qunit-fixture')
+
+ $(tabsHTML).find('li:last a').bootstrapTab('show')
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
+
+ $(tabsHTML).find('li:first a').bootstrapTab('show')
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
+ })
+
+ QUnit.test('should activate element by tab id', function (assert) {
+ assert.expect(2)
+ var pillsHTML = '
'
+
+ $('
').appendTo('#qunit-fixture')
+
+ $(pillsHTML).find('li:last a').bootstrapTab('show')
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'profile')
+
+ $(pillsHTML).find('li:first a').bootstrapTab('show')
+ assert.strictEqual($('#qunit-fixture').find('.active').attr('id'), 'home')
+ })
+
+ QUnit.test('should not fire shown when show is prevented', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ $('
')
+ .on('show.bs.tab', function (e) {
+ e.preventDefault()
+ assert.ok(true, 'show event fired')
+ done()
+ })
+ .on('shown.bs.tab', function () {
+ assert.ok(false, 'shown event fired')
+ })
+ .bootstrapTab('show')
+ })
+
+ QUnit.test('show and shown events should reference correct relatedTarget', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var dropHTML = '
'
+ + '1 '
+ + ''
+ + ' '
+ + ' '
+
+ $(dropHTML)
+ .find('ul > li:first a')
+ .bootstrapTab('show')
+ .end()
+ .find('ul > li:last a')
+ .on('show.bs.tab', function (e) {
+ assert.strictEqual(e.relatedTarget.hash, '#1-1', 'references correct element as relatedTarget')
+ })
+ .on('shown.bs.tab', function (e) {
+ assert.strictEqual(e.relatedTarget.hash, '#1-1', 'references correct element as relatedTarget')
+ done()
+ })
+ .bootstrapTab('show')
+ })
+
+ QUnit.test('should fire hide and hidden events', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var tabsHTML = '
'
+
+ $(tabsHTML)
+ .find('li:first a')
+ .on('hide.bs.tab', function () {
+ assert.ok(true, 'hide event fired')
+ })
+ .bootstrapTab('show')
+ .end()
+ .find('li:last a')
+ .bootstrapTab('show')
+
+ $(tabsHTML)
+ .find('li:first a')
+ .on('hidden.bs.tab', function () {
+ assert.ok(true, 'hidden event fired')
+ done()
+ })
+ .bootstrapTab('show')
+ .end()
+ .find('li:last a')
+ .bootstrapTab('show')
+ })
+
+ QUnit.test('should not fire hidden when hide is prevented', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ var tabsHTML = '
'
+
+ $(tabsHTML)
+ .find('li:first a')
+ .on('hide.bs.tab', function (e) {
+ e.preventDefault()
+ assert.ok(true, 'hide event fired')
+ done()
+ })
+ .on('hidden.bs.tab', function () {
+ assert.ok(false, 'hidden event fired')
+ })
+ .bootstrapTab('show')
+ .end()
+ .find('li:last a')
+ .bootstrapTab('show')
+ })
+
+ QUnit.test('hide and hidden events contain correct relatedTarget', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var tabsHTML = '
'
+
+ $(tabsHTML)
+ .find('li:first a')
+ .on('hide.bs.tab', function (e) {
+ assert.strictEqual(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
+ })
+ .on('hidden.bs.tab', function (e) {
+ assert.strictEqual(e.relatedTarget.hash, '#profile', 'references correct element as relatedTarget')
+ done()
+ })
+ .bootstrapTab('show')
+ .end()
+ .find('li:last a')
+ .bootstrapTab('show')
+ })
+
+ QUnit.test('selected tab should have aria-expanded', function (assert) {
+ assert.expect(8)
+ var tabsHTML = '
'
+ var $tabs = $(tabsHTML).appendTo('#qunit-fixture')
+
+ $tabs.find('li:first a').bootstrapTab('show')
+ assert.strictEqual($tabs.find('.active a').attr('aria-expanded'), 'true', 'shown tab has aria-expanded = true')
+ assert.strictEqual($tabs.find('li:not(.active) a').attr('aria-expanded'), 'false', 'hidden tab has aria-expanded = false')
+
+ $tabs.find('li:last a').trigger('click')
+ assert.strictEqual($tabs.find('.active a').attr('aria-expanded'), 'true', 'after click, shown tab has aria-expanded = true')
+ assert.strictEqual($tabs.find('li:not(.active) a').attr('aria-expanded'), 'false', 'after click, hidden tab has aria-expanded = false')
+
+ $tabs.find('li:first a').bootstrapTab('show')
+ assert.strictEqual($tabs.find('.active a').attr('aria-expanded'), 'true', 'shown tab has aria-expanded = true')
+ assert.strictEqual($tabs.find('li:not(.active) a').attr('aria-expanded'), 'false', 'hidden tab has aria-expanded = false')
+
+ $tabs.find('li:first a').trigger('click')
+ assert.strictEqual($tabs.find('.active a').attr('aria-expanded'), 'true', 'after second show event, shown tab still has aria-expanded = true')
+ assert.strictEqual($tabs.find('li:not(.active) a').attr('aria-expanded'), 'false', 'after second show event, hidden tab has aria-expanded = false')
+ })
+
+})
diff --git a/bootstrap/fonts/js/tests/unit/tooltip.js b/bootstrap/fonts/js/tests/unit/tooltip.js
new file mode 100755
index 0000000..d26224f
--- /dev/null
+++ b/bootstrap/fonts/js/tests/unit/tooltip.js
@@ -0,0 +1,1709 @@
+$(function () {
+ 'use strict';
+
+ QUnit.module('tooltip plugin')
+
+ QUnit.test('should be defined on jquery object', function (assert) {
+ assert.expect(1)
+ assert.ok($(document.body).tooltip, 'tooltip method is defined')
+ })
+
+ QUnit.module('tooltip', {
+ beforeEach: function () {
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
+ $.fn.bootstrapTooltip = $.fn.tooltip.noConflict()
+ },
+ afterEach: function () {
+ $.fn.tooltip = $.fn.bootstrapTooltip
+ delete $.fn.bootstrapTooltip
+ $('#qunit-fixture').html('')
+ }
+ })
+
+ QUnit.test('should provide no conflict', function (assert) {
+ assert.expect(1)
+ assert.strictEqual($.fn.tooltip, undefined, 'tooltip was set back to undefined (org value)')
+ })
+
+ QUnit.test('should return jquery collection containing the element', function (assert) {
+ assert.expect(2)
+ var $el = $('
').appendTo('#qunit-fixture')
+ var $tooltip = $el.bootstrapTooltip()
+ assert.ok($tooltip instanceof $, 'returns jquery collection')
+ assert.strictEqual($tooltip[0], $el[0], 'collection contains element')
+ })
+
+ QUnit.test('should expose default settings', function (assert) {
+ assert.expect(1)
+ assert.ok($.fn.bootstrapTooltip.Constructor.DEFAULTS, 'defaults is defined')
+ })
+
+ QUnit.test('should empty title attribute', function (assert) {
+ assert.expect(1)
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip()
+
+ assert.strictEqual($trigger.attr('title'), '', 'title attribute was emptied')
+ })
+
+ QUnit.test('should add data attribute for referencing original title', function (assert) {
+ assert.expect(1)
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip()
+
+ assert.strictEqual($trigger.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
+ })
+
+ QUnit.test('should add aria-describedby to the trigger on show', function (assert) {
+ assert.expect(3)
+ var done = assert.async()
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+
+ $trigger
+ .bootstrapTooltip()
+ .on('shown.bs.tooltip', function () {
+ var id = $('.tooltip').attr('id')
+
+ assert.strictEqual($('#' + id).length, 1, 'has a unique id')
+ assert.strictEqual($('.tooltip').attr('aria-describedby'), $trigger.attr('id'), 'tooltip id and aria-describedby on trigger match')
+ assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should remove aria-describedby from trigger on hide', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $trigger = $('
')
+ .bootstrapTooltip()
+ .appendTo('#qunit-fixture')
+
+ $trigger.one('shown.bs.tooltip', function () {
+ assert.ok($trigger[0].hasAttribute('aria-describedby'), 'trigger has aria-describedby')
+ $trigger.bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.ok(!$trigger[0].hasAttribute('aria-describedby'), 'trigger does not have aria-describedby')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should assign a unique id tooltip element', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .on('shown.bs.tooltip', function () {
+ var id = $('.tooltip').attr('id')
+
+ assert.strictEqual($('#' + id).length, 1, 'tooltip has unique id')
+ assert.strictEqual(id.indexOf('tooltip'), 0, 'tooltip id has prefix')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should place tooltips relative to placement option', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
+ $tooltip.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed')
+ done()
+ })
+ .bootstrapTooltip({ placement: 'bottom' })
+
+ $tooltip.bootstrapTooltip('show')
+ })
+
+ QUnit.test('should allow html entities', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ html: true })
+
+ $tooltip.one('shown.bs.tooltip', function () {
+ assert.notEqual($('.tooltip b').length, 0, 'b tag was inserted')
+ $tooltip.bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should respect custom classes', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ template: '
' })
+
+ $tooltip.one('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').hasClass('some-class'), 'custom class is present')
+ $tooltip.bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should fire show event', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ $('
')
+ .on('show.bs.tooltip', function () {
+ assert.ok(true, 'show event fired')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should fire inserted event', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .on('inserted.bs.tooltip', function () {
+ assert.notEqual($('.tooltip').length, 0, 'tooltip was inserted')
+ assert.ok(true, 'inserted event fired')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should fire shown event', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .on('shown.bs.tooltip', function () {
+ assert.ok(true, 'shown was called')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should not fire shown event when show was prevented', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ $('
')
+ .on('show.bs.tooltip', function (e) {
+ e.preventDefault()
+ assert.ok(true, 'show event fired')
+ done()
+ })
+ .on('shown.bs.tooltip', function () {
+ assert.ok(false, 'shown event fired')
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should fire hide event', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .on('shown.bs.tooltip', function () {
+ $(this).bootstrapTooltip('hide')
+ })
+ .on('hide.bs.tooltip', function () {
+ assert.ok(true, 'hide event fired')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should fire hidden event', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .on('shown.bs.tooltip', function () {
+ $(this).bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.ok(true, 'hidden event fired')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should not fire hidden event when hide was prevented', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .on('shown.bs.tooltip', function () {
+ $(this).bootstrapTooltip('hide')
+ })
+ .on('hide.bs.tooltip', function (e) {
+ e.preventDefault()
+ assert.ok(true, 'hide event fired')
+ done()
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.ok(false, 'hidden event fired')
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should destroy tooltip', function (assert) {
+ assert.expect(7)
+ var $tooltip = $('
')
+ .bootstrapTooltip()
+ .on('click.foo', function () {})
+
+ assert.ok($tooltip.data('bs.tooltip'), 'tooltip has data')
+ assert.ok($._data($tooltip[0], 'events').mouseover && $._data($tooltip[0], 'events').mouseout, 'tooltip has hover events')
+ assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
+
+ $tooltip.bootstrapTooltip('show')
+ $tooltip.bootstrapTooltip('destroy')
+
+ assert.ok(!$tooltip.hasClass('in'), 'tooltip is hidden')
+ assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
+ assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip still has click.foo')
+ assert.ok(!$._data($tooltip[0], 'events').mouseover && !$._data($tooltip[0], 'events').mouseout, 'tooltip does not have hover events')
+ })
+
+ QUnit.test('should show tooltip with delegate selector on click', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $div = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ selector: 'a[rel="tooltip"]',
+ trigger: 'click'
+ })
+
+ $div.one('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
+ $div.find('a').trigger('click')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip was removed from dom')
+ done()
+ })
+
+ $div.find('a').trigger('click')
+ })
+
+ QUnit.test('should show tooltip when toggle is called', function (assert) {
+ assert.expect(1)
+ $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ trigger: 'manual' })
+ .bootstrapTooltip('toggle')
+
+ assert.ok($('.tooltip').is('.fade.in'), 'tooltip is faded in')
+ })
+
+ QUnit.test('should hide previously shown tooltip when toggle is called on tooltip', function (assert) {
+ assert.expect(1)
+ $('
@ResentedHook ')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ trigger: 'manual' })
+ .bootstrapTooltip('show')
+
+ $('.tooltip').bootstrapTooltip('toggle')
+ assert.ok($('.tooltip').not('.fade.in'), 'tooltip was faded out')
+ })
+
+ QUnit.test('should place tooltips inside body when container is body', function (assert) {
+ assert.expect(3)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ container: 'body' })
+ .one('shown.bs.tooltip', function () {
+ assert.notEqual($('body > .tooltip').length, 0, 'tooltip is direct descendant of body')
+ assert.strictEqual($('#qunit-fixture > .tooltip').length, 0, 'tooltip is not in parent')
+
+ $(this).bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('body > .tooltip').length, 0, 'tooltip was removed from dom')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
+ assert.expect(1)
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'right',
+ viewport: null
+ })
+ .bootstrapTooltip('show')
+ var $tooltip = $container.find('.tooltip')
+
+ // this is some dumb hack shit because sub pixels in firefox
+ var top = Math.round($target.offset().top + ($target[0].offsetHeight / 2) - ($tooltip[0].offsetHeight / 2))
+ var top2 = Math.round($tooltip.offset().top)
+ var topDiff = top - top2
+ assert.ok(topDiff <= 1 && topDiff >= -1)
+ $target.bootstrapTooltip('hide')
+
+ $container.remove()
+ $styles.remove()
+ })
+
+ QUnit.test('should use title attribute for tooltip text', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip()
+ .one('shown.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')
+
+ $(this).bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ done()
+ })
+ .bootstrapTooltip('show')
+
+ })
+
+ QUnit.test('should prefer title attribute over title option', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ title: 'This is a tooltip with some content'
+ })
+ .one('shown.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while preferred over title option')
+ $(this).bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should use title option', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ title: 'This is a tooltip with some content'
+ })
+ .one('shown.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')
+ $(this).bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should be placed dynamically to viewport with the dynamic placement option', function (assert) {
+ assert.expect(6)
+ var done = assert.async()
+
+ var $style = $('').appendTo('head')
+ var $container = $('
')
+ .css({
+ position: 'relative',
+ height: '100%'
+ })
+ .appendTo('#qunit-fixture')
+
+ var $topTooltip = $('
Top Dynamic Tooltip
')
+ .appendTo($container)
+ .bootstrapTooltip({ placement: 'auto', viewport: '#qunit-fixture' })
+
+ var topDone = false
+ var rightDone = false
+ var leftDone = false
+
+ function isDone() {
+ if (topDone && rightDone && leftDone) {
+ $container.remove()
+ $style.remove()
+ done()
+ }
+ }
+
+ function leftTooltip() {
+ var $leftTooltip = $('
Left Dynamic Tooltip
')
+ .appendTo($container)
+ .bootstrapTooltip({ placement: 'auto left', viewport: '#qunit-fixture' })
+
+ $leftTooltip
+ .one('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.right'), 'left positioned tooltip is dynamically positioned right')
+ $leftTooltip.bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'left positioned tooltip removed from dom')
+ leftDone = true
+ isDone()
+ })
+ .bootstrapTooltip('show')
+ }
+
+ function rightTooltip() {
+ var $rightTooltip = $('
Right Dynamic Tooltip
')
+ .appendTo($container)
+ .bootstrapTooltip({ placement: 'right auto', viewport: '#qunit-fixture' })
+
+ $rightTooltip
+ .one('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.in'), 'right positioned tooltip is dynamically positioned left')
+ $rightTooltip.bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'right positioned tooltip removed from dom')
+ rightDone = true
+ leftTooltip()
+ })
+ .bootstrapTooltip('show')
+ }
+
+ $topTooltip
+ .one('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.bottom'), 'top positioned tooltip is dynamically positioned to bottom')
+ $topTooltip.bootstrapTooltip('hide')
+ })
+ .one('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'top positioned tooltip removed from dom')
+ topDone = true
+ rightTooltip()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should position tip on top if viewport has enough space and placement is "auto top"', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'auto top',
+ viewport: '#section'
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.top'), 'top positioned tooltip is dynamically positioned to top')
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should position tip on top if viewport has enough space and is not parent', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'auto top',
+ viewport: '#qunit-fixture'
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.top'), 'top positioned tooltip is dynamically positioned to top')
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should position tip on bottom if the tip\'s dimension exceeds the viewport area and placement is "auto top"', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'auto top',
+ viewport: '#section'
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.bottom'), 'top positioned tooltip is dynamically positioned to bottom')
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should display the tip on top whenever scrollable viewport has enough room if the given placement is "auto top"', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
Tooltip Item
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'top auto',
+ viewport: '#scrollable-div'
+ })
+
+ $('#scrollable-div').scrollTop(100)
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should display the tip on bottom whenever scrollable viewport doesn\'t have enough room if the given placement is "auto top"', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
Tooltip Item
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'top auto',
+ viewport: '#scrollable-div'
+ })
+
+ $('#scrollable-div').scrollTop(200)
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should display the tip on bottom whenever scrollable viewport has enough room if the given placement is "auto bottom"', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
Tooltip Item
')
+ .appendTo($container)
+ .before('
')
+ .after('
')
+ .bootstrapTooltip({
+ placement: 'bottom auto',
+ viewport: '#scrollable-div'
+ })
+
+ $('#scrollable-div').scrollTop(200)
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.fade.bottom.in'), 'has correct classes applied')
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should display the tip on top whenever scrollable viewport doesn\'t have enough room if the given placement is "auto bottom"', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
Tooltip Item
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'bottom auto',
+ viewport: '#scrollable-div'
+ })
+
+ $('#scrollable-div').scrollTop(400)
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.ok($('.tooltip').is('.fade.top.in'), 'has correct classes applied')
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should adjust the tip\'s top position when up against the top of the viewport', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'right',
+ viewport: {
+ selector: 'body',
+ padding: 12
+ }
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.strictEqual(Math.round($container.find('.tooltip').offset().top), 12)
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should adjust the tip\'s top position when up against the bottom of the viewport', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'right',
+ viewport: {
+ selector: 'body',
+ padding: 12
+ }
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ var $tooltip = $container.find('.tooltip')
+ var padding = 50
+ var result = Math.round($tooltip.offset().top)
+ var resultMax = result + padding
+ var resultMin = result - padding
+ var expected = Math.round($(window).height() - 12 - $tooltip[0].offsetHeight)
+
+ assert.ok(expected < resultMax && expected > resultMin)
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $container.remove()
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should adjust the tip\'s left position when up against the left of the viewport', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('#qunit-fixture')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'bottom',
+ viewport: {
+ selector: 'body',
+ padding: 12
+ }
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ assert.strictEqual(Math.round($container.find('.tooltip').offset().left), 12)
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $container.remove()
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should adjust the tip\'s left position when up against the right of the viewport', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo('body')
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'bottom',
+ viewport: {
+ selector: 'body',
+ padding: 12
+ }
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ var $tooltip = $container.find('.tooltip')
+ assert.strictEqual(Math.round($tooltip.offset().left), Math.round($(window).width() - 12 - $tooltip[0].offsetWidth))
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $container.remove()
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should adjust the tip when up against the right of an arbitrary viewport', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo(document.body)
+ var $target = $('
')
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'bottom',
+ viewport: '.container-viewport'
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ var $tooltip = $container.find('.tooltip')
+ assert.strictEqual(Math.round($tooltip.offset().left), Math.round(60 + $container.width() - $tooltip[0].offsetWidth))
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $container.remove()
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should get viewport element from function', function (assert) {
+ assert.expect(3)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo(document.body)
+ var $target = $('
').appendTo($container)
+ $target
+ .bootstrapTooltip({
+ placement: 'bottom',
+ viewport: function ($element) {
+ assert.strictEqual($element[0], $target[0], 'viewport function was passed target as argument')
+ return ($element.closest('.container-viewport'))
+ }
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ var $tooltip = $container.find('.tooltip')
+ assert.strictEqual(Math.round($tooltip.offset().left), Math.round(60 + $container.width() - $tooltip[0].offsetWidth))
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $container.remove()
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should not misplace the tip when the right edge offset is greater or equal than the viewport width', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $container = $('
').appendTo(document.body)
+ var $target = $('
foobar ')
+ .appendTo($container)
+ .bootstrapTooltip({
+ viewport: '.container-viewport'
+ })
+
+ $target
+ .on('shown.bs.tooltip', function () {
+ var $tooltip = $container.find('.tooltip')
+ var expected = Math.round($target.position().left + $target.width() / 2 - $tooltip[0].offsetWidth / 2)
+ var result = Math.round($tooltip.offset().left)
+ assert.ok(result === (expected - 1) || result === expected)
+ $target.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ $container.remove()
+ $styles.remove()
+ done()
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should not error when trying to show an auto-placed tooltip that has been removed from the dom', function (assert) {
+ assert.expect(1)
+ var passed = true
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .one('show.bs.tooltip', function () {
+ $(this).remove()
+ })
+ .bootstrapTooltip({ placement: 'auto' })
+
+ try {
+ $tooltip.bootstrapTooltip('show')
+ } catch (err) {
+ passed = false
+ console.log(err)
+ }
+
+ assert.ok(passed, '.tooltip(\'show\') should not throw an error if element no longer is in dom')
+ })
+
+ QUnit.test('should place tooltip on top of element', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ var containerHTML = '
'
+
+ var $container = $(containerHTML)
+ .css({
+ position: 'absolute',
+ bottom: 0,
+ left: 0,
+ textAlign: 'right',
+ width: 300,
+ height: 300
+ })
+ .appendTo('#qunit-fixture')
+
+ var $trigger = $container
+ .find('a')
+ .css('margin-top', 200)
+ .bootstrapTooltip({
+ placement: 'top',
+ animate: false
+ })
+ .bootstrapTooltip('show')
+
+ var $tooltip = $container.find('.tooltip')
+
+ setTimeout(function () {
+ assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
+ done()
+ }, 0)
+ })
+
+ QUnit.test('should place tooltip inside viewport', function (assert) {
+ assert.expect(1)
+ var done = assert.async()
+
+ var $container = $('
')
+ .css({
+ position: 'absolute',
+ width: 200,
+ height: 200,
+ bottom: 0,
+ left: 0
+ })
+ .appendTo('#qunit-fixture')
+
+ $('
Hover me ')
+ .css({
+ position: 'absolute',
+ top: 0,
+ left: 0
+ })
+ .appendTo($container)
+ .bootstrapTooltip({
+ placement: 'top'
+ })
+ .bootstrapTooltip('show')
+
+ setTimeout(function () {
+ assert.ok($('.tooltip').offset().left >= 0)
+ done()
+ }, 0)
+ })
+
+ QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ delay: 150 })
+
+ setTimeout(function () {
+ assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip is not faded in')
+ }, 100)
+
+ setTimeout(function () {
+ assert.ok($('.tooltip').is('.fade.in'), '200ms: tooltip is faded in')
+ done()
+ }, 200)
+
+ $tooltip.trigger('mouseenter')
+ })
+
+ QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ delay: 150 })
+
+ setTimeout(function () {
+ assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
+ $tooltip.trigger('mouseout')
+ }, 100)
+
+ setTimeout(function () {
+ assert.ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
+ done()
+ }, 200)
+
+ $tooltip.trigger('mouseenter')
+ })
+
+ QUnit.test('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', function (assert) {
+ assert.expect(3)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ delay: { show: 0, hide: 150 }})
+
+ setTimeout(function () {
+ assert.ok($('.tooltip').is('.fade.in'), '1ms: tooltip faded in')
+ $tooltip.trigger('mouseout')
+
+ setTimeout(function () {
+ assert.ok($('.tooltip').is('.fade.in'), '100ms: tooltip still faded in')
+ $tooltip.trigger('mouseenter')
+ }, 100)
+
+ setTimeout(function () {
+ assert.ok($('.tooltip').is('.fade.in'), '200ms: tooltip still faded in')
+ done()
+ }, 200)
+ }, 0)
+
+ $tooltip.trigger('mouseenter')
+ })
+
+ QUnit.test('should not show tooltip if leave event occurs before delay expires', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ delay: 150 })
+
+ setTimeout(function () {
+ assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
+ $tooltip.trigger('mouseout')
+ }, 100)
+
+ setTimeout(function () {
+ assert.ok(!$('.tooltip').is('.fade.in'), '200ms: tooltip not faded in')
+ done()
+ }, 200)
+
+ $tooltip.trigger('mouseenter')
+ })
+
+ QUnit.test('should not show tooltip if leave event occurs before delay expires, even if hide delay is 0', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ delay: { show: 150, hide: 0 }})
+
+ setTimeout(function () {
+ assert.ok(!$('.tooltip').is('.fade.in'), '100ms: tooltip not faded in')
+ $tooltip.trigger('mouseout')
+ }, 100)
+
+ setTimeout(function () {
+ assert.ok(!$('.tooltip').is('.fade.in'), '250ms: tooltip not faded in')
+ done()
+ }, 250)
+
+ $tooltip.trigger('mouseenter')
+ })
+
+ QUnit.test('should wait 200ms before hiding the tooltip', function (assert) {
+ if (window.__karma__) {
+ assert.expect(0)
+ return
+ }
+
+ assert.expect(3)
+ var done = assert.async()
+
+ var $tooltip = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ delay: { show: 0, hide: 150 }})
+
+ setTimeout(function () {
+ assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '1ms: tooltip faded in')
+
+ $tooltip.trigger('mouseout')
+
+ setTimeout(function () {
+ assert.ok($tooltip.data('bs.tooltip').$tip.is('.fade.in'), '100ms: tooltip still faded in')
+ }, 100)
+
+ setTimeout(function () {
+ assert.ok(!$tooltip.data('bs.tooltip').$tip.is('.in'), '200ms: tooltip removed')
+ done()
+ }, 200)
+
+ }, 0)
+
+ $tooltip.trigger('mouseenter')
+ })
+
+ QUnit.test('should correctly position tooltips on SVG elements', function (assert) {
+ if (!window.SVGElement) {
+ // Skip IE8 since it doesn't support SVG
+ assert.expect(0)
+ return
+ }
+ assert.expect(2)
+
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ $('#qunit-fixture').append(
+ '
'
+ + ' '
+ + ' '
+ + ' '
+ + '
')
+ var $circle = $('#theCircle')
+
+ $circle
+ .on('shown.bs.tooltip', function () {
+ var offset = $('.tooltip').offset()
+ $styles.remove()
+ assert.ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
+ $circle.bootstrapTooltip('hide')
+
+ })
+ .on('hidden.bs.tooltip', function () {
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ done()
+ })
+ .bootstrapTooltip({ container: 'body', placement: 'top', trigger: 'manual' })
+
+ $circle.bootstrapTooltip('show')
+ })
+
+ QUnit.test('should correctly determine auto placement based on container rather than parent', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ $('#qunit-fixture').append('
HOVER OVER ME ')
+ var $trigger = $('#tt-trigger')
+
+ $trigger
+ .on('shown.bs.tooltip', function () {
+ var $tip = $('.tooltip-inner')
+ var tipXrightEdge = $tip.offset().left + $tip.width()
+ var triggerXleftEdge = $trigger.offset().left
+ assert.ok(tipXrightEdge < triggerXleftEdge, 'tooltip with auto left placement, when near the right edge of the viewport, gets left placement')
+ $trigger.bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ $styles.remove()
+ $(this).remove()
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ done()
+ })
+ .bootstrapTooltip({
+ container: 'body',
+ placement: 'auto left',
+ trigger: 'manual'
+ })
+
+ $trigger.bootstrapTooltip('show')
+ })
+
+ QUnit.test('should not reload the tooltip on subsequent mouseenter events', function (assert) {
+ assert.expect(1)
+ var titleHtml = function () {
+ var uid = $.fn.bootstrapTooltip.Constructor.prototype.getUID('tooltip')
+ return '
' + uid + '
' + uid + '
' + uid + '
'
+ }
+
+ var $tooltip = $('
some text ')
+ .appendTo('#qunit-fixture')
+
+ $tooltip.bootstrapTooltip({
+ html: true,
+ animation: false,
+ trigger: 'hover',
+ delay: { show: 0, hide: 500 },
+ container: $tooltip,
+ title: titleHtml
+ })
+
+ $('#tt-outer').trigger('mouseenter')
+
+ var currentUid = $('#tt-content').text()
+
+ $('#tt-content').trigger('mouseenter')
+ assert.strictEqual(currentUid, $('#tt-content').text())
+ })
+
+ QUnit.test('should not reload the tooltip if the mouse leaves and re-enters before hiding', function (assert) {
+ assert.expect(4)
+ var titleHtml = function () {
+ var uid = $.fn.bootstrapTooltip.Constructor.prototype.getUID('tooltip')
+ return '
' + uid + '
' + uid + '
' + uid + '
'
+ }
+
+ var $tooltip = $('
some text ')
+ .appendTo('#qunit-fixture')
+
+ $tooltip.bootstrapTooltip({
+ html: true,
+ animation: false,
+ trigger: 'hover',
+ delay: { show: 0, hide: 500 },
+ container: $tooltip,
+ title: titleHtml
+ })
+
+ var obj = $tooltip.data('bs.tooltip')
+
+ $('#tt-outer').trigger('mouseenter')
+
+ var currentUid = $('#tt-content').text()
+
+ $('#tt-outer').trigger('mouseleave')
+ assert.strictEqual(currentUid, $('#tt-content').text())
+
+ assert.ok(obj.hoverState == 'out', 'the tooltip hoverState should be set to "out"')
+
+ $('#tt-content').trigger('mouseenter')
+ assert.ok(obj.hoverState == 'in', 'the tooltip hoverState should be set to "in"')
+
+ assert.strictEqual(currentUid, $('#tt-content').text())
+ })
+
+ QUnit.test('should position arrow correctly when tooltip is moved to not appear offscreen', function (assert) {
+ assert.expect(2)
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ $('
Foobar ')
+ .appendTo('body')
+ .on('shown.bs.tooltip', function () {
+ var arrowStyles = $(this).data('bs.tooltip').$tip.find('.tooltip-arrow').attr('style')
+ assert.ok(/left/i.test(arrowStyles) && !/top/i.test(arrowStyles), 'arrow positioned correctly')
+ $(this).bootstrapTooltip('hide')
+ })
+ .on('hidden.bs.tooltip', function () {
+ $styles.remove()
+ $(this).remove()
+ assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
+ done()
+ })
+ .bootstrapTooltip({
+ container: 'body',
+ placement: 'top',
+ trigger: 'manual'
+ })
+ .bootstrapTooltip('show')
+ })
+
+ QUnit.test('should correctly position tooltips on transformed elements', function (assert) {
+ var styleProps = document.documentElement.style
+ if ((!('transform' in styleProps) && !('webkitTransform' in styleProps) && !('msTransform' in styleProps)) || window.__karma__) {
+ assert.expect(0)
+ return
+ }
+
+ assert.expect(2)
+
+ var done = assert.async()
+
+ var styles = ''
+ var $styles = $(styles).appendTo('head')
+
+ var $element = $('
').appendTo('#qunit-fixture')
+
+ $element
+ .on('shown.bs.tooltip', function () {
+ var offset = $('.tooltip').offset()
+ $styles.remove()
+ assert.ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
+ assert.ok(Math.abs(offset.top - 126) <= 1, 'tooltip has correct vertical location')
+ $element.bootstrapTooltip('hide')
+ done()
+ })
+ .bootstrapTooltip({
+ container: 'body',
+ placement: 'top',
+ trigger: 'manual'
+ })
+
+ $element.bootstrapTooltip('show')
+ })
+
+ QUnit.test('should throw an error when initializing tooltip on the document object without specifying a delegation selector', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+ $(document).bootstrapTooltip({ title: 'What am I on?' })
+ }, new Error('`selector` option must be specified when initializing tooltip on the window.document object!'))
+ })
+
+ QUnit.test('should do nothing when an attempt is made to hide an uninitialized tooltip', function (assert) {
+ assert.expect(1)
+
+ var $tooltip = $('
some text ')
+ .appendTo('#qunit-fixture')
+ .on('hidden.bs.tooltip shown.bs.tooltip', function () {
+ assert.ok(false, 'should not fire any tooltip events')
+ })
+ .bootstrapTooltip('hide')
+ assert.strictEqual($tooltip.data('bs.tooltip'), undefined, 'should not initialize the tooltip')
+ })
+
+ QUnit.test('should throw an error when template contains multiple top-level elements', function (assert) {
+ assert.expect(1)
+ assert.throws(function () {
+ $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ template: '
Foo
Bar
' })
+ .bootstrapTooltip('show')
+ }, new Error('tooltip `template` option must consist of exactly 1 top-level element!'))
+ })
+
+ QUnit.test('should not remove tooltip if multiple triggers are set and one is still active', function (assert) {
+ assert.expect(41)
+ var $el = $('
Trigger ')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({ trigger: 'click hover focus', animation: false })
+ var tooltip = $el.data('bs.tooltip')
+ var $tooltip = tooltip.tip()
+
+ function showingTooltip() { return $tooltip.hasClass('in') || tooltip.hoverState == 'in' }
+
+ var tests = [
+ ['mouseenter', 'mouseleave'],
+
+ ['focusin', 'focusout'],
+
+ ['click', 'click'],
+
+ ['mouseenter', 'focusin', 'focusout', 'mouseleave'],
+ ['mouseenter', 'focusin', 'mouseleave', 'focusout'],
+
+ ['focusin', 'mouseenter', 'mouseleave', 'focusout'],
+ ['focusin', 'mouseenter', 'focusout', 'mouseleave'],
+
+ ['click', 'focusin', 'mouseenter', 'focusout', 'mouseleave', 'click'],
+ ['mouseenter', 'click', 'focusin', 'focusout', 'mouseleave', 'click'],
+ ['mouseenter', 'focusin', 'click', 'click', 'mouseleave', 'focusout']
+ ]
+
+ assert.ok(!showingTooltip())
+
+ $.each(tests, function (idx, triggers) {
+ for (var i = 0, len = triggers.length; i < len; i++) {
+ $el.trigger(triggers[i])
+ assert.equal(i < (len - 1), showingTooltip())
+ }
+ })
+ })
+
+ QUnit.test('should disable sanitizer', function (assert) {
+ assert.expect(1)
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ sanitize: false
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+ assert.strictEqual(tooltip.options.sanitize, false)
+ })
+
+ QUnit.test('should sanitize template by removing disallowed tags', function (assert) {
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
+ assert.expect(0)
+
+ return
+ }
+
+ assert.expect(1)
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ template: [
+ '
',
+ ' ',
+ ' Some content ',
+ '
'
+ ].join('')
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+ assert.strictEqual(tooltip.options.template.indexOf('script'), -1)
+ })
+
+ QUnit.test('should sanitize template by removing disallowed attributes', function (assert) {
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
+ assert.expect(0)
+
+ return
+ }
+
+ assert.expect(1)
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ template: [
+ '
',
+ '
Some content',
+ '
'
+ ].join('')
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+ assert.strictEqual(tooltip.options.template.indexOf('onError'), -1)
+ })
+
+ QUnit.test('should sanitize template by removing tags with XSS', function (assert) {
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
+ assert.expect(0)
+
+ return
+ }
+
+ assert.expect(1)
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ template: [
+ '
',
+ '
Click me ',
+ '
Some content ',
+ '
'
+ ].join('')
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+ assert.strictEqual(tooltip.options.template.indexOf('javascript'), -1)
+ })
+
+ QUnit.test('should allow custom sanitization rules', function (assert) {
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
+ assert.expect(0)
+
+ return
+ }
+
+ assert.expect(2)
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ template: [
+ '
Click me ',
+ '
Some content '
+ ].join(''),
+ whiteList: {
+ span: null
+ }
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+
+ assert.strictEqual(tooltip.options.template.indexOf('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ template: [
+ '
Some content '
+ ].join(''),
+ sanitizeFn: function (input) {
+ return input
+ }
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+
+ assert.ok(tooltip.options.template.indexOf('span') !== -1)
+ })
+
+ QUnit.test('should allow passing aria attributes', function (assert) {
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
+ assert.expect(0)
+
+ return
+ }
+
+ assert.expect(1)
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ template: [
+ '
Some content '
+ ].join('')
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+
+ assert.ok(tooltip.options.template.indexOf('aria-pressed') !== -1)
+ })
+
+ QUnit.test('should not take into account sanitize in data attributes', function (assert) {
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
+ assert.expect(0)
+
+ return
+ }
+
+ assert.expect(1)
+
+ var $trigger = $('
')
+ .appendTo('#qunit-fixture')
+ .bootstrapTooltip({
+ template: [
+ '
Some content '
+ ].join('')
+ })
+
+ var tooltip = $trigger.data('bs.tooltip')
+
+ assert.strictEqual(tooltip.options.sanitize, true)
+ })
+})
diff --git a/bootstrap/fonts/js/tests/vendor/jquery.min.js b/bootstrap/fonts/js/tests/vendor/jquery.min.js
new file mode 100755
index 0000000..e836475
--- /dev/null
+++ b/bootstrap/fonts/js/tests/vendor/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="
",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d
b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
+}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" a ",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:l.htmlSerialize?[0,"",""]:[1,"X","
"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h ]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/
+
+
+
+
+
+
+
+
+
+
+
+ Cras justo odio
+ Dapibus ac facilisis in
+ Morbi leo risus
+ Porta ac consectetur ac
+ Vestibulum at eros
+ Cras justo odio
+ Dapibus ac facilisis in
+ Morbi leo risus
+ Porta ac consectetur ac
+ Vestibulum at eros
+ Cras justo odio
+ Dapibus ac facilisis in
+ Morbi leo risus
+ Porta ac consectetur ac
+ Vestibulum at eros
+ Porta ac consectetur ac
+
+
+
+
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue. Maecenas sed diam eget risus varius blandit sit amet non magna.
+
+
Nullam id dolor id nibh ultricies vehicula ut id elit. Etiam porta sem malesuada magna mollis euismod. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam.
+
+
Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue.
+
+
Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+
+
+
+
+
+ Sit necessitatibus aspernatur.
+ Adipisicing alias dolor!
+ Ipsum molestiae impedit.
+ Amet quis iste?
+ Ipsum quaerat porro.
+ Elit lorem libero.
+ Ipsum dolore facilis.
+ Elit ad atque.
+ Dolor amet sequi!
+ Consectetur voluptatum facilis!
+ Sit neque eligendi?
+ Amet fuga consectetur!
+ Amet molestias repellat!
+ Consectetur minima repellendus.
+ Grow content
+ Shrink content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+