From 2914d01e8f1a323c5f94a1f9949ed9dcb6db8960 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Fri, 22 Mar 2019 12:03:59 +0100 Subject: [PATCH] Add css and js. Add lots of org mode files. --- css/htmlize.css | 145 +++ css/readtheorg.css | 1095 +++++++++++++++++ figs/stewart_ball_joints.png | Bin 0 -> 5057 bytes figs/stewart_bottom_plate.png | Bin 0 -> 39477 bytes figs/stewart_legs.png | Bin 0 -> 21922 bytes identification.html | 571 +++++++++ identification.org | 242 ++++ index.html | 301 +++++ index.org | 639 +--------- js/bootstrap.min.js | 7 + js/jquery.min.js | 4 + js/jquery.stickytableheaders.min.js | 1 + js/readtheorg.js | 85 ++ js/siunitx.js | 2 + kinematic-study.html | 316 +++++ kinematic-study.org | 49 + mat/G.mat | Bin 16341 -> 0 bytes mat/G_iff.mat | Bin 90985 -> 0 bytes mat/G_jacobian.mat | Bin 132424 -> 0 bytes mat/K_iff.mat | Bin 1030 -> 0 bytes mat/K_iff_sisotool.mat | Bin 2216 -> 0 bytes mat/config.mat | Bin 7928 -> 0 bytes mat/controllers.mat | Bin 21840 -> 0 bytes mat/sample.mat | Bin 286 -> 278 bytes mat/stewart.mat | Bin 1589 -> 1474 bytes .../active_damping}/act_damp_iff_generate.m | 0 .../active_damping}/act_damp_iff_id.m | 0 .../active_damping}/act_damp_iff_plots.m | 0 .../active_damping}/act_damp_main.m | 0 .../analysis}/analysis_stiffness.m | 0 analyze_jacobian.m => old/analyze_jacobian.m | 0 config.m => old/config.m | 0 {identification => old/identification}/id_G.m | 0 .../identification}/id_jacobian.m | 0 .../identification}/id_jacobian_plots.m | 0 .../identification}/id_main.m | 0 .../identification}/id_plot_cart.m | 0 .../identification}/id_plot_db.m | 0 .../identification}/id_plot_iff.m | 0 .../identification}/id_plot_legs.m | 0 main.m => old/main.m | 0 .../plot_max_positions.m | 0 {studies => old/studies}/com.m | 0 {studies => old/studies}/coupling.m | 0 {studies => old/studies}/stiffness_matrix.m | 0 .../study_architecture.m | 0 simscape-model.html | 855 +++++++++++++ simscape-model.org | 503 ++++++++ src/identifyPlant.m | 108 +- src/initializeHexapod.m | 199 ++- src/initializeSample.m | 6 +- stewart.slx | Bin 68491 -> 67479 bytes stiffness-study.html | 284 +++++ stiffness-study.org | 20 + 54 files changed, 4756 insertions(+), 676 deletions(-) create mode 100644 css/htmlize.css create mode 100644 css/readtheorg.css create mode 100644 figs/stewart_ball_joints.png create mode 100644 figs/stewart_bottom_plate.png create mode 100644 figs/stewart_legs.png create mode 100644 identification.html create mode 100644 identification.org create mode 100644 index.html create mode 100644 js/bootstrap.min.js create mode 100644 js/jquery.min.js create mode 100644 js/jquery.stickytableheaders.min.js create mode 100644 js/readtheorg.js create mode 100644 js/siunitx.js create mode 100644 kinematic-study.html create mode 100644 kinematic-study.org delete mode 100644 mat/G.mat delete mode 100644 mat/G_iff.mat delete mode 100644 mat/G_jacobian.mat delete mode 100644 mat/K_iff.mat delete mode 100644 mat/K_iff_sisotool.mat delete mode 100644 mat/config.mat delete mode 100644 mat/controllers.mat rename {active_damping => old/active_damping}/act_damp_iff_generate.m (100%) rename {active_damping => old/active_damping}/act_damp_iff_id.m (100%) rename {active_damping => old/active_damping}/act_damp_iff_plots.m (100%) rename {active_damping => old/active_damping}/act_damp_main.m (100%) rename {analysis => old/analysis}/analysis_stiffness.m (100%) rename analyze_jacobian.m => old/analyze_jacobian.m (100%) rename config.m => old/config.m (100%) rename {identification => old/identification}/id_G.m (100%) rename {identification => old/identification}/id_jacobian.m (100%) rename {identification => old/identification}/id_jacobian_plots.m (100%) rename {identification => old/identification}/id_main.m (100%) rename {identification => old/identification}/id_plot_cart.m (100%) rename {identification => old/identification}/id_plot_db.m (100%) rename {identification => old/identification}/id_plot_iff.m (100%) rename {identification => old/identification}/id_plot_legs.m (100%) rename main.m => old/main.m (100%) rename plot_max_positions.m => old/plot_max_positions.m (100%) rename {studies => old/studies}/com.m (100%) rename {studies => old/studies}/coupling.m (100%) rename {studies => old/studies}/stiffness_matrix.m (100%) rename study_architecture.m => old/study_architecture.m (100%) create mode 100644 simscape-model.html create mode 100644 simscape-model.org create mode 100644 stiffness-study.html create mode 100644 stiffness-study.org diff --git a/css/htmlize.css b/css/htmlize.css new file mode 100644 index 0000000..0b32a03 --- /dev/null +++ b/css/htmlize.css @@ -0,0 +1,145 @@ +.org-bold { /* bold */ font-weight: bold; } +.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; } +.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; } +.org-builtin { /* font-lock-builtin-face */ color: #7a378b; } +.org-button { /* button */ text-decoration: underline; } +.org-calendar-today { /* calendar-today */ text-decoration: underline; } +.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; } +.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; } +.org-change-log-date { /* change-log-date */ color: #8b2252; } +.org-change-log-email { /* change-log-email */ color: #a0522d; } +.org-change-log-file { /* change-log-file */ color: #0000ff; } +.org-change-log-function { /* change-log-function */ color: #a0522d; } +.org-change-log-list { /* change-log-list */ color: #a020f0; } +.org-change-log-name { /* change-log-name */ color: #008b8b; } +.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; } +.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; } +.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; } +.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; } +.org-completions-annotations { /* completions-annotations */ font-style: italic; } +.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; } +.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; } +.org-constant { /* font-lock-constant-face */ color: #008b8b; } +.org-diary { /* diary */ color: #ff0000; } +.org-diff-context { /* diff-context */ color: #7f7f7f; } +.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-function { /* diff-function */ background-color: #cccccc; } +.org-diff-header { /* diff-header */ background-color: #cccccc; } +.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; } +.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; } +.org-dired-directory { /* dired-directory */ color: #0000ff; } +.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; } +.org-dired-header { /* dired-header */ color: #228b22; } +.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; } +.org-dired-mark { /* dired-mark */ color: #008b8b; } +.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; } +.org-dired-perm-write { /* dired-perm-write */ color: #b22222; } +.org-dired-symlink { /* dired-symlink */ color: #a020f0; } +.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; } +.org-doc { /* font-lock-doc-face */ color: #8b2252; } +.org-escape-glyph { /* escape-glyph */ color: #a52a2a; } +.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; } +.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; } +.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; } +.org-fringe { /* fringe */ background-color: #f2f2f2; } +.org-function-name { /* font-lock-function-name-face */ color: teal; } +.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; } +.org-help-argument-name { /* help-argument-name */ font-style: italic; } +.org-highlight { /* highlight */ background-color: #b4eeb4; } +.org-holiday { /* holiday */ background-color: #ffc0cb; } +.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; } +.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; } +.org-italic { /* italic */ font-style: italic; } +.org-keyword { /* font-lock-keyword-face */ color: #0086b3; } +.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; } +.org-link { /* link */ color: #0000ff; text-decoration: underline; } +.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; } +.org-log-edit-header { /* log-edit-header */ color: #a020f0; } +.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; } +.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; } +.org-match { /* match */ background-color: #ffff00; } +.org-next-error { /* next-error */ background-color: #eedc82; } +.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; } +.org-org-archived { /* org-archived */ color: #7f7f7f; } +.org-org-block { /* org-block */ color: #7f7f7f; } +.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; } +.org-org-block-end-line { /* org-block-end-line */ color: #b22222; } +.org-org-checkbox { /* org-checkbox */ font-weight: bold; } +.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; } +.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; } +.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; } +.org-org-code { /* org-code */ color: #7f7f7f; } +.org-org-column { /* org-column */ background-color: #e5e5e5; } +.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; } +.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; } +.org-org-document-info { /* org-document-info */ color: #191970; } +.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; } +.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; } +.org-org-done { /* org-done */ color: #228b22; font-weight: bold; } +.org-org-drawer { /* org-drawer */ color: #0000ff; } +.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; } +.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; } +.org-org-formula { /* org-formula */ color: #b22222; } +.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; } +.org-org-hide { /* org-hide */ color: #ffffff; } +.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; } +.org-org-level-1 { /* org-level-1 */ color: #0000ff; } +.org-org-level-2 { /* org-level-2 */ color: #a0522d; } +.org-org-level-3 { /* org-level-3 */ color: #a020f0; } +.org-org-level-4 { /* org-level-4 */ color: #b22222; } +.org-org-level-5 { /* org-level-5 */ color: #228b22; } +.org-org-level-6 { /* org-level-6 */ color: #008b8b; } +.org-org-level-7 { /* org-level-7 */ color: #7a378b; } +.org-org-level-8 { /* org-level-8 */ color: #8b2252; } +.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; } +.org-org-meta-line { /* org-meta-line */ color: #b22222; } +.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; } +.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; } +.org-org-quote { /* org-quote */ color: #7f7f7f; } +.org-org-scheduled { /* org-scheduled */ color: #006400; } +.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; } +.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; } +.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; } +.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; } +.org-org-table { /* org-table */ color: #0000ff; } +.org-org-tag { /* org-tag */ font-weight: bold; } +.org-org-target { /* org-target */ text-decoration: underline; } +.org-org-time-grid { /* org-time-grid */ color: #b8860b; } +.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; } +.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; } +.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; } +.org-org-verse { /* org-verse */ color: #7f7f7f; } +.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; } +.org-outline-1 { /* outline-1 */ color: #0000ff; } +.org-outline-2 { /* outline-2 */ color: #a0522d; } +.org-outline-3 { /* outline-3 */ color: #a020f0; } +.org-outline-4 { /* outline-4 */ color: #b22222; } +.org-outline-5 { /* outline-5 */ color: #228b22; } +.org-outline-6 { /* outline-6 */ color: #008b8b; } +.org-outline-7 { /* outline-7 */ color: #7a378b; } +.org-outline-8 { /* outline-8 */ color: #8b2252; } +.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; } +.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; } +.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; } +.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; } +.org-region { /* region */ background-color: #eedc82; } +.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; } +.org-shadow { /* shadow */ color: #7f7f7f; } +.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; } +.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; } +.org-string { /* font-lock-string-face */ color: #dd1144; } +.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; } +.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; } +.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; } +.org-type { /* font-lock-type-face */ color: #228b22; } +.org-underline { /* underline */ text-decoration: underline; } +.org-variable-name { /* font-lock-variable-name-face */ color: teal; } +.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; } +.org-widget-button { /* widget-button */ font-weight: bold; } +.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; } +.org-widget-documentation { /* widget-documentation */ color: #006400; } +.org-widget-field { /* widget-field */ background-color: #d9d9d9; } +.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; } +.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; } diff --git a/css/readtheorg.css b/css/readtheorg.css new file mode 100644 index 0000000..1690bd0 --- /dev/null +++ b/css/readtheorg.css @@ -0,0 +1,1095 @@ +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700); +@import url(https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css); + +h1,h2,h3,h4,h5,h6,legend{ + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:700; + margin-top:0; +} + +h1{ + font-size:175%; +} + +.subtitle{ + font-size:95%; /* of h1 */ +} + +h2{ + font-size:150%; +} + +h3{ + font-size:125%; +} + +h4{ + font-size:115%; +} + +h5{ + font-size:110%; +} + +h6{ + font-size:100%; +} + +h4,h5,h6{ + color:#2980B9; + font-weight:300; +} + +html{ + -ms-text-size-adjust:100%; + -webkit-text-size-adjust:100%; + font-size:100%; + height:100%; + overflow-x:hidden; +} + +body{ + background:#edf0f2; + color:#404040; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-weight:normal; + margin:0; + min-height:100%; + overflow-x:hidden; +} + +#content{ + background:#fcfcfc; + height:100%; + margin-left:300px; + /* margin:auto; */ + max-width:1200px; + min-height:100%; + padding:1.618em 3.236em; +} + +p{ + font-size:16px; + line-height:24px; + margin:0px 0px 24px 0px; +} + +b,strong{ + font-weight:bold} + +blockquote{ + background-color: #F0F0F0; + border-left:5px solid #CCCCCC; + font-style:italic; + line-height:24px; + margin:0px 0px 24px 0px; + /* margin-left:24px; */ + padding: 6px 20px; +} + +ul,ol,dl{ + line-height:24px; + list-style-image:none; + /* list-style:none; */ + margin:0px 0px 24px 0px; + padding:0; +} + +li{ + margin-left: 24px; +} + +dd{ + margin:0; +} + +#content .section ul,#content .toctree-wrapper ul,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px} + +#content .section ul li,#content .toctree-wrapper ul li,article ul li{ + list-style:disc; + margin-left:24px} + +#content .section ul li p:last-child,#content .toctree-wrapper ul li p:last-child,article ul li p:last-child{ + margin-bottom:0} + +#content .section ul li ul,#content .toctree-wrapper ul li ul,article ul li ul{ + margin-bottom:0} + +#content .section ul li li,#content .toctree-wrapper ul li li,article ul li li{ + list-style:circle} + +#content .section ul li li li,#content .toctree-wrapper ul li li li,article ul li li li{ + list-style:square} + +#content .section ul li ol li,#content .toctree-wrapper ul li ol li,article ul li ol li{ + list-style:decimal} + +#content .section ol,#content ol,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px} + +#content .section ol li,#content ol li,article ol li{ + list-style:decimal; + margin-left:24px} + +#content .section ol li p:last-child,#content ol li p:last-child,article ol li p:last-child{ + margin-bottom:0} + +#content .section ol li ul,#content ol li ul,article ol li ul{ + margin-bottom:0} + +#content .section ol li ul li,#content ol li ul li,article ol li ul li{ + list-style:disc} + +dl dt{ + font-weight:bold; +} + +dl p,dl table,dl ul,dl ol{ + margin-bottom:12px !important; +} + +dl dd{ + margin:0 0 12px 24px; +} + +@media print{ + .codeblock,pre.src{ + white-space:pre.src-wrap} +} + +@media print{ + html,body,section{ + background:none !important} + + *{ + box-shadow:none !important; + text-shadow:none !important; + filter:none !important; + -ms-filter:none !important} + + a,a:visited{ + text-decoration:underline} + + pre.src,blockquote{ + page-break-inside:avoid} + + thead{ + display:table-header-group} + + tr,img{ + page-break-inside:avoid} + + img{ + max-width:100% !important} + + @page{ + margin:0.5cm} + + p,h2,h3{ + orphans:3; + widows:3} + + h2,h3{ + page-break-after:avoid} +} + +@media print{ + #postamble{ + display:none} + + #content{ + margin-left:0} +} + +@media print{ + #table-of-contents{ + display:none} + + @page{ + size: auto; + margin: 25mm 25mm 25mm 25mm;} + + body { + margin: 0px;} +} + +@media screen and (max-width: 768px){ +} + +@media only screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + .tablet-hide{ + display:none} +} + +@media screen and (max-width: 480px){ + .mobile-hide{ + display:none} +} + +@media screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + #content{ + margin-left:0} + + #content #content{ + padding:1.618em} + + #content.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden} +} + +@media screen and (min-width: 1400px){ + #content{ + background:rgba(0,0,0,0.05)} + + #content{ + background:#fcfcfc} +} + +@media screen and (max-width: 768px){ + #copyright{ + width:85%; + display:none} + + #copyright.shift{ + display:block} + + img{ + width:100%; + height:auto} +} + +@media screen and (max-width: 480px){ + #content .sidebar{ + width:100%} +} + +code{ + background:#fff; + border:solid 1px #e1e4e5; + /* color:#000; for clickable code */ + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:75%; + max-width:100%; + overflow-x:auto; + padding:0 5px; + white-space:nowrap; +} + +.codeblock-example{ + border:1px solid #e1e4e5; + border-bottom:none; + padding:24px; + padding-top:48px; + font-weight:500; + background:#fff; + position:relative} + +.codeblock-example:after{ + content:"Example"; + position:absolute; + top:0px; + left:0px; + background:#9B59B6; + color:#fff; + padding:6px 12px} + +.codeblock-example.prettyprint-example-only{ + border:1px solid #e1e4e5; + margin-bottom:24px} + +.codeblock,pre.src,#content .literal-block{ + border:1px solid #e1e4e5; + padding:12px; + overflow-x:auto; + background:#fff; + margin:1px 0 24px 0} + +pre.src{ + /* color:#404040; */ + display:block; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + margin:1px 0px 24px 0px; + overflow:auto; + padding:12px; + white-space:pre; +} + +.example{ + background:#f3f6f6; + border:1px solid #e1e4e5; + color:#404040; + font-size: 12px; + line-height: 1.5; + margin-bottom:24px; + padding:12px; +} + +table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; +} + +td{ + vertical-align:top} + +table td,table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px; + background-color:white; + border:1px solid #e1e4e5; +} + +table thead th{ + font-weight:bold; + border-top:3px solid #e1e4e5; + border-bottom:1px solid #e1e4e5; +} + +table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +table tr:nth-child(2n-1) td{ + background-color:#f3f6f6; +} + +table tr:nth-child(2n) td{ + background-color:white; +} + +.figure p{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg); +} + +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg); +} + +#toggle-sidebar, +#table-of-contents .close-sidebar { + display: none; +} + +@media screen and (max-width: 768px) { + #table-of-contents { + display: none; + width: 60%; + } + + #table-of-contents h2 a { + display: block; + } + + #table-of-contents:target { + display: block; + } + + #copyright, #postamble { + display: none; + } + + #toggle-sidebar { + background-color: #2980B9; + display: block; + margin-bottom: 1.6em; + padding: 0.6em; + text-align: center; + } + + #toggle-sidebar h2 { + background-color:#2980B9; + width:100%; + height:50px; + left:0; + top:0; + color: white; + font-size: 100%; + line-height: 50px; + position:fixed; + margin: 0; + padding: 0; + opacity:0.7; + } + + #table-of-contents .close-sidebar { + color: rgba(255, 255, 255, 0.3); + display: inline-block; + margin: 0px 10px 0px 45px; + padding: 10px; + } +} + +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; +} + +figcaption,figure,footer,header,hgroup,nav{ + display:block} + +ins{ + background:#ff9; + color:#000; + text-decoration:none} + +mark{ + background:#ff0; + color:#000; + font-style:italic; + font-weight:bold} + +small{ + font-size:85%} + +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline} + +sup{ + top:-0.5em} + +sub{ + bottom:-0.25em} + +img{ + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100%} + +svg:not(:root){ + overflow:hidden} + +figure{ + margin:0} + +label{ + cursor:pointer} + +legend{ + border:0; + margin-left:-7px; + padding:0; + white-space:normal} + +.fa:before,#content .admonition-title:before,#content h1 .headerlink:before,#content h2 .headerlink:before,#content h3 .headerlink:before,#content h4 .headerlink:before,#content h5 .headerlink:before,#content h6 .headerlink:before,#content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,#content .note,#content .attention,#content .caution,#content .danger,#content .error,#content .hint,#content .important,#content .tip,#content .warning,#content .seealso,#content .admonitiontodo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,#table-of-contents li.on a,#table-of-contents li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{ + -webkit-font-smoothing:antialiased} + +/*! + * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{ + font-family:'FontAwesome'; + src:url("../fonts/fontawesome-webfont.eot?v=4.1.0"); + src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg"); + font-weight:normal; + font-style:normal} + +.fa,#content .admonition-title,.icon{ + display:inline-block; + font-family:FontAwesome; + font-style:normal; + font-weight:normal; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale} + +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none} + +.fa-ul>li{ + position:relative} + +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:0.14286em; + text-align:center} + +.fa-li.fa-lg{ + left:-1.85714em} + +.fa-border{ + padding:.2em .25em .15em; + border:solid 0.08em #eee; + border-radius:.1em} + +.fa,#content .admonition-title{ + font-family:inherit} + +.fa:before,#content .admonition-title:before{ + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit} + +a .fa,a #content .admonition-title,#content a .admonition-title{ + display:inline-block; + text-decoration:inherit} + +.nav #content .admonition-title,#content .nav .admonition-title,.nav .icon{ + display:inline} + +.wy-alert,#content .note,#content .attention,#content .caution,#content .danger,#content .error,#content .hint,#content .important,#content .tip,#content .warning,#content .seealso,#content .admonitiontodo{ + padding:12px; + line-height:24px; + margin-bottom:24px; + /* background:#e7f2fa; */ +} + +.wy-alert-title,#content .admonition-title{ + color:#fff; + font-weight:bold; + display:block; + color:#fff; + /* background:#6ab0de; */ + /* margin:-12px; */ + padding:6px 12px; + margin-bottom:0px} + +#content .danger,#content .error{ + background:#fdf3f2} + +.wy-alert.wy-alert-warning,#content .wy-alert-warning.note,#content .attention,#content .caution,#content .wy-alert-warning.danger,#content .wy-alert-warning.error,#content .wy-alert-warning.hint,#content .wy-alert-warning.important,#content .wy-alert-warning.tip,#content .warning,#content .wy-alert-warning.seealso,#content .admonitiontodo{ + background:#ffedcc} + +#content .admonition-title.note:before, #content .admonition-title.seealso:before, +#content .admonition-title.warning:before, #content .admonition-title.caution:before, +#content .admonition-title.attention:before, +#content .admonition-title.tip:before, #content .admonition-title.hint:before, +#content .admonition-title.important:before, +#content .admonition-title.error:before, #content .admonition-title.danger:before{ + font-family:FontAwesome; + content: "";} + +#content .note,#content .seealso{ + background:#e7f2fa} + +.wy-alert p:last-child,#content .note p:last-child,#content .attention p:last-child,#content .caution p:last-child,#content .danger p:last-child,#content .error p:last-child,#content .hint p:last-child,#content .important p:last-child,#content .tip p:last-child,#content .warning p:last-child,#content .seealso p:last-child,#content .admonitiontodo p:last-child{ + margin-bottom:0} + +#content .admonition-title.tip,#content .admonition-title.important,#content .admonition-title.hint{ + line-height: 1; + background:#1abc9c} + +#content .important,#content .tip,#content .hint{ + background:#dbfaf4} + +#content .admonition-title.note,#content .admonition-title.seealso{ + line-height: 1; + background:#6ab0de} + +#content .admonition-title.warning,#content .admonition-title.caution,#content .admonition-title.attention{ + line-height: 1; + background:#F0B37E} + +#content .admonition-title.error,#content .admonition-title.danger{ + line-height: 1; + background:#f29f97} + +legend{ + display:block; + width:100%; + border:0; + padding:0; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px} + +label{ + display:block; + margin:0 0 0.3125em 0; + color:#333; + font-size:90%} + +a{ + color:#2980B9; + text-decoration:none; + cursor:pointer} + + +a:hover,a:active{ + outline:0; +} + +a:hover{ + color:#3091d1} + +a:visited{ + color:#9B59B6} + +.left{ + text-align:left} + +.center{ + text-align:center} + +.right{ + text-align:right} + +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0} + +#table-of-contents li{ + list-style:none; + margin-left: 0px; +} + +#table-of-contents header{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 1.618em; + display:block; + font-weight:bold; + text-transform:uppercase; + font-size:80%; + color:#2980B9; + white-space:nowrap} + +#table-of-contents ul{ + margin-bottom:0} + +#table-of-contents li.divide-top{ + border-top:solid 1px #404040} + +#table-of-contents li.divide-bottom{ + border-bottom:solid 1px #404040} + +#table-of-contents li.current{ + background:#e3e3e3} + +#table-of-contents li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em} + +#table-of-contents li.current a:hover{ + background:#d6d6d6} + +#table-of-contents li a{ + /* color:#404040; */ + padding:0.4045em 1.618em; + position:relative; + /* background:#fcfcfc; */ + border:none; + /* border-bottom:solid 1px #c9c9c9; */ + /* border-top:solid 1px #c9c9c9; */ + padding-left:1.618em -4px} + +#table-of-contents li.on a:hover,#table-of-contents li.current>a:hover{ + background:#fcfcfc} + +#table-of-contents li ul li a{ + /* background:#c9c9c9; */ + padding:0.4045em 2.427em} + +#table-of-contents li ul li ul li a{ + padding:0.4045em 3.236em} + +#table-of-contents li.current ul{ + display:block} + +/* #table-of-contents li ul{ */ +/* margin-bottom:0; */ +/* display:none} */ + +#table-of-contents .local-toc li ul{ + display:block} + +#table-of-contents li ul li a{ + margin-bottom:0; + color:#b3b3b3; + font-weight:normal} + +#table-of-contents a{ + display:inline-block; + line-height:18px; + padding:0.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#b3b3b3; + direction: ltr; +} + +#table-of-contents a:hover{ + background-color:#4e4a4a; + cursor:pointer} + +/* #text-table-of-contents { */ +/* overflow:scroll; */ +/* } */ + +#table-of-contents{ + position:fixed; + top:0; + left:0; + width:300px; + overflow-x:hidden; + overflow-y:scroll; + height:100%; + background:#343131; + z-index:200; + scrollbar-base-color: #1F1D1D; + scrollbar-arrow-color: #b3b3b3; + scrollbar-shadow-color: #1F1D1D; + scrollbar-track-color : #343131; +} + +#table-of-contents h2{ + z-index:200; + background-color:#2980B9; + text-align:center; + padding:0.809em; + display:block; + color:#fcfcfc; + font-size: 100%; + margin-bottom:0.809em} + +ul.nav li ul li { + display: none; +} + +ul.nav li ul li ul li { + display: none; +} + +ul.nav li.active ul li { + display: inline; +} + +ul.nav li.active ul li ul li { + display: inline; +} + +ul.nav li.active ul li a { + background-color: #E3E3E3; + color: #8099B0; + border-right:solid 1px #c9c9c9 !important; +} + +ul.nav li.active ul li.active a { + background-color: #C9C9C9; + color: black !important; + font-weight: bold !important; +} + +ul.nav li.active ul li.active ul li.active a { + color: black !important; + font-weight: bold !important; + display: block !important; +} + +ul.nav li.active ul li.active ul li a { + color: #808080 !important; + font-weight: normal !important; + display: block !important; +} + +ul.nav li.active ul li ul li a { + display: none !important; +} + +/* ul.nav li ul li ul li { */ +/* display: none !important; /\* as long as nav is on multiple levels of ul *\/ */ +/* /\* display: none; /\* as long as nav is on multiple levels of ul *\\/ *\/ */ +/* } */ + +ul.nav li ul li ul li ul li { + display: none !important; /* as long as nav is on multiple levels of ul */ + /* display: none; /* as long as nav is on multiple levels of ul *\/ */ +} + +ul.nav li.active > a { + border-bottom:solid 1px #c9c9c9 !important; /* XXX Restrict it to 2nd level */ + border-right:solid 1px #c9c9c9 !important; +} + +ul.nav li.active a { + color: gray !important; + font-weight:bold; + background-color: white; + border-right:solid 0px white !important; +} + +ul.nav > li.active > a { + color: black !important; +} + +footer{ + color:#999} + +footer p{ + margin-bottom:12px} + +#copyright, #postamble{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + border-top:solid 10px #343131; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-size: 90%; + z-index:400; + padding:12px; +} + +#postamble .author { + font-size: 100%; + margin-bottom: 0px; +} + +#postamble .date { + font-size: 90%; + margin-bottom: 0px; + color: #27AE60; +} + +#postamble .creator,#postamble .validation { + display:none; +} + +#copyright a{ + color:#2980B9; + text-decoration:none} + +#copyright .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27AE60; + *zoom:1} + +#content img{ + max-width:100%; +} + +#content div.figure{ + margin-bottom:24px} + +#content div.figure.align-center{ + text-align:center} + +#content .section>img,#content .section>a>img{ + margin-bottom:24px} + +.verse{ + border-left:5px solid #6AB0DE; + background-color: #E7F2FA; + padding: 6px 20px; + font-style:italic; +} + +#content .note .last,#content .attention .last,#content .caution .last,#content .danger .last,#content .error .last,#content .hint .last,#content .important .last,#content .tip .last,#content .warning .last,#content .seealso .last,#content .admonitiontodo .last{ + margin-bottom:0} + +#content .admonition-title:before{ + margin-right:4px} + +#content .section ol p,#content .section ul p{ + margin-bottom:12px} + +#content h1 .headerlink,#content h2 .headerlink,#content h3 .headerlink,#content h4 .headerlink,#content h5 .headerlink,#content h6 .headerlink,#content dl dt .headerlink{ + display:none; + visibility:hidden; + font-size:14px} + +#content h1 .headerlink:after,#content h2 .headerlink:after,#content h3 .headerlink:after,#content h4 .headerlink:after,#content h5 .headerlink:after,#content h6 .headerlink:after,#content dl dt .headerlink:after{ + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block} + +#content h1:hover .headerlink,#content h2:hover .headerlink,#content h3:hover .headerlink,#content h4:hover .headerlink,#content h5:hover .headerlink,#content h6:hover .headerlink,#content dl dt:hover .headerlink{ + display:inline-block} + +#content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:solid 1px #e1e4e5} + +#content .sidebar p,#content .sidebar ul,#content .sidebar dl{ + font-size:90%} + +#content .sidebar .last{ + margin-bottom:0} + +#content .sidebar .sidebar-title{ + display:block; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:bold; + background:#e1e4e5; + padding:6px 12px; + margin:-24px; + margin-bottom:24px; + font-size:100%} + +#content .highlighted{ + background:#F1C40F; + display:inline-block; + font-weight:bold; + padding:0 6px} + +#content .footnote-reference,#content .citation-reference{ + vertical-align:super; + font-size:90%} + +span[id*='MathJax-Span']{ + color:#404040} + +.math{ + text-align:center} + +#footnotes{ + border-top:1px solid #e1e4e5; + padding-top: 36px; +} + +h2.footnotes{ + display:none; +} + +.footnum, .footref{ + color: #2980b9; + font-size: 170%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; +} + +.footnum:before, .footref:before{ + content:"["; +} + +.footnum:after, .footref:after{ + content:"]"; +} + +.footpara { + color: #999; + font-size: 90%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + padding-bottom: 8px; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + line-height: 1.25em; + /* display: inline; */ +} + +.todo{ + background-color: #f29f97; + padding: 0px 4px; + color: #fff; +} + +.WAIT, .nilWAIT{ + background-color: #6AB097; +} + +.done{ + background-color: #6ab0de; + padding: 0px 4px; + color: #fff; +} + +.tag span { + background-color: #EDEDED; + border: 1px solid #EDEDED; + color: #939393; + cursor: pointer; + display: block; + float: right; + font-size: 80%; + font-weight: normal; + margin: 0 3px; + padding: 1px 2px; + border-radius: 10px; +} + +.tag .FLAGGED { + background-color: #DB2D27; + border: 1px solid #DB2D27; + color: white; + font-weight: bold; +} + +.timestamp { + font-family: Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size: 90%; + color: navy; +} + +.nav .timestamp { + color: inherit; +} + +.inlinetask { + background: #FFF9E3; /* url(dialog-todo.png) no-repeat 10px 8px; */ + border: 3px solid #FFEB8E; + /* border-right-style: none; */ + /* border-left-style: none; */ + /* padding: 10px 20px 10px 60px; */ + padding: 9px 12px; + margin-bottom: 24px; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif} diff --git a/figs/stewart_ball_joints.png b/figs/stewart_ball_joints.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d1efd8dea19cb6a508341ae8311224dc0a42c GIT binary patch literal 5057 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 F{|myth3^0W literal 0 HcmV?d00001 diff --git a/figs/stewart_bottom_plate.png b/figs/stewart_bottom_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..37ddf42a40a5727a1f86b905f1aaae76a6ccac01 GIT binary patch literal 39477 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 MJ)m=6%P!>q0HjcqZvX%Q literal 0 HcmV?d00001 diff --git a/figs/stewart_legs.png b/figs/stewart_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..da728438d2d06311f335ea8ed00e6a821dce2a1b GIT binary patch literal 21922 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 c)liwL-Rf;K2|Mu+ + + + + + + +Identification of the Stewart Platform using Simscape + + + + + + + + + + + + + + +
+

Identification of the Stewart Platform using Simscape

+
+ +
+

1 Identification

+
+

+The hexapod structure and Sample structure are initialized. +

+
+
initializeHexapod();
+initializeSample();
+
+
+ +
+
G = identifyPlant();
+
+
+
+
+ +
+

2 Cartesian Plot

+
+

+From a force applied in the Cartesian frame to a displacement in the Cartesian frame. +

+
+
figure;
+hold on;
+bode(G.G_cart(1, 1));
+bode(G.G_cart(3, 3));
+hold off;
+
+
+
+
+ +
+

3 From a force to force sensor

+
+
+
figure;
+hold on;
+bode(G.G_forc(1, 1));
+bode(G.G_forc(2, 2));
+bode(G.G_forc(3, 3));
+bode(G.G_forc(4, 4));
+bode(G.G_forc(5, 5));
+bode(G.G_forc(6, 6));
+hold off;
+
+
+ +
+
figure;
+hold on;
+bode(G.G_forc(1, 1));
+bode(G.G_forc(1, 2));
+bode(G.G_forc(1, 3));
+bode(G.G_forc(1, 4));
+bode(G.G_forc(1, 5));
+bode(G.G_forc(1, 6));
+hold off;
+
+
+
+
+ +
+

4 From a force applied in the leg to the displacement of the leg

+
+
+
figure;
+hold on;
+bode(G.G_legs(1, 1));
+bode(G.G_legs(2, 2));
+bode(G.G_legs(3, 3));
+bode(G.G_legs(4, 4));
+bode(G.G_legs(5, 5));
+bode(G.G_legs(6, 6));
+hold off;
+
+
+ +
+
figure;
+hold on;
+bode(G.G_legs(1, 1));
+bode(G.G_legs(1, 2));
+bode(G.G_legs(1, 3));
+bode(G.G_legs(1, 4));
+bode(G.G_legs(1, 5));
+bode(G.G_legs(1, 6));
+hold off;
+
+
+
+
+ +
+

5 Transmissibility

+
+
+
figure;
+hold on;
+bode(G.G_tran(1, 1));
+bode(G.G_tran(2, 2));
+bode(G.G_tran(3, 3));
+hold off;
+
+
+ +
+
figure;
+hold on;
+bode(G.G_tran(4, 4));
+bode(G.G_tran(5, 5));
+bode(G.G_tran(6, 6));
+hold off;
+
+
+ +
+
figure;
+hold on;
+bode(G.G_tran(1, 1));
+bode(G.G_tran(2, 1));
+bode(G.G_tran(3, 1));
+hold off;
+
+
+
+
+ +
+

6 Compliance

+
+

+From a force applied in the Cartesian frame to a relative displacement of the mobile platform with respect to the base. +

+ +
+
figure;
+hold on;
+bode(G.G_comp(1, 1));
+bode(G.G_comp(2, 2));
+bode(G.G_comp(3, 3));
+hold off;
+
+
+
+
+ +
+

7 Inertial

+
+

+From a force applied on the Cartesian frame to the absolute displacement of the mobile platform. +

+ +
+
figure;
+hold on;
+bode(G.G_iner(1, 1));
+bode(G.G_iner(2, 2));
+bode(G.G_iner(3, 3));
+hold off;
+
+
+
+
+ +
+

8 identifyPlant

+
+
+
function [sys] = identifyPlant(opts_param)
+
+
+ +

+We use this code block to pass optional parameters. +

+
+
%% Default values for opts
+opts = struct();
+
+%% Populate opts with input parameters
+if exist('opts_param','var')
+    for opt = fieldnames(opts_param)'
+        opts.(opt{1}) = opts_param.(opt{1});
+    end
+end
+
+
+ +

+We defined the options for the linearize command. +Here, we just identify the system at time \(t = 0\). +

+
+
options = linearizeOptions;
+options.SampleTime = 0;
+
+
+ +

+We define the name of the Simulink File used to identification. +

+
+
mdl = 'stewart';
+
+
+ +

+Then we defined the input/output of the transfer function we want to identify. +

+
+
%% Inputs
+io(1) = linio([mdl, '/F'],  1, 'input'); % Cartesian forces
+io(2) = linio([mdl, '/Fl'], 1, 'input'); % Leg forces
+io(3) = linio([mdl, '/Fd'], 1, 'input'); % Direct forces
+io(4) = linio([mdl, '/Dw'], 1, 'input'); % Base motion
+
+%% Outputs
+io(5) = linio([mdl, '/Dm'],  1, 'output'); % Relative Motion
+io(6) = linio([mdl, '/Dlm'], 1, 'output'); % Displacement of each leg
+io(7) = linio([mdl, '/Flm'], 1, 'output'); % Force sensor in each leg
+io(8) = linio([mdl, '/Xm'],  1, 'output'); % Absolute motion of platform
+
+
+ +

+The linearization is run. +

+
+
G = linearize(mdl, io, 0);
+
+
+ +

+We defined all the Input/Output names of the identified transfer function. +

+
+
G.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz', ...
+                'F1', 'F2', 'F3', 'F4', 'F5', 'F6', ...
+                'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz', ...
+                'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'};
+G.OutputName = {'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm', ...
+                'D1m', 'D2m', 'D3m', 'D4m', 'D5m', 'D6m', ...
+                'F1m', 'F2m', 'F3m', 'F4m', 'F5m', 'F6m', ...
+                'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'};
+
+
+ +

+We split the transfer function into sub transfer functions and we compute their minimum realization. +

+
+
sys.G_cart = minreal(G({'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm'}, {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}));
+sys.G_forc = minreal(G({'F1m', 'F2m', 'F3m', 'F4m', 'F5m', 'F6m'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}));
+sys.G_legs = minreal(G({'D1m', 'D2m', 'D3m', 'D4m', 'D5m', 'D6m'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}));
+sys.G_tran = minreal(G({'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'}));
+sys.G_comp = minreal(G({'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm'}, {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}));
+sys.G_iner = minreal(G({'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}, {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'}));
+% sys.G_all  = minreal(G);
+
+
+ +
+
end
+
+
+
+
+
+
+

Author: Thomas Dehaeze

+

Created: 2019-03-22 ven. 12:03

+

Validate

+
+ + diff --git a/identification.org b/identification.org new file mode 100644 index 0000000..d9a291b --- /dev/null +++ b/identification.org @@ -0,0 +1,242 @@ +#+TITLE: Identification of the Stewart Platform using Simscape +:DRAWER: +#+STARTUP: overview + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + +#+LATEX_CLASS: cleanreport +#+LaTeX_CLASS_OPTIONS: [tocnp, secbreak, minted] +#+LaTeX_HEADER: \usepackage{svg} +#+LaTeX_HEADER: \newcommand{\authorFirstName}{Thomas} +#+LaTeX_HEADER: \newcommand{\authorLastName}{Dehaeze} +#+LaTeX_HEADER: \newcommand{\authorEmail}{dehaeze.thomas@gmail.com} + +#+PROPERTY: header-args:matlab :session *MATLAB* +#+PROPERTY: header-args:matlab+ :comments org +#+PROPERTY: header-args:matlab+ :exports both +#+PROPERTY: header-args:matlab+ :eval no-export +#+PROPERTY: header-args:matlab+ :output-dir figs +#+PROPERTY: header-args:matlab+ :mkdirp yes +:END: + +* Identification +#+begin_src matlab :results none :exports none + <> + addpath('src'); + addpath('library'); +#+end_src + +#+begin_src matlab :results none :exports none + open stewart +#+end_src + +The hexapod structure and Sample structure are initialized. +#+begin_src matlab :results none + initializeHexapod(); + initializeSample(); +#+end_src + +#+begin_src matlab :results none + G = identifyPlant(); +#+end_src + +* Cartesian Plot +From a force applied in the Cartesian frame to a displacement in the Cartesian frame. +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_cart(1, 1)); + bode(G.G_cart(3, 3)); + hold off; +#+end_src + +* From a force to force sensor +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_forc(1, 1)); + bode(G.G_forc(2, 2)); + bode(G.G_forc(3, 3)); + bode(G.G_forc(4, 4)); + bode(G.G_forc(5, 5)); + bode(G.G_forc(6, 6)); + hold off; +#+end_src + +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_forc(1, 1)); + bode(G.G_forc(1, 2)); + bode(G.G_forc(1, 3)); + bode(G.G_forc(1, 4)); + bode(G.G_forc(1, 5)); + bode(G.G_forc(1, 6)); + hold off; +#+end_src + +* From a force applied in the leg to the displacement of the leg +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_legs(1, 1)); + bode(G.G_legs(2, 2)); + bode(G.G_legs(3, 3)); + bode(G.G_legs(4, 4)); + bode(G.G_legs(5, 5)); + bode(G.G_legs(6, 6)); + hold off; +#+end_src + +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_legs(1, 1)); + bode(G.G_legs(1, 2)); + bode(G.G_legs(1, 3)); + bode(G.G_legs(1, 4)); + bode(G.G_legs(1, 5)); + bode(G.G_legs(1, 6)); + hold off; +#+end_src + +* Transmissibility +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_tran(1, 1)); + bode(G.G_tran(2, 2)); + bode(G.G_tran(3, 3)); + hold off; +#+end_src + +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_tran(4, 4)); + bode(G.G_tran(5, 5)); + bode(G.G_tran(6, 6)); + hold off; +#+end_src + +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_tran(1, 1)); + bode(G.G_tran(2, 1)); + bode(G.G_tran(3, 1)); + hold off; +#+end_src + +* Compliance +From a force applied in the Cartesian frame to a relative displacement of the mobile platform with respect to the base. + +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_comp(1, 1)); + bode(G.G_comp(2, 2)); + bode(G.G_comp(3, 3)); + hold off; +#+end_src + +* Inertial +From a force applied on the Cartesian frame to the absolute displacement of the mobile platform. + +#+begin_src matlab :results none + figure; + hold on; + bode(G.G_iner(1, 1)); + bode(G.G_iner(2, 2)); + bode(G.G_iner(3, 3)); + hold off; +#+end_src + +* identifyPlant + :PROPERTIES: + :HEADER-ARGS:matlab+: :exports code + :HEADER-ARGS:matlab+: :comments yes + :HEADER-ARGS:matlab+: :eval no + :HEADER-ARGS:matlab+: :tangle src/identifyPlant.m + :END: + +#+begin_src matlab + function [sys] = identifyPlant(opts_param) +#+end_src + +We use this code block to pass optional parameters. +#+begin_src matlab + %% Default values for opts + opts = struct(); + + %% Populate opts with input parameters + if exist('opts_param','var') + for opt = fieldnames(opts_param)' + opts.(opt{1}) = opts_param.(opt{1}); + end + end +#+end_src + +We defined the options for the =linearize= command. +Here, we just identify the system at time $t = 0$. +#+begin_src matlab + options = linearizeOptions; + options.SampleTime = 0; +#+end_src + +We define the name of the Simulink File used to identification. +#+begin_src matlab + mdl = 'stewart'; +#+end_src + +Then we defined the input/output of the transfer function we want to identify. +#+begin_src matlab + %% Inputs + io(1) = linio([mdl, '/F'], 1, 'input'); % Cartesian forces + io(2) = linio([mdl, '/Fl'], 1, 'input'); % Leg forces + io(3) = linio([mdl, '/Fd'], 1, 'input'); % Direct forces + io(4) = linio([mdl, '/Dw'], 1, 'input'); % Base motion + + %% Outputs + io(5) = linio([mdl, '/Dm'], 1, 'output'); % Relative Motion + io(6) = linio([mdl, '/Dlm'], 1, 'output'); % Displacement of each leg + io(7) = linio([mdl, '/Flm'], 1, 'output'); % Force sensor in each leg + io(8) = linio([mdl, '/Xm'], 1, 'output'); % Absolute motion of platform +#+end_src + +The linearization is run. +#+begin_src matlab + G = linearize(mdl, io, 0); +#+end_src + +We defined all the Input/Output names of the identified transfer function. +#+begin_src matlab + G.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz', ... + 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', ... + 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz', ... + 'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'}; + G.OutputName = {'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm', ... + 'D1m', 'D2m', 'D3m', 'D4m', 'D5m', 'D6m', ... + 'F1m', 'F2m', 'F3m', 'F4m', 'F5m', 'F6m', ... + 'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}; +#+end_src + +We split the transfer function into sub transfer functions and we compute their minimum realization. +#+begin_src matlab + sys.G_cart = minreal(G({'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm'}, {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'})); + sys.G_forc = minreal(G({'F1m', 'F2m', 'F3m', 'F4m', 'F5m', 'F6m'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})); + sys.G_legs = minreal(G({'D1m', 'D2m', 'D3m', 'D4m', 'D5m', 'D6m'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})); + sys.G_tran = minreal(G({'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'})); + sys.G_comp = minreal(G({'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm'}, {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'})); + sys.G_iner = minreal(G({'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}, {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'})); + % sys.G_all = minreal(G); +#+end_src + +#+begin_src matlab + end +#+end_src diff --git a/index.html b/index.html new file mode 100644 index 0000000..1337f4b --- /dev/null +++ b/index.html @@ -0,0 +1,301 @@ + + + + + + + +Stewart Platform Studies + + + + + + + + + + + + +
+

Stewart Platform Studies

+ + +
+

1 Simscape Model

+ +
+ +
+

2 Architecture Study

+
+ +
+
+ +
+

3 Motion Control

+
+
    +
  • Active Damping
  • +
  • Inertial Control
  • +
  • Decentralized Control
  • +
+
+
+
+
+

Author: Thomas Dehaeze

+

Created: 2019-03-22 ven. 12:03

+

Validate

+
+ + diff --git a/index.org b/index.org index 854377d..5e25b0f 100644 --- a/index.org +++ b/index.org @@ -1,4 +1,4 @@ -#+TITLE: Stewart Platform with Simscape +#+TITLE: Stewart Platform Studies :DRAWER: #+STARTUP: overview @@ -11,6 +11,7 @@ #+LATEX_CLASS: cleanreport #+LaTeX_CLASS_OPTIONS: [tocnp, secbreak, minted] +#+LaTeX_HEADER: \usepackage{svg} #+LaTeX_HEADER: \newcommand{\authorFirstName}{Thomas} #+LaTeX_HEADER: \newcommand{\authorLastName}{Dehaeze} #+LaTeX_HEADER: \newcommand{\authorEmail}{dehaeze.thomas@gmail.com} @@ -23,626 +24,16 @@ #+PROPERTY: header-args:matlab+ :mkdirp yes :END: -#+begin_src matlab :results none - <> - addpath('src'); - addpath('library'); -#+end_src - -#+begin_src matlab :results none - open stewart -#+end_src - -#+begin_src matlab - hexapod = initializeHexapod(); -#+end_src - -#+RESULTS: -: org_babel_eoe - -#+begin_src matlab - initializeSample(); -#+end_src - -#+begin_src matlab - G = identifyPlant(); -#+end_src - -#+RESULTS: - -* Functions - :PROPERTIES: - :HEADER-ARGS:matlab+: :exports code - :HEADER-ARGS:matlab+: :comments no - :HEADER-ARGS:matlab+: :mkdir yes - :HEADER-ARGS:matlab+: :eval no - :END: -** getMaxPositions - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle src/getMaxPositions.m - :END: -#+begin_src matlab - function [X, Y, Z] = getMaxPositions(stewart) - Leg = stewart.Leg; - J = stewart.J; - theta = linspace(0, 2*pi, 100); - phi = linspace(-pi/2 , pi/2, 100); - dmax = zeros(length(theta), length(phi)); - - for i = 1:length(theta) - for j = 1:length(phi) - L = J*[cos(phi(j))*cos(theta(i)) cos(phi(j))*sin(theta(i)) sin(phi(j)) 0 0 0]'; - dmax(i, j) = Leg.stroke/max(abs(L)); - end - end - - X = dmax.*cos(repmat(phi,length(theta),1)).*cos(repmat(theta,length(phi),1))'; - Y = dmax.*cos(repmat(phi,length(theta),1)).*sin(repmat(theta,length(phi),1))'; - Z = dmax.*sin(repmat(phi,length(theta),1)); - end -#+end_src - -** getMaxPureDisplacement - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle src/getMaxPureDisplacement.m - :END: -#+begin_src matlab - function [max_disp] = getMaxPureDisplacement(Leg, J) - max_disp = zeros(6, 1); - max_disp(1) = Leg.stroke/max(abs(J*[1 0 0 0 0 0]')); - max_disp(2) = Leg.stroke/max(abs(J*[0 1 0 0 0 0]')); - max_disp(3) = Leg.stroke/max(abs(J*[0 0 1 0 0 0]')); - max_disp(4) = Leg.stroke/max(abs(J*[0 0 0 1 0 0]')); - max_disp(5) = Leg.stroke/max(abs(J*[0 0 0 0 1 0]')); - max_disp(6) = Leg.stroke/max(abs(J*[0 0 0 0 0 1]')); - end -#+end_src - -** getStiffnessMatrix - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle src/getStiffnessMatrix.m - :END: -#+begin_src matlab - function [K] = getStiffnessMatrix(k, J) - % k - leg stiffness - % J - Jacobian matrix - K = k*(J'*J); - end -#+end_src - -** identifyPlant - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle src/identifyPlant.m - :END: -#+begin_src matlab - function [sys] = identifyPlant(opts_param) - %% Default values for opts - opts = struct(); - - %% Populate opts with input parameters - if exist('opts_param','var') - for opt = fieldnames(opts_param)' - opts.(opt{1}) = opts_param.(opt{1}); - end - end - - %% Options for Linearized - options = linearizeOptions; - options.SampleTime = 0; - - %% Name of the Simulink File - mdl = 'stewart_identification'; - - %% Input/Output definition - io(1) = linio([mdl, '/F'], 1, 'input'); % Cartesian forces - io(2) = linio([mdl, '/Fl'], 1, 'input'); % Leg forces - io(3) = linio([mdl, '/Fd'], 1, 'input'); % Direct forces - io(4) = linio([mdl, '/Dw'], 1, 'input'); % Base motion - - io(5) = linio([mdl, '/Dm'], 1, 'output'); % Relative Motion - io(6) = linio([mdl, '/Dlm'], 1, 'output'); % Displacement of each leg - io(7) = linio([mdl, '/Flm'], 1, 'output'); % Force sensor in each leg - io(8) = linio([mdl, '/Xm'], 1, 'output'); % Absolute motion of platform - - %% Run the linearization - G = linearize(mdl, io, 0); - - %% Input/Output names - G.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz', ... - 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', ... - 'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz', ... - 'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'}; - G.OutputName = {'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm', ... - 'D1m', 'D2m', 'D3m', 'D4m', 'D5m', 'D6m', ... - 'F1m', 'F2m', 'F3m', 'F4m', 'F5m', 'F6m', ... - 'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}; - - %% Cut into sub transfer functions - sys.G_cart = minreal(G({'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm'}, {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'})); - sys.G_forc = minreal(G({'F1m', 'F2m', 'F3m', 'F4m', 'F5m', 'F6m'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'})); - sys.G_legs = G({'D1m', 'D2m', 'D3m', 'D4m', 'D5m', 'D6m'}, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}); - sys.G_tran = minreal(G({'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm'}, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'})); - sys.G_comp = minreal(G({'Dxm', 'Dym', 'Dzm', 'Rxm', 'Rym', 'Rzm'}, {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'})); - sys.G_iner = minreal(G({'Dxtm', 'Dytm', 'Dztm', 'Rxtm', 'Rytm', 'Rztm'}, {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'})); - sys.G_all = minreal(G); - end -#+end_src - -** initializeHexapod - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle src/initializeHexapod.m - :END: -*** Function description and arguments -The =initializeHexapod= function takes one structure that contains configurations for the hexapod and returns one structure representing the hexapod. -#+begin_src matlab - function [stewart] = initializeHexapod(opts_param) -#+end_src - -Default values for opts. -#+begin_src matlab - opts = struct(... - 'height', 90, ... % Height of the platform [mm] - 'density', 8000, ... % Density of the material used for the hexapod [kg/m3] - 'k_ax', 1e8, ... % Stiffness of each actuator [N/m] - 'c_ax', 100, ... % Damping of each actuator [N/(m/s)] - 'stroke', 50e-6, ... % Maximum stroke of each actuator [m] - 'name', 'stewart' ... % Name of the file - ); -#+end_src - -Populate opts with input parameters -#+begin_src matlab - if exist('opts_param','var') - for opt = fieldnames(opts_param)' - opts.(opt{1}) = opts_param.(opt{1}); - end - end -#+end_src - -*** Initialization of the stewart structure -We initialize the Stewart structure -#+begin_src matlab - stewart = struct(); -#+end_src - -And we defined its total height. -#+begin_src matlab - stewart.H = opts.height; % [mm] -#+end_src - -*** Bottom Plate -#+name: fig:stewart_bottom_plate -#+caption: Schematic of the bottom plates with all the parameters -[[file:./figs/stewart_bottom_plate.png]] - - -The bottom plate structure is initialized. -#+begin_src matlab - BP = struct(); -#+end_src - -We defined its internal radius (if there is a hole in the bottom plate) and its outer radius. -#+begin_src matlab - BP.Rint = 0; % Internal Radius [mm] - BP.Rext = 150; % External Radius [mm] -#+end_src - -We define its thickness. -#+begin_src matlab - BP.H = 10; % Thickness of the Bottom Plate [mm] -#+end_src - -At which radius legs will be fixed and with that angle offset. -#+begin_src matlab - BP.Rleg = 100; % Radius where the legs articulations are positionned [mm] - BP.alpha = 10; % Angle Offset [deg] -#+end_src - -We defined the density of the material of the bottom plate. -#+begin_src matlab - BP.density = opts.density; % Density of the material [kg/m3] -#+end_src - -And its color. -#+begin_src matlab - BP.color = [0.7 0.7 0.7]; % Color [RGB] -#+end_src - -Then the profile of the bottom plate is computed and will be used by Simscape -#+begin_src matlab - BP.shape = [BP.Rint BP.H; BP.Rint 0; BP.Rext 0; BP.Rext BP.H]; % [mm] -#+end_src - -The structure is added to the stewart structure -#+begin_src matlab - stewart.BP = BP; -#+end_src - -*** Top Plate -The top plate structure is initialized. -#+begin_src matlab - TP = struct(); -#+end_src - -We defined the internal and external radius of the top plate. -#+begin_src matlab - TP.Rint = 0; % [mm] - TP.Rext = 100; % [mm] -#+end_src - -The thickness of the top plate. -#+begin_src matlab - TP.H = 10; % [mm] -#+end_src - -At which radius and angle are fixed the legs. -#+begin_src matlab - TP.Rleg = 100; % Radius where the legs articulations are positionned [mm] - TP.alpha = 20; % Angle [deg] - TP.dalpha = 0; % Angle Offset from 0 position [deg] -#+end_src - -The density of its material. -#+begin_src matlab - TP.density = opts.density; % Density of the material [kg/m3] -#+end_src - -Its color. -#+begin_src matlab - TP.color = [0.7 0.7 0.7]; % Color [RGB] -#+end_src - -Then the shape of the top plate is computed -#+begin_src matlab - TP.shape = [TP.Rint TP.H; TP.Rint 0; TP.Rext 0; TP.Rext TP.H]; -#+end_src - -The structure is added to the stewart structure -#+begin_src matlab - stewart.TP = TP; -#+end_src - -*** Legs -#+name: fig:stewart_legs -#+caption: Schematic for the legs of the Stewart platform -[[file:./figs/stewart_legs.png]] - - -The leg structure is initialized. -#+begin_src matlab - Leg = struct(); -#+end_src - -The maximum Stroke of each leg is defined. -#+begin_src matlab - Leg.stroke = opts.stroke; % [m] -#+end_src - -The stiffness and damping of each leg are defined -#+begin_src matlab - Leg.k_ax = opts.k_ax; % Stiffness of each leg [N/m] - Leg.c_ax = opts.c_ax; % Damping of each leg [N/(m/s)] -#+end_src - -The radius of the legs are defined -#+begin_src matlab - Leg.Rtop = 10; % Radius of the cylinder of the top part of the leg[mm] - Leg.Rbot = 12; % Radius of the cylinder of the bottom part of the leg [mm] -#+end_src - -The density of its material. -#+begin_src matlab - Leg.density = opts.density; % Density of the material used for the legs [kg/m3] -#+end_src - -Its color. -#+begin_src matlab - Leg.color = [0.5 0.5 0.5]; % Color of the top part of the leg [RGB] -#+end_src - -The radius of spheres representing the ball joints are defined. -#+begin_src matlab - Leg.R = 1.3*Leg.Rbot; % Size of the sphere at the extremity of the leg [mm] -#+end_src - -The structure is added to the stewart structure -#+begin_src matlab - stewart.Leg = Leg; -#+end_src - -*** Ball Joints -#+name: fig:stewart_ball_joints -#+caption: Schematic of the support for the ball joints -[[file:./figs/stewart_ball_joints.png]] - -=SP= is the structure representing the support for the ball joints at the extremity of each leg. - -The =SP= structure is initialized. -#+begin_src matlab - SP = struct(); -#+end_src - -We can define its rotational stiffness and damping. For now, we use perfect joints. -#+begin_src matlab - SP.k = 0; % [N*m/deg] - SP.c = 0; % [N*m/deg] -#+end_src - -Its height is defined -#+begin_src matlab - SP.H = 15; % [mm] -#+end_src - -Its radius is based on the radius on the sphere at the end of the legs. -#+begin_src matlab - SP.R = Leg.R; % [mm] -#+end_src - -#+begin_src matlab - SP.section = [0 SP.H-SP.R; - 0 0; - SP.R 0; - SP.R SP.H]; -#+end_src - -The density of its material is defined. -#+begin_src matlab - SP.density = opts.density; % [kg/m^3] -#+end_src - -Its color is defined. -#+begin_src matlab - SP.color = [0.7 0.7 0.7]; % [RGB] -#+end_src - -The structure is added to the Hexapod structure -#+begin_src matlab - stewart.SP = SP; -#+end_src - -*** More parameters are initialized -#+begin_src matlab - stewart = initializeParameters(stewart); -#+end_src - -*** Save the Stewart Structure -#+begin_src matlab - save('./mat/stewart.mat', 'stewart') -#+end_src - -*** initializeParameters Function - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle no - :END: -#+begin_src matlab - function [stewart] = initializeParameters(stewart) -#+end_src - -Computation of the position of the connection points on the base and moving platform -We first initialize =pos_base= corresponding to $[a_1, a_2, a_3, a_4, a_5, a_6]^T$ and =pos_top= corresponding to $[b_1, b_2, b_3, b_4, b_5, b_6]^T$. -#+begin_src matlab - stewart.pos_base = zeros(6, 3); - stewart.pos_top = zeros(6, 3); -#+end_src - -We estimate the height between the ball joints of the bottom platform and of the top platform. -#+begin_src matlab - height = stewart.H - stewart.BP.H - stewart.TP.H - 2*stewart.SP.H; % [mm] -#+end_src - -#+begin_src matlab - for i = 1:3 - % base points - angle_m_b = 120*(i-1) - stewart.BP.alpha; - angle_p_b = 120*(i-1) + stewart.BP.alpha; - - stewart.pos_base(2*i-1,:) = [stewart.BP.Rleg*cos(angle_m_b), stewart.BP.Rleg*sin(angle_m_b), 0.0]; - stewart.pos_base(2*i,:) = [stewart.BP.Rleg*cos(angle_p_b), stewart.BP.Rleg*sin(angle_p_b), 0.0]; - - % top points - angle_m_t = 120*(i-1) - stewart.TP.alpha + stewart.TP.dalpha; - angle_p_t = 120*(i-1) + stewart.TP.alpha + stewart.TP.dalpha; - - stewart.pos_top(2*i-1,:) = [stewart.TP.Rleg*cos(angle_m_t), stewart.TP.Rleg*sin(angle_m_t), height]; - stewart.pos_top(2*i,:) = [stewart.TP.Rleg*cos(angle_p_t), stewart.TP.Rleg*sin(angle_p_t), height]; - end - - % permute pos_top points so that legs are end points of base and top points - stewart.pos_top = [stewart.pos_top(6,:); stewart.pos_top(1:5,:)]; %6th point on top connects to 1st on bottom - stewart.pos_top_tranform = stewart.pos_top - height*[zeros(6, 2),ones(6, 1)]; -#+end_src - -leg vectors -#+begin_src matlab - legs = stewart.pos_top - stewart.pos_base; - leg_length = zeros(6, 1); - leg_vectors = zeros(6, 3); - for i = 1:6 - leg_length(i) = norm(legs(i,:)); - leg_vectors(i,:) = legs(i,:) / leg_length(i); - end - - stewart.Leg.lenght = 1000*leg_length(1)/1.5; - stewart.Leg.shape.bot = [0 0; ... - stewart.Leg.rad.bottom 0; ... - stewart.Leg.rad.bottom stewart.Leg.lenght; ... - stewart.Leg.rad.top stewart.Leg.lenght; ... - stewart.Leg.rad.top 0.2*stewart.Leg.lenght; ... - 0 0.2*stewart.Leg.lenght]; -#+end_src - -Calculate revolute and cylindrical axes -#+begin_src matlab - rev1 = zeros(6, 3); - rev2 = zeros(6, 3); - cyl1 = zeros(6, 3); - for i = 1:6 - rev1(i,:) = cross(leg_vectors(i,:), [0 0 1]); - rev1(i,:) = rev1(i,:) / norm(rev1(i,:)); - - rev2(i,:) = - cross(rev1(i,:), leg_vectors(i,:)); - rev2(i,:) = rev2(i,:) / norm(rev2(i,:)); - - cyl1(i,:) = leg_vectors(i,:); - end -#+end_src - -Coordinate systems -#+begin_src matlab - stewart.lower_leg = struct('rotation', eye(3)); - stewart.upper_leg = struct('rotation', eye(3)); - - for i = 1:6 - stewart.lower_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)']; - stewart.upper_leg(i).rotation = [rev1(i,:)', rev2(i,:)', cyl1(i,:)']; - end -#+end_src - -Position Matrix -#+begin_src matlab - stewart.M_pos_base = stewart.pos_base + (height+(stewart.TP.h+stewart.Leg.sphere.top+stewart.SP.h.top+stewart.jacobian)*1e-3)*[zeros(6, 2),ones(6, 1)]; -#+end_src - -Compute Jacobian Matrix -#+begin_src matlab - % aa = stewart.pos_top_tranform + (stewart.jacobian - stewart.TP.h - stewart.SP.height.top)*1e-3*[zeros(6, 2),ones(6, 1)]; - bb = stewart.pos_top_tranform - (stewart.TP.h + stewart.SP.height.top)*1e-3*[zeros(6, 2),ones(6, 1)]; - bb = bb - stewart.jacobian*1e-3*[zeros(6, 2),ones(6, 1)]; - stewart.J = getJacobianMatrix(leg_vectors', bb'); - - stewart.K = stewart.Leg.k.ax*stewart.J'*stewart.J; - end -#+end_src - -*** initializeParameters Function - BIS -#+begin_src matlab - function [stewart] = initializeParameters(stewart) -#+end_src - -We first compute $[a_1, a_2, a_3, a_4, a_5, a_6]^T$ and $[b_1, b_2, b_3, b_4, b_5, b_6]^T$. -#+begin_src matlab - stewart.Aa = zeros(6, 3); % [mm] - stewart.Ab = zeros(6, 3); % [mm] -#+end_src - -#+begin_src matlab - for i = 1:3 - stewart.Aa(2*i-1,:) = [stewart.BP.Rleg*cos( pi/180*(120*(i-1) - stewart.BP.alpha) ), ... - stewart.BP.Rleg*sin( pi/180*(120*(i-1) - stewart.BP.alpha) ), ... - stewart.BP.H+stewart.SP.H]; - stewart.Aa(2*i,:) = [stewart.BP.Rleg*cos( pi/180*(120*(i-1) + stewart.BP.alpha) ), ... - stewart.BP.Rleg*sin( pi/180*(120*(i-1) + stewart.BP.alpha) ), ... - stewart.BP.H+stewart.SP.H]; - - stewart.Ab(2*i-1,:) = [stewart.TP.Rleg*cos( pi/180*(120*(i-1) + stewart.TP.dalpha - stewart.TP.alpha) ), ... - stewart.TP.Rleg*sin( pi/180*(120*(i-1) + stewart.TP.dalpha - stewart.TP.alpha) ), ... - stewart.H - stewart.TP.H - stewart.SP.H]; - stewart.Ab(2*i,:) = [stewart.TP.Rleg*cos( pi/180*(120*(i-1) + stewart.TP.dalpha + stewart.TP.alpha) ), ... - stewart.TP.Rleg*sin( pi/180*(120*(i-1) + stewart.TP.dalpha + stewart.TP.alpha) ), ... - stewart.H - stewart.TP.H - stewart.SP.H]; - end -#+end_src - -Now, we compute the leg vectors $\hat{s}_i$ and leg position $l_i$: -\[ b_i - a_i = l_i \hat{s}_i \] - -We initialize $l_i$ and $\hat{s}_i$ -#+begin_src matlab - leg_length = zeros(6, 1); % [mm] - leg_vectors = zeros(6, 3); -#+end_src - -We compute $b_i - a_i$, and then: -\begin{align*} - l_i &= \left|b_i - a_i\right| \\ - \hat{s}_i &= \frac{b_i - a_i}{l_i} -\end{align*} - -#+begin_src matlab - legs = stewart.Ab - stewart.Aa; - - for i = 1:6 - leg_length(i) = norm(legs(i,:)); - leg_vectors(i,:) = legs(i,:) / leg_length(i); - end -#+end_src - -Then the shape of the bottom leg is estimated -#+begin_src matlab - stewart.Leg.lenght = leg_length(1)/1.5; - stewart.Leg.shape.bot = ... - [0 0; ... - stewart.Leg.Rbot 0; ... - stewart.Leg.Rbot stewart.Leg.lenght; ... - stewart.Leg.Rtop stewart.Leg.lenght; ... - stewart.Leg.Rtop 0.2*stewart.Leg.lenght; ... - 0 0.2*stewart.Leg.lenght]; -#+end_src - -We compute rotation matrices to have the orientation of the legs. -The rotation matrix transforms the $z$ axis to the axis of the leg. The other axis are not important here. -#+begin_src matlab - stewart.Rm = struct('R', eye(3)); - - for i = 1:6 - sx = cross(leg_vectors(i,:), [1 0 0]); - sx = sx/norm(sx); - - sy = -cross(sx, leg_vectors(i,:)); - sy = sy/norm(sy); - - sz = leg_vectors(i,:); - sz = sz/norm(sz); - - stewart.Rm(i).R = [sx', sy', sz']; - end -#+end_src - -Compute Jacobian Matrix -#+begin_src matlab - J = zeros(6); - - for i = 1:6 - J(i, 1:3) = leg_vectors(i, :); - J(i, 4:6) = cross(0.001*(stewart.Ab - stewart.H*[0,0,1]), leg_vectors(i, :)); - end - - stewart.J = J; -#+end_src - -#+begin_src matlab - stewart.K = stewart.Leg.k_ax*stewart.J'*stewart.J; -#+end_src - -#+begin_src matlab - end - end -#+end_src - -** initializeSample - :PROPERTIES: - :HEADER-ARGS:matlab+: :tangle src/initializeSample.m - :END: -#+begin_src matlab - function [] = initializeSample(opts_param) - %% Default values for opts - sample = struct( ... - 'radius', 100, ... % radius of the cylinder [mm] - 'height', 300, ... % height of the cylinder [mm] - 'mass', 50, ... % mass of the cylinder [kg] - 'measheight', 150, ... % measurement point z-offset [mm] - 'offset', [0, 0, 0], ... % offset position of the sample [mm] - 'color', [0.9 0.1 0.1] ... - ); - - %% Populate opts with input parameters - if exist('opts_param','var') - for opt = fieldnames(opts_param)' - sample.(opt{1}) = opts_param.(opt{1}); - end - end - - %% Save - save('./mat/sample.mat', 'sample'); - end -#+end_src +* Simscape Model +- [[file:simscape-model.org][Model of the Stewart Platform]] +- [[file:identification.org][Identification]] + +* Architecture Study +- [[file:kinematic-study.org][Kinematic Study]] +- [[file:stiffness-study.org][Stiffness Matrix Study]] +- Jacobian Study + +* Motion Control +- Active Damping +- Inertial Control +- Decentralized Control diff --git a/js/bootstrap.min.js b/js/bootstrap.min.js new file mode 100644 index 0000000..c8f82e5 --- /dev/null +++ b/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-mp.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/js/jquery.min.js b/js/jquery.min.js new file mode 100644 index 0000000..25714ed --- /dev/null +++ b/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | 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=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.3",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 d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.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(null)},push:f,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!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));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,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},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,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),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):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;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,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"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=hb(),z=hb(),A=hb(),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=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),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")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=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)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){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 gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(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 mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(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 pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.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.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);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 p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(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(".#.+[+~]")}),jb(function(a){var b=g.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=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.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===g||a.ownerDocument===v&&t(v,a)?-1:b===g||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,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||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 gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.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},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.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=gb.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=gb.selectors={cacheLength:50,createPseudo:ib,match:X,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(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===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]||gb.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]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.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(cb,db).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=gb.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(Q," ")+" ").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;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(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:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(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:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).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 Z.test(a.nodeName)},input:function(a){return Y.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:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(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=[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(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(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 ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(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 wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(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=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(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=[sb(tb(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 wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.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(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.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(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(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}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(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(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==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=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir: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},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.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.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&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 n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||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&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},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().done(c.resolve).fail(c.reject).progress(c.notify):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=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;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||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;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};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),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){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c) +},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),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=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){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])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(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 L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=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(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.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=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(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.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!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&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(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)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("