From 696e387ff35973b9b7642152c86653109f80264d Mon Sep 17 00:00:00 2001 From: Shelby Sanders Date: Mon, 4 Aug 2014 19:44:12 -0700 Subject: [PATCH] Corrected issues with merge of 2.x changes --- index.js | 4 +- public/css/screen.css | 1675 ++++++++++ ...L2emPh0ROJezvraLO3LdcAZYWl9Si6vvxL-qU.woff | Bin 0 -> 29548 bytes ...dpjqFRVUSto6IffLO3LdcAZYWl9Si6vvxL-qU.woff | Bin 0 -> 25388 bytes ...evf54tkVDLy-dlnLO3LdcAZYWl9Si6vvxL-qU.woff | Bin 0 -> 23196 bytes public/images/explorer_icons.png | Bin 5763 -> 0 bytes public/images/logo_small.png | Bin 0 -> 2681 bytes public/images/pet_store_api.png | Bin 824 -> 0 bytes public/images/throbber.gif | Bin 0 -> 9257 bytes public/images/wordnik_api.png | Bin 980 -> 0 bytes public/index.html | 2 +- public/lib/loadSwaggerUI.js | 4 +- public/lib/shred.bundle.js | 2765 ----------------- public/lib/shred/content.js | 193 -- public/lib/swagger-oauth.js | 218 -- public/o2c.html | 15 - 16 files changed, 1680 insertions(+), 3196 deletions(-) create mode 100644 public/css/screen.css create mode 100644 public/fonts/0ihfXUL2emPh0ROJezvraLO3LdcAZYWl9Si6vvxL-qU.woff create mode 100644 public/fonts/OsJ2DjdpjqFRVUSto6IffLO3LdcAZYWl9Si6vvxL-qU.woff create mode 100644 public/fonts/_aijTyevf54tkVDLy-dlnLO3LdcAZYWl9Si6vvxL-qU.woff delete mode 100644 public/images/explorer_icons.png create mode 100644 public/images/logo_small.png delete mode 100644 public/images/pet_store_api.png create mode 100644 public/images/throbber.gif delete mode 100644 public/images/wordnik_api.png delete mode 100644 public/lib/shred.bundle.js delete mode 100644 public/lib/shred/content.js delete mode 100644 public/lib/swagger-oauth.js delete mode 100644 public/o2c.html diff --git a/index.js b/index.js index 55e5aae..c27a48e 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,4 @@ -'use strict'; + 'use strict'; /*! * Adds dynamically-updated docs as /explorer */ @@ -8,7 +8,7 @@ var urlJoin = require('./lib/url-join'); var _defaults = require('lodash.defaults'); var express = require('express'); var swagger = require('./lib/swagger'); -var SWAGGER_UI_ROOT = path.join(__dirname, 'node_modules', +var SWAGGER_UI_ROOT = path.join(__dirname, 'node_modules', 'swagger-ui', 'dist'); var STATIC_ROOT = path.join(__dirname, 'public'); diff --git a/public/css/screen.css b/public/css/screen.css new file mode 100644 index 0000000..4a81758 --- /dev/null +++ b/public/css/screen.css @@ -0,0 +1,1675 @@ +/* FIXME move overrides only into loopbackStyles.css */ +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +caption, +th, +td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} +q, +blockquote { + quotes: none; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; + content: none; +} +a img { + border: none; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section, +summary { + display: block; +} + +h1 a, +h2 a, +h3 a, +h4 a, +h5 a, +h6 a { + text-decoration: none; +} +h1 a:hover, +h2 a:hover, +h3 a:hover, +h4 a:hover, +h5 a:hover, +h6 a:hover { + text-decoration: underline; +} +h1 span.divider, +h2 span.divider, +h3 span.divider, +h4 span.divider, +h5 span.divider, +h6 span.divider { + color: #aaaaaa; +} +h1 { + color: black; + font-size: 1.5em; + line-height: 1.3em; + padding: 10px 0 10px 0; + font-family: 'Ubuntu', sans-serif; + font-weight: bold; +} +h2 { + color: black; + font-size: 1.3em; + padding: 10px 0 10px 0; +} +h2 a { + color: black; +} +h2 span.sub { + font-size: 0.7em; + color: #999999; + font-style: italic; +} +h2 span.sub a { + color: #777777; +} +h3 { + color: black; + font-size: 1.1em; + padding: 10px 0 10px 0; +} +.heading_with_menu { + float: none; + clear: both; + overflow: hidden; + display: block; +} +.heading_with_menu h1, +.heading_with_menu h2, +.heading_with_menu h3, +.heading_with_menu h4, +.heading_with_menu h5, +.heading_with_menu h6 { + display: block; + clear: none; + float: left; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + width: 60%; +} +.heading_with_menu ul { + display: block; + clear: none; + float: right; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + margin-top: 10px; +} +input.parameter { + width: 300px; + border: 1px solid #aaa; +} +.body-textarea { + width: 300px; + height: 100px; + border: 1px solid #aaa; +} +p { + line-height: 1.4em; + padding: 0 0 10px; + color: #333333; +} +ol { + margin: 0px 0 10px; + padding: 0 0 0 18px; + list-style-type: decimal; +} +ol li { + padding: 5px 0px; + font-size: 0.9em; + color: #333333; +} +.markdown h3 { + color: #547f00; +} +.markdown h4 { + color: #666666; +} +.markdown pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #fcf6db; + border: 1px solid #e5e0c6; + padding: 10px; + margin: 0 0 10px 0; +} +.markdown pre code { + line-height: 1.6em; +} +.markdown p code, +.markdown li code { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #f0f0f0; + color: black; + padding: 1px 3px; +} +.markdown ol, +.markdown ul { + font-family: 'Ubuntu', sans-serif; + margin: 5px 0 10px; + padding: 0 0 0 18px; + list-style-type: disc; +} +.markdown ol li, +.markdown ul li { + padding: 3px 0px; + line-height: 1.4em; + color: #333333; +} +div.gist { + margin: 20px 0 25px 0 !important; +} +p.big, +div.big p { + font-size: 1em; + margin-bottom: 10px; +} +span.weak { + color: #666666; +} +span.blank, +span.empty { + color: #888888; + font-style: italic; +} +a { + color: #547f00; +} +b, +strong { + font-family: 'Ubuntu', sans-serif; + font-weight: bold; +} +.code { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; +} +pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + background-color: #fcf6db; + border: 1px solid #e5e0c6; + padding: 10px; +} +pre code { + line-height: 1.6em; +} +.required { + font-weight: bold; +} +table.fullwidth { + width: 100%; +} +table thead tr th { + padding: 5px; + font-size: 0.9em; + color: #666666; + border-bottom: 1px solid #999999; +} +table tbody tr.offset { + background-color: #f5f5f5; +} +table tbody tr td { + padding: 6px; + font-size: 0.9em; + border-bottom: 1px solid #cccccc; + vertical-align: top; + line-height: 1.3em; +} +table tbody tr:last-child td { + border-bottom: none; +} +table tbody tr.offset { + background-color: #f0f0f0; +} +form.form_box { + background-color: #ebf3f9; + border: 1px solid #c3d9ec; + padding: 10px; +} +form.form_box label { + color: #0f6ab4 !important; +} +form.form_box input[type=submit] { + display: block; + padding: 10px; +} +form.form_box p { + font-size: 0.9em; + padding: 0 0 15px; + color: #7e7b6d; +} +form.form_box p a { + color: #646257; +} +form.form_box p strong { + color: black; +} +form.form_box p.weak { + font-size: 0.8em; +} +form.formtastic fieldset.inputs ol li p.inline-hints { + margin-left: 0; + font-style: italic; + font-size: 0.9em; + margin: 0; +} +form.formtastic fieldset.inputs ol li label { + display: block; + clear: both; + width: auto; + padding: 0 0 3px; + color: #666666; +} +form.formtastic fieldset.inputs ol li label abbr { + padding-left: 3px; + color: #888888; +} +form.formtastic fieldset.inputs ol li.required label { + color: black; +} +form.formtastic fieldset.inputs ol li.string input, +form.formtastic fieldset.inputs ol li.url input, +form.formtastic fieldset.inputs ol li.numeric input { + display: block; + padding: 4px; + width: auto; + clear: both; +} +form.formtastic fieldset.inputs ol li.string input.title, +form.formtastic fieldset.inputs ol li.url input.title, +form.formtastic fieldset.inputs ol li.numeric input.title { + font-size: 1.3em; +} +form.formtastic fieldset.inputs ol li.text textarea { + font-family: 'Ubuntu', sans-serif; + height: 250px; + padding: 4px; + display: block; + clear: both; +} +form.formtastic fieldset.inputs ol li.select select { + display: block; + clear: both; +} +form.formtastic fieldset.inputs ol li.boolean { + float: none; + clear: both; + overflow: hidden; + display: block; +} +form.formtastic fieldset.inputs ol li.boolean input { + display: block; + float: left; + clear: none; + margin: 0 5px 0 0; +} +form.formtastic fieldset.inputs ol li.boolean label { + display: block; + float: left; + clear: none; + margin: 0; + padding: 0; +} +form.formtastic fieldset.buttons { + margin: 0; + padding: 0; +} +form.fullwidth ol li.string input, +form.fullwidth ol li.url input, +form.fullwidth ol li.text textarea, +form.fullwidth ol li.numeric input { + width: 500px !important; +} +body { + padding-top: 60px; + font-family: 'Ubuntu', sans-serif; +} +body #content_message { + margin: 10px 15px; + font-style: italic; + color: #999999; +} +body #header { + background-color: #08592b; + position: fixed; + width: 100%; + top: 0; + padding: 14px; +} +body #header a#logo { + font-size: 1.5em; + font-weight: bold; + text-decoration: none; + background: transparent url(../images/logo_small.png) no-repeat left center; + padding: 20px 0 20px 60px; + color: white; +} +body #header form#api_selector { + display: block; + clear: none; + float: right; +} +body #header form#api_selector .input { + display: block; + clear: none; + float: left; + margin: 0 10px 0 0; +} +body #header form#api_selector .input input { + font-size: 0.9em; + padding: 3px; + margin: 0; +} +body #header form#api_selector .input input#input_baseUrl { + width: 400px; +} +body #header form#api_selector .input input#input_apiKey { + width: 200px; +} +body #header form#api_selector .input a#explore { + display: block; + text-decoration: none; + font-weight: bold; + padding: 6px 8px; + font-size: 0.9em; + color: white; + background-color: #7dbd33; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -o-border-radius: 4px; + -ms-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} +body #header form#api_selector .input a#explore:hover { + background-color: #808080; +} +body p#colophon { + margin: 0 15px 40px 15px; + padding: 10px 0; + font-size: 0.8em; + border-top: 1px solid #dddddd; + font-family: 'Ubuntu', sans-serif; + color: #999999; + font-style: italic; +} +body p#colophon a { + text-decoration: none; + color: #547f00; +} +body ul#resources { + font-family: 'Ubuntu', sans-serif; + font-size: 0.9em; +} +body ul#resources li.resource { + border-bottom: 1px solid #dddddd; +} +body ul#resources li.resource:last-child { + border-bottom: none; +} +body ul#resources li.resource div.heading { + border: 1px solid transparent; + float: none; + clear: both; + overflow: hidden; + display: block; +} +body ul#resources li.resource div.heading h2 { + color: #999999; + padding-left: 0; + display: block; + clear: none; + float: left; + font-family: 'Ubuntu', sans-serif; + font-weight: bold; +} +body ul#resources li.resource div.heading h2 a { + color: #999999; +} +body ul#resources li.resource div.heading h2 a:hover { + color: black; +} +body ul#resources li.resource div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 14px 10px 0 0; +} +body ul#resources li.resource div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} +body ul#resources li.resource div.heading ul.options li:first-child, +body ul#resources li.resource div.heading ul.options li.first { + padding-left: 0; +} +body ul#resources li.resource div.heading ul.options li:last-child, +body ul#resources li.resource div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +body ul#resources li.resource div.heading ul.options li { + color: #666666; + font-size: 0.9em; +} +body ul#resources li.resource div.heading ul.options li a { + color: #aaaaaa; + text-decoration: none; +} +body ul#resources li.resource div.heading ul.options li a:hover { + text-decoration: underline; + color: black; +} +body ul#resources li.resource:hover div.heading h2 a, +body ul#resources li.resource.active div.heading h2 a { + color: black; +} +body ul#resources li.resource:hover div.heading ul.options li a, +body ul#resources li.resource.active div.heading ul.options li a { + color: #555555; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + background-color: #e6f3f6; + border: 1px solid #bfe1e8; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span { + margin: 0; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #0085a1; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px 0; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.path { + padding-left: 10px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.path a { + color: black; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.path a:hover { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:first-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.first { + padding-left: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li { + border-right-color: #bfe1e8; + color: #0085a1; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a { + color: #0085a1; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a:hover, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a:active, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a.active { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content { + background-color: #e9f5f7; + border: 1px solid #bfe1e8; + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4 { + color: #0085a1; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content form input[type='text'].error { + outline: 2px solid #cc0000; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header img { + display: block; + clear: none; + float: right; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a { + padding: 4px 0 0 10px; + color: #66b6c7; + display: inline-block; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content .content-type div label { + clear: both; + display: block; + color: #0085a1; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + background-color: #f4effa; + border: 1px solid #e3d8f3; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span { + margin: 0; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #9063cd; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px 0; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.path { + padding-left: 10px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.path a { + color: black; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.path a:hover { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:first-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.first { + padding-left: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li { + border-right-color: #e3d8f3; + color: #9063cd; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a { + color: #9063cd; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a:hover, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a:active, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a.active { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content { + background-color: #f6f2fb; + border: 1px solid #e3d8f3; + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4 { + color: #9063cd; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content form input[type='text'].error { + outline: 2px solid #cc0000; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header img { + display: block; + clear: none; + float: right; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a { + padding: 4px 0 0 10px; + color: #bca1e1; + display: inline-block; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content .content-type div label { + clear: both; + display: block; + color: #9063cd; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + background-color: #ede7ee; + border: 1px solid #d1c2d6; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span { + margin: 0; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #470a59; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px 0; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.path { + padding-left: 10px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.path a { + color: black; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.path a:hover { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:first-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.first { + padding-left: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li { + border-right-color: #d1c2d6; + color: #470a59; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a { + color: #470a59; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a:hover, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a:active, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a.active { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content { + background-color: #efeaf1; + border: 1px solid #d1c2d6; + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 { + color: #470a59; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content form input[type='text'].error { + outline: 2px solid #cc0000; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header img { + display: block; + clear: none; + float: right; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a { + padding: 4px 0 0 10px; + color: #916c9b; + display: inline-block; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content .content-type div label { + clear: both; + display: block; + color: #470a59; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + background-color: #e6f9fb; + border: 1px solid #bff0f5; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span { + margin: 0; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #00c1d5; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px 0; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.path { + padding-left: 10px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.path a { + color: black; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.path a:hover { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:first-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.first { + padding-left: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li { + border-right-color: #bff0f5; + color: #00c1d5; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a { + color: #00c1d5; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a:hover, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a:active, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a.active { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content { + background-color: #e9fafb; + border: 1px solid #bff0f5; + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4 { + color: #00c1d5; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content form input[type='text'].error { + outline: 2px solid #cc0000; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header img { + display: block; + clear: none; + float: right; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a { + padding: 4px 0 0 10px; + color: #66dae6; + display: inline-block; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content .content-type div label { + clear: both; + display: block; + color: #00c1d5; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + background-color: #fff2ec; + border: 1px solid #ffdfd0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span { + margin: 0; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #ff7f41; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px 0; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.path { + padding-left: 10px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.path a { + color: black; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.path a:hover { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:first-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.first { + padding-left: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li { + border-right-color: #ffdfd0; + color: #ff7f41; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a { + color: #ff7f41; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a:hover, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a:active, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a.active { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content { + background-color: #fff4ef; + border: 1px solid #ffdfd0; + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4 { + color: #ff7f41; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content form input[type='text'].error { + outline: 2px solid #cc0000; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header img { + display: block; + clear: none; + float: right; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a { + padding: 4px 0 0 10px; + color: #ffb28d; + display: inline-block; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content .content-type div label { + clear: both; + display: block; + color: #ff7f41; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0 0 10px; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading { + float: none; + clear: both; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + background-color: #fbede7; + border: 1px solid #f4d1c3; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 { + display: block; + clear: none; + float: left; + width: auto; + margin: 0; + padding: 0; + line-height: 1.1em; + color: black; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span { + margin: 0; + padding: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a { + text-transform: uppercase; + background-color: #d4470f; + text-decoration: none; + color: white; + display: inline-block; + width: 50px; + font-size: 0.7em; + text-align: center; + padding: 7px 0 4px 0; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + -o-border-radius: 2px; + -ms-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.path { + padding-left: 10px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.path a { + color: black; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.path a:hover { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options { + overflow: hidden; + padding: 0; + display: block; + clear: none; + float: right; + margin: 6px 10px 0 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:first-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.first { + padding-left: 0; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last { + padding-right: 0; + border-right: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li { + border-right-color: #f4d1c3; + color: #d4470f; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a { + color: #d4470f; + text-decoration: none; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a:hover, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a:active, +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a.active { + text-decoration: underline; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content { + background-color: #fbefeb; + border: 1px solid #f4d1c3; + border-top: none; + padding: 10px; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + -o-border-bottom-left-radius: 6px; + -ms-border-bottom-left-radius: 6px; + -khtml-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + -o-border-bottom-right-radius: 6px; + -ms-border-bottom-right-radius: 6px; + -khtml-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + margin: 0 0 20px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4 { + color: #d4470f; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content form input[type='text'].error { + outline: 2px solid #cc0000; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header { + float: none; + clear: both; + overflow: hidden; + display: block; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header input.submit { + display: block; + clear: none; + float: left; + padding: 6px 8px; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header img { + display: block; + clear: none; + float: right; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a { + padding: 4px 0 0 10px; + color: #e5916f; + display: inline-block; + font-size: 0.9em; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.response div.block pre { + font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace; + padding: 10px; + font-size: 0.9em; + max-height: 400px; + overflow-y: auto; +} +body ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content .content-type div label { + clear: both; + display: block; + color: #d4470f; + font-size: 1.1em; + margin: 0; + padding: 15px 0 5px; +} +.model-signature { + font-family: 'Ubuntu', sans-serif; + font-size: 1em; + line-height: 1.5em; +} +.model-signature .description div { + font-size: 0.9em; + line-height: 1.5em; + margin-left: 1em; +} +.model-signature .description .strong { + font-weight: bold; + color: #000; + font-size: .9em; +} +.model-signature .description .stronger { + font-weight: bold; + color: #000; +} +.model-signature .signature-nav a { + text-decoration: none; + color: #AAA; +} +.model-signature pre { + font-size: .85em; + line-height: 1.2em; + overflow: auto; + max-height: 200px; + cursor: pointer; +} +.model-signature pre:hover { + background-color: #ffffdd; +} +.model-signature .snippet small { + font-size: 0.75em; +} +.model-signature .signature-container { + clear: both; +} +.model-signature .signature-nav a:hover { + text-decoration: underline; + color: black; +} +.model-signature .signature-nav .selected { + color: black; + text-decoration: none; +} +.model-signature ul.signature-nav { + display: block; + margin: 0; + padding: 0; +} +.model-signature ul.signature-nav li { + float: left; + margin: 0 5px 5px 0; + padding: 2px 5px 2px 0; + border-right: 1px solid #ddd; +} +.model-signature ul.signature-nav li:last-child { + padding-right: 0; + border-right: none; +} +.model-signature .propName { + font-weight: bold; +} +.model-signature .propType { + color: #5555aa; +} +.model-signature .propOptKey { + font-style: italic; +} +.model-signature .propOpt { + color: #555; +} +pre code { + background: none; +} +.content pre { + font-size: 12px; + margin-top: 5px; + padding: 5px; +} +.swagger-ui-wrap { + max-width: 960px; + margin-left: auto; + margin-right: auto; +} +.icon-btn { + cursor: pointer; +} +#message-bar { + min-height: 30px; + text-align: center; + padding-top: 10px; +} +.message-success { + color: #89BF04; +} +.message-fail { + color: #cc0000; +} \ No newline at end of file diff --git a/public/fonts/0ihfXUL2emPh0ROJezvraLO3LdcAZYWl9Si6vvxL-qU.woff b/public/fonts/0ihfXUL2emPh0ROJezvraLO3LdcAZYWl9Si6vvxL-qU.woff new file mode 100644 index 0000000000000000000000000000000000000000..80a3fc2f1de9dce7aee6c899ba7912bddb826840 GIT binary patch literal 29548 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ⅆS^J%ZVuM@K86%Qp;fzuI09l)NXkz&sLa z6iXVydQJJpMOIBU`(w|pUAk%hOcUnLcI}#qx#l%Zb!YLGYpQpgTQuQbbZ1+XP1Vn~ zswEYgoyuvsbo)+DD-6No)S_Z(;PgB;a`x)$#}ls-4LzpgGQ7WV8UOkVIhRS&jR#ye z;;$%jnWoy;L>kAc{DLNH)0qy5>bq{4(&!>PV$5i(Ff*&hB<)0;~1R*AZO%v8liY=qvZWS@ecUnDA6Kj;H=SG;n z6w(aBFv7s>OZv-I6Kj|SM}prr`nnXK5PRce^F$@Fx3N?=v#hiXL(x4Yn$e#tl}9r8 Rf?MR2Do<~aarZfb{tp|1dq4mH literal 0 HcmV?d00001 diff --git a/public/fonts/OsJ2DjdpjqFRVUSto6IffLO3LdcAZYWl9Si6vvxL-qU.woff b/public/fonts/OsJ2DjdpjqFRVUSto6IffLO3LdcAZYWl9Si6vvxL-qU.woff new file mode 100644 index 0000000000000000000000000000000000000000..31bdbab9fd3a0ee35e17a0a4ea90651c1fbb3d39 GIT binary patch literal 25388 zcmb@t1yCeQ69&k_;x3EJ;)}bxySux)`>?n>EV4N4!s71k?(XjHgAB)e|NABG;^N{i zZX&9>Go!jXt1|1$uey6Y6vV~BK7oDwOlZLn|2ozee#n1o{*wOpCoZlk2L|?u@k59I zSJCU>GFDJwVE)j_e#kl>#V{h{($~b!$nis0{88dQ%1!QZ<-UcH%ZCnv^P>&Q-vu2E z*231y{6i-R2KMa{42-X>>QRZVC>KShtHND$`76Ehy3-Ukij-X z(OcTNdVc7V!N9;VKl-qoYa+w9F>|&D1EVhk1EUEA12fR{C(K2)bujt3R-5(1j)uR= zA;}Vjoss8J$j%H5OcwzR4D!QfM8C`=Hfu)*mydfIWqw>2|8XB| zad6b}k8A#(o8brtrjK*5;RyZ6zm6lNHorYHO$^PIO^6FtxWvJg%r4bNd1i&Vh z#F|ylMT3MA2V<5;2>|=6Z$m@#?}j)~;!r4_5PM94Kw1Q>?{%Moz~jlmOr4mon1`6> zm|iVdO%cqw2VA3$V*|qjlLIpY69ZEMql6=RaLK2k-#6dix~|>@mS~ZxkRU@L1qp-{ z33}kr;FtvoeqeKBzrVk}-@hll$GsCh3taneZ@&9)zWTixo(9Pwv-4{{8V&@3pka|& zFA0)6i5+#eDCX+PK8dqKHL;6ReC-ad0K>+hEweqt&(vMxZS#Ev4;1bp$v56XOH`g= zu5rGBi3Fk63vzXJgJ z6d=@1oM*I+nxHhzRPA&P8-ZYVp0%E2F{aaIIb8E=RHH(_-u(R84UgS^qs44B_T0z) za(z%SIWfa4&)7(aT|^60WRN!07%KG6x$4x}8e9F$T6O}W+QkMZF+;nEh~IfYA5MZkEj6->p8#q zb6IZ~D#K8`_T^_fN9X3{+r*=vOuXpk$ZB8ZFpDUu5PI;2BEx=u@pt8`2$$RA-?G$J zzH-x?6e_x+;~BuWgyhqt3_4j)jFiLM}bsN`hh<>qi^A8?2Lr?O!IIZl~NImh3M0 zb~$P|_-}?tbuKggFhD=sT~0|Q{V1d3!skZL$)wm&r~-$?6BukH{+Lp%W03nP!7WYx zR;eRkn)$Y~c3;;m&+HxvMP+rt(T*GVr;;8$fMW*X zhckF}X8$W#&30ZB+p-VM0H?YHaR+mA7Bd#?(b^^gO%IJ2it7}X>XLbD6 zz7ZL+l9s_hYU33(Rq}YQjY~gLc5+;$GxlojUrzW0G^2OMf>gRf^4cQ!yxuwFG zcaSutRy-$NMc{V$SRNv+ySu!3dTFxl*q7s4-h6lMI)MYewoR+q*0Ga8pmCxGkIx%v z?Qg@47sW*wyuWYsS~#Ck3rn%Sg;cd2&LF@9aD-{=rgdh zxF_fvzA6)81)BGs5vGq{^}SP_-r4yn&-8?PMFDN zrO$7qOa9m$7)p3)`MJu_iO-*Zm2{g6O)FtQ*aek9UIyhQ1fIM9S;sv@v7ni%flcqO zQ07L6Npcnm*bmjkZCqLJXFp+>PvZ7dq+g~>kV;_cFIh>p?VMenq+V6E9SJ9cYa&BF zX%><%-G_qA&VV7(l9&m`HOx;9vDOWq-YKgetm z6B^lO6%XQ?8MI@wLglWQXT_*=sAe_5RQ1HYUP8Fe8442b?ty8Ka%Ym%0^r5yQ?zj) zRv&!XVSn8?%XqqhL!#zva#ihtU2DC8pL#6Fb-)hWRhriKfgbmBu(_v>Y{+##Sx&Pgsuc z&GvQD>@_9P#F+cb+j?#KNIJ?>RTx*{4&2drEp#ub9fV z2oTKW#P^Oag~iW3DAFcsg^=@GRE45gm8r&f>Iv^=<3)ka=ZOybzo9ibCtqdAT> zvt#cxd#U|N4lN0XwP(9!hnK5!e~hHux0)UZ!>NADaWM649kxr>s!xi6%3Awzg473% z_)NDx9pi1N{o-Z` z@)K2Z+aoB-B;esLZ%#HCn8Lg5z%K&EmJS!JK1@By+kHFJVAHLoY521||5ZcMeFVFF zT>_?Ifoy37Jy`zAa4H8*Ee764m|Rnx7G(#9eEci?PbLzw#sN-tLnYS1s9l^|Hh~4_ z@$Daek7H6SwQp8x;E2Pfh|l8wROgJ>s4ew&c#ADedw3TJZ{tNCYqe=&JSYSgQcOz@ z-xIjwb;MAprqXH7^SAjt7NOz&vTquv;42XM{ycZTT(&bc_^kMx-Nq>dEPm&UM>IsH zABxV(t&9ZB%yY)A|FVWm%n-~K{4%qc2_wuyf_GMqKCYL9GX<+4K^l9oZ8~~T_h)`F zkzup6Dn#$0O3n;nZ!P=E#+k*T{#iECw}``&eJ-c^c09}7hk8$m3!1q@dEj`$m9wV6 z{7~}eiruVDS>^<$D`U(UH-;iNEqD2R-a#vZtW5vpXyIqmDWM-ED5hDmD&B|=#^NQO z9Vl5>eLPEFjFapJY9-W$+HA_QEkNuBB%pq(dBh(wODVqzN^b~_+T&BU>|-m=9|V*uuf*>`m#0 zKH`l->cSS{wc+3#GSR6YwM?d@n_eKFFp0L_hwXTF;D!<2m%jtk4GX2RE~ zdCq4mJK?&O-r#TukzZCBs)%P>)#8SmsA%4b)o`3H;@Z7ZUL7zYez~l)R!fYQ^SXDn zRBvMR%QV!F`?<7B^3YR(cF?j*_+JXi1xq&94e~&)WP; ze^yk*RAj@-ekJ)7-)JpTutI_$hl`0HU`$alcXZ%0>33f`nirRlX3bR8`zRS4P4K;xAIDf}=(_be zTUu^SdE(d2qZ17|DsS)$#S$2djJtZ0yZO@!P_XnDEfz~#RNVMW?h$PZ_d!B4hK)$X zCL8cOe-;~JIfPa$dG))I1vc)y^~pF2RP=6v#wB96@cMYE19+dYb!XLY!42rJ>ZtD0 zn0Qo9(rQJ={Cs_Grx#UpxIG!#^-e7}zh{5R8Enh^eh7J5&n(OHYR$bOi zV$42>^yT5xV%)Ar1N!HAvW01HPpST8PC~RFpCkPuDzhsUbq74f3dE@@ zc~qghH!coz*_X@44tCbupJM+=BeunLx&j@!{XBunfUAJPiD){~9k5ycDl0>RURMO$ z69Wt0Dq-3{nn@3kyZ%`i@-2uW$I+()F3_fy(n*{EF&JHeK*-Asn@E z284$3nsN(TJgUp#p-8Vxkex)253`emk@W_e9cfO>-3j>KgvSuH>5Si;|1ar_Vln!m zX}tte(6qB53s?b`_ElU;=w-%;Vz%wDMe757OOu7l-EKcFCu4%jlzUL(3iT?d`X;NF zt&5s)KFKa1emeS|dMF%c%P{g}ow!ghMQso581%e>cYkfF>LE=O8+=bKVzMpi>M?UU zA?{;Lp;8Ewcqx!#%DsRL#JM5lh2n(Ll4{ZX}w14U=}v#!?{Ef;#IWw|~IiE~-6 zZAXz#e)E!grXzE3Hr?6x=Ee=aY?2Q{djDQ`?1yGf1Azc0wb>h7rJFZ9E~}4bt?+Sp zgM|5G)k>DPNW6tEW`XRXoExRN$1t1rF?~J3)Ax&@vG01qYylRSpkKpdG!h2HlV?2d zoXf4qw=JJM`%f7Uq-mi`%jNMw#U#_VRu)CK-_B)Pb#aLN=H{Dq2#z+VBMIpg`niLk zM5J1{Uz-hD~Ss$W){bOt)tt9`k?_ zKK49re(XN$7WSuJb-vI1W9V1H>qsVBPtDJ~VW&`3jojbD1;O%sB!)vq?N&nmd zC>!?6BX^MXd5IVI>GGZ4-(+z&$e1?xNm?In*D4r9X#6#?=X2K(6_0Rv0@KCsHRs2K zi=bwnCe*v(fL0FLjyg>M#Gi*(L#N*LrO+*4uA&UgI;v@gt5Tqh@62|_I@6(;Mwb6z zyuIF{e$@{m5r=pkUXARwX1_`C%cr}uC-FhTv0j9`k%B228K*L6i0>u`?dX&n1#_$X zo(?~|4o5DxvMKuk+Hst&u(;Omyi!FDC>jW^CxNy{GHP>?LtF+n2AD zBPYT}GvDr5jQSg=Kg0-<71R2C}R(#}FUxVJ3_6rNJL-Q0{On_7#k3NutDB~{{$IE=V;Y=lT}g4n&G z_8PX`$Z2)yoU!{?q~m!mj@K4eHjVOTAC&zk%_T~eY_Q?n>SSt z$@xxUvgk)TD7T2wa?+*DNBy7bdybAs+{}sa&rBht9d{f+k8-iU^hGX7G!A?t6VZkHDa^7yIgW_Ift1LtU7CVsgNF94Um zUq$OiYgm=gkN~8;f{^-nAumeqOp1nbY4Z(a=r(1-->^!)p5-0b2nku8|~ z&CUJ&ZuT^FwB88-KPgfPYiVYE&|o8vxV^mDPh1Y(Hr>ogBVRM~QqI94{8;^l8KN!n zwlbmgJNlSaTwq+n%f)JzqOqWq&%qPI6m!Ax{W}69;T|6> znXV$1d~Ntha^Q;Dp9!NxVw2o0QcA?bPUE^+XX(9wnlAho_4ai1y6DtOn-)xZ!K7dN zQ)~g5#1)zc4~=FmIL$oREMM5g>qbGmtA)132I9}#9o{v(5g@YJUXrqzVGo7ur#l^hApmgWsM7~I2G5{*P{~^cQn;5US6(i^?~3~i<^wBt$PQKt%x^L zB;&Rqh_Eg#D=;sgL+kXjP-v03G6rim@{N{THNtViaWe|Z_BFn$+gh$qpDqsPP!c6= zrx6b+lKh(Y(A~0_IYIlBis^SI#8miD37%$buw;0dp9$pr! zmLpA>->}gm&EyI;X89AuH*Vge?-rDfMtiWEDnuEf<~;wv+q9)7r3P1|)Y8kBySJX* z^ybMVw#L8KZij@F^LDx!5x*|qTzbHo2!1A+?8Ww!!%ubFy8AN^DxYCvxr(=yskK1YRd26kQ-QN`epg>7W z&xw0(q#J`=+;lRgTIn3|CuqYnrdBm4i5CM>+pu+DSht-W1*M-)oZ@PwN{qVUBL4}x zP6p=fTCPG|KCG?%Rw(?LHq?>ZUaIQcfy_2HBF*6)hoMf1qQ8DvLd>i)k2I4182W%6 zD0eQTqi%NRSY1c#FSVtOb9!(;fiE&LD&S2sLpVoM=u#qirmX6r;|MU4u-sYJ(lzLA z+6=s|x3LzY9{r_vB-Psj`oyE0(ul+3-BRw5uX2QUw>2j0YSbmr>NZBTfTmyEI*=FI ztA$-e<5+?z3Qwh^$rFg4{K~o{{K=<@19wI&Z1q<>!9G&uA~6SWc_N{S9z!h2YxBIi zBiKs^VqD9?o{mY@VU$jtW4&rT`6yx78|%M?_r7e@?EFM-KT)JwUv2Cv!1x;tjs zKlkP|(6(vle$}gfKxsYcHo=)AsGi78w@)KVdf6=t3G(7{6s^9sqLXZ1Ar9uPvQH0z z%k~d9(NuUY83g9~uViyOwsvvS1Hs;b-75K3 zywG)DL=y|YI*BzNPiRm$Zrl`y>Y_F;8rtlsu!Hs++36@Vj-Q(l+MaNOt)*e^r0oUX z8M2v69;kcdP&fA%If|`4h1PF}T#O-(7a!>7uAyg{fCJy$&pD$4W4{xZZJATP9AZEI zggxRr^ThfjP9wy~*(Vp88+@hp)tg78Zj$q4*N zq59pMH*6cY>ZsY%9tRiGdwyA#O4zCAY19j;d@W4v9X?~-#!PcebUCuV(FjH%xL0$5 zidC`UcW8WmQ@8ng<;Gcdm7aOaSrx?1JI`_yM-oZnkm#VgP~Rd@!rhFLoU*XB!bVlU z1HOmXTprfiisUeU*hqMB!r#WmG2tr1%u$rg`GF38H3C-+|&b-!c z3STKa5>zpvG)Id_M>i>;yaw)Bu2uj#JN-3uR_%Q^{EQbDEd6J!%P$=i4_SW4ixmAp zTKM_-B{X7L9Dw)yr0FI{qhcpqE1cG&m26-q2$X*J618);tW&olEmdBkYpHPTE;SNQ zY}cVpz)W5ESFa$UrAL zX~4*`C9nHyf+f-uLPZQaQ1Tf|c483$pl9AUJz`7f#)Y7?t6J&zFqI!yW?pa6k zG%IK^0Vnma$o4coT(0fhfPGz2L_Yy*=P7vsb2N3n_RI;Z@((N(b`?)nUjOafwXtEKojP5mbbeKp zSvoIX>F0?XKbymD;)s5UP~KEAdGeTX9=S6zAqNz@V8SNG!&2D=!FB&@P(y{4$c!z; zV{y>I4ckzDE}nOv8-~D~*khu?JCG20-A2Y08hl;qCtbuO?5Zs(+um*EHl&7bBYx0DWhC6sE+z2^6updn!P7 zIb^PTt_2k&^cZG=7_!u`csbi0xJu4vi%q4 zCNMR;XjQh`@4wovv9@McK?uBZE7n)6S5#XKb1vM3GM`^P(0n3Z_yapcd85DHH<#lG`$EFXrIA-nnV zA(470gLt91JYey26_9{sG=q-)r=`!<;2fWt?CPjd2Xo6Awc^RlPCL(0(IvA}FQN>? zL>^J9e{ia=l0=trC17=6i_N)K!fkII{Laf&{W1KuZi!!e_67ddx!fxGeQK( z4c?-GZBUq_O);|2PyDta*&uQnMnD;xwKyx^q_#rM-xt zmU{~q&wtlbZBlymtS8Cv^=OtPJJwjIu|qXriH3QD`bj8%2RaVsBQ7!nX@?_`E-_7; z(>g?7y%FC)xNrE^b-5x5f4fRoi{M=}rUM4#jmtVOgHXUR^#U$Fv9<6S4ZV)+h~}3{ zQOSG3qmRP+oX?5srCgD>LcqL*hCaCgxj)?XW>f;SsuBjTR=pJIh1(ScmH1i`Nk9n^ zPRM#lrLibG+o{6^&2tZShpha|&zC6Qz1PXCAzYhYLCWVcbv=-nD*=?iGzOIA_(AvC z@1bd81fz^`h%4aGl;~i3@jRN7tbKVXGjJ=*)Hj9=LfHAEy0;uE}W3fwPDl zg){NYn5Hjgy;6~#>QbB2;Z(46eNZCXf=}iIOo8z^eOBkPHH?-osGy zKxbM|1DszBD5Rk$EVh9Iw0xdf(r&2}7g+2Jl?VM6_dfuCuC%`EZ>Zm0vc9{t{TiG- z+IhpCLMF#p;OE(K=Sk42Tt92$lp4ihR4z1;Yu=}GU?Zr5n9H?U-MzPwsL3m69Q<2= zgoM?~<~D7XBPrHlY?-e=#z-d#pFta1CORYC64|_-n*7h*wCj}I;nbuxCz938OVDe? zE?hxd=(c`5%CVgHa0gju0iX?R--ymdOus4^PrZy!Iz1@tg(#9h&#y970s7M)`LMY) zt)tF|PEWfa=cm31maSkRgFWgI&1LWLU=QazS?s&oHGomhR7=F*`H$y2QNRS;$C7c` z{Bo>#o!`dTA!*>NJ@!_e(l|tWr)a;O3Rn8ms+65HSR~KqyP{-$MMm@zTfRnHTfJLF z5u;kws!rpc9(iexPm0+H4$ZQ*9W-qtal`n56t}9i&m5s-HM6tNpq&WcXwo0UNmpu~ z<%wgqtnm&2^x??@#d<);jh3{Y!ve0KoVx`@mt+5UejCY;KtBt~yDS2=_I9zGK*CV5 zw=q9fzvIYySF0F+{UUD5hmro~kJ^8`(JmjE9hKq;@nf zI#HgcW#67h_I9^#$39Wn-8Jx>fw{eO`SvpT@*jY9ZXlDoaCB(CI0Z=%c_+psA8B*a z!#TUdsS^PQ(huaa{>~k$lS0@Vk`gJd9WoV+EqD|AqZ;2JH#PN`Y`vy@)JO7g*sGkl znd1D2_Nx?RR6ZedvPL1Iua!|&Ew%+7+5Y0*^Dr(ExIYO|lvuTU|MmmUk={2{DL->B zoDLYDT#)1&scR8tASKLV2$Org^#cVB7?vpMjMWGWY0h%`pDSl{lrBVzU2U1h5x8jD3xAl^jb4&{f#0)6b( z&DkJSIb2GowWF^RHuU5dZTUIox3Ar0&ERY0?b(|z!G!l2q}UNvApjMaeW|4=`OK(M zlqE36%o`XXUG~;xknVFTh|7Pd>tMKL<>ogp0vEAgMOJ{WO;L!M55Ac9ZQEWqM&QS{mfeLWHdP=@L`vyMIc|#)_ zy-cY;wB+Vx<)3%4ooJLU7902(mgtR&WId}iefL-Bh|?M=UEL3dUl-THj`1# z3RCzK(KS!DLtd4N=aFYYN8Wjf<-OWgWf##ibBNE|VerZo*N#?qTmZCdSmCwMejRsw5kaj&Ox3!(#IGNHB7PEcNb6>{MZkUYC9F4G4%~7myhI93Vq)YzoShQ zx~(iwXNtfRx^tb^xfqIOb;`&!`rs{tj!yUR@BqG{D|Hp$>9;4aZ7<1SPlqCdY9&1~ zk9W1#6INmY7iFZ&4VknVS)==$3!MA49oTCu-P-!BDzNy9C(K|;G;3?Sy{g5+lBfkL zG%7~U5KPqFWLQ{_1T@TtOBK@RTQ0BoI8bXX{hO<2wC|mMyDwxOE zB{0}cV!YTxOf?GYcBHKv?#sgA|F+e2e+ztly@v=|oIIS!Sy;98h8WG)!N)B~na8u; zziiUnAWRvaw{E7jKGf3aF>_f#;}v;Oq%T#aP-66koY9kh-vpq~$q8B{$eG+fh||#u>b7RXUb=yfPGFnD9As#R6rq_t zu&J_|ZxHXWq&|Ur-zZ^rRHE555h@mvqajlT2ADTT=O@>-d?J=n=)yciP{v@wsi&`% zav+7l=`L&2^T%Bmuj=tu;83M;>EqvFbb`3k>pO|#6S(8Sw^F;!oj5zGq)8ARbL)}C zklM^(W8NIpzXqIr8P1pq_HOb2w$ekzXC9?>IqV23ld!~QyXOTam@+HA{o3r9<1QF2avNZM{%V83=>`Q| zSt~Xl8ZL8Qbxivp{%aRr`iI)_8Z-H-MNBi|Te@v$H$meB1O0@9f$kazYeu&oQt*rT zMR8K#yG+QvZ@Xe6S8mT$fI{Eb(w%3GpEJsixph&PNKdjF6Larwb_r(7H@(GwUiml) z%|iqp4OcXjT3&ha4b1uld=#r*3vL##4V=@>CNIrtSfSTmnL*#7-p}az-oXV~z83%e zU8*TqAd7`})@5eYVIy$l>*OmqnX|Rq12guUz)mOAD(``cAU!k$x+DhJq6hNF7qowU z%W7(9sDHDWE);6F`X2tSWP6MKo#fjVCRlnD)QxARU6O+22LT-DbgAS<1;G<({|P#l z<->6qOT>p_MZmML#mE%uaoz4wQ^csy7NxJrmGg&LA+Hb(a<53n%p;~3#oEyppGt{Z z2_HCZUF0Cy>56mVJY4gc^Sy+~<<0n#UJ!r=lQ2ZPlj*+Xwd_)de z6XShwA<2YG7E9e6&YphbjvWVVIVoY@=yQ8l(98EDbrH?E5qc)~9|r*L;|D>%6Wcj-3g zVtJ1ugwq4#vr$CH>NjFA0Yb9cI4+@`sp;3RC5y!bc6mmEAO;9rr9&FKvS(((_4!70 z6A@OP>$pgB(shJ1eRJDy>4B=SCj&Y5i9`Mp|W9Okw?i=@c)RT(&P_;<&44=+I;3Ohe!4FxxPm^MS+ z9Po+71EI8pWq(-tCt#Ju%5gSe92;KEXrvUhV2B>Tvga!ExI~ai5zEygyz28 z$*p-v#sKN!FJSvhuXHek;;VfBr?uuTg4@z}Ic%qF%|Tam5e}yR_tlwN2Y~9K#t-G8 zx+v!ygLSd1J@RBz41Hc->^^|A?Cdh7(Vr~V9VCW7`^Bo#*)iXK_Q$atqRDy6_iZ$91mo%R?&}S`rik) zVL4$HdQ;ujFQwXMfXLTsJL&2bK4=zJ9-)>7ChuG>^>Ueq1{M+9;Defd4*%Ghd`x(3 z8_Ur3?-+3c{cY%xNz_nfkIfZ#+b4$}uO=|8Z8Y6bnk&q=7R1Z0)+<6^Fq0jv{U<~{ z5pOhPp6aHE1D!LkzHD}%2Dew1n=Yb$`X+e(ikE2?=fLF+#3aYKJ70=xjMeoks|N%p zLYAHEgvRk~r3prQ2Z1EcL6FwEQBFeG`&aSjMg97F8>hw!^Y#czxBANzys?Mb1463K zH~BLoh02L#nogVta**zs1rKD-d`g>!hU7ZDTL>#YlL95L!`+COcvYzlX z9Z}~m`az4^h@R*Zy^u{Xsawpt0gar8cAn51A&*C+5ZJXADZ7h9J>0(Gp+8%8A1DZ` z*Uf!&{5Dgc6k4z@lUx8)?%jGLXZ&1;B2FA1-t`78Q|7!%u9ecB&EDT~80Tm&7o8R^ zv*glr@i!lN>@eaVze=-eT>7;L1Bm$t6LzzRA~*Bywbnx(k4LN~%>QxLlUm>M#$KaC z_vn?KCu9f2W(c0Ld5(De@#62yHU-k5zg*DpaFz<*iPgGA|8@$9$*AmGcU}hommL}2 zttU#TtvUvcRGS$`R1h2- z_4E2*ZjtB)jyghaK=>qhX4I;{^x@-Mp6Rvz=fY;-eA(*)<@h+$KRH7%;f`ve zvai8Yvf`!uDYzmsjJ2hMn131Ak!I=>m+2x|;Ul|Ns*ZFVIZgNA4)`mFMttOy+N{8X z3J=MORZ^teRa8Dmf<%Z;s@Q6OU3)IFOPmg{xL)*|USi<5ZB8h|Xm8lZUsrT}zsSo3 zh_qzCmU0$Ygo@1E%3R|!bhN7EN6$Xq@XEIY$0>wB~v_@Rj-OykkJ`r}wt7=%a=KHEuUNG(E&` zD^2jZHh|5ZvL3&BM=G~J+%DfU>!|I;TV@Lq&D`d#{1X?JGCtUMd(&&g^$LF-c(E9U zj~fIm6+4|{|e&&;=tq4A_VsA4)x38&=B|95k_BF zR$@~`;=kc<+DL-iS103LD!LDl?f;zeW)P(}#ruADT5=O%`JwOv9WScwhwaR^gx=l0 z&Q9JcbXG9tL{8QWel(&PJ>czap?o+69-2&l$p2~}Fe&iX^3#`m!a2Hs+4i5zei*U! z^Ywww6Q={Qvdd$u)iFqtaOUFofJWyXlMi8aQ8}MPQx0L?rNrE$K}0K$MnBnF!D9#M zm;=6&e`Po+zR5+j#9ZoQ|K+zHQs>LV543E0^%cEfTTQxREtjQ%mq4?)S9Kw~#$Bz= zJP*ut30{sP9RuJSJ?z5N5=o@JarT@Iq8?X$?U0K4A2_1Z?v&>Jd(~%nG?F?OaGC#m z-Sg%9foUw?#-GbIzlCR4jJy9lx4S0~X;p5b`KZ2S_GnP~rt~OL;s4)PJ6hZ+Pda+D z%AQmqssHDSSEk7Ghx|2d)<>)UTGvR6V~oiesJ?1H=N;)=|; zC@IT|bcy-dN>P?~$K=yPr33v~=0|7M#YudAjhiF zS*A{I~;2Qf=A)FXXVS@RUf8;To|WQ!+P+WyW(!UQR0*8^AYXKPbjv zNmwhyV)9{+C_!wTzYyGE($j$|>}BxGIAivBoDc|Ca0kVGtYrlYd0%OH!l|T^?OA0* z!Dn9uR+ce{F>)lvRL-v&ukC;HVzQ23?_qbeOt}`J>pS5!0w2dtwDEOQ!HTBE{x*ityW;=Q)_f0#naaj3vnTd8@XdhB9!$Sx zxXSL+E2vk4vEhzXPw_S>{ez=>-uIUOfI!AtsK=I`C$b!2S6Z3|7a-=WvUhx448EzGzJ- z+ZozxgkX=#;~ya+x$goWt2v z4GOh>q35Z;X5!agXs&tNav!gWfwO&9s1g6B>a-EWPMG24|D=vhvV;E`)Pw2t4~T&D z4h8xi?+Tg8EC33b1roQfr{KE5GLASET{?Gn>}?R2J!vo+T;_<73)|+06(2KnR9o=Y z+tPD^_L0u_^)zs}>@Kz3y>s7p0=}+Jv!#hfM)Fgb;<%OhN7U+MlYM88g zt8wNSYa3yF3^%$!>K*BbnEEF%TGk=ayilzC7xst#ZwA;=UJc5a)NzHRDOrhq`5x3p3J@m!gA?d~ES2eV%+K5Uj_(URy6O z#l^mXk1Hjvk-J&&ati7#J^e#z5$QdDAa}9uPX|wvGY*F%(vf?Ie`Wj+ z=)Y0}+KE1rirf;i=2L!h$-WhJ7Mj4HUf=99`G-f{Au#qtkA&aYko<@AscZK+{*&I5 zNDr6wzehR3()WJxjCykD<+-Ad=IW&$EX#Y~UK2fMUsETNNcmuBaX%T#aDTq*uufvn zB%kxOxW`xrgO+>^f)!{w3q}@yTdI>rQyW}H{l!`IB+xe(W=D%_%pVH31a~U?iErr? zJDyyef*pPoM08HSo0|iYmm`#7)LmYyCw~0xqOPRZQ>y=oKd#AAZv#B?&I0e5Ctcr| zbC($-RV|QgTQ1K*amAhh7TvS)zX!O+T%!9^9j@x%T*mv6V)cJ<+S}=0gMG>dYEwAS zhP&VkOoIMHb*Hxf4o08iYp{V#yT7O|hI?Sj_d8e}Sp_Bs=bfWG~Y}`(WBN zVNw+PQ;9{xc-tfP?S_f-DD=nL8qEIK7dt9m!kFAd0OyOfI(zV+uwAxH#scD)p!o;> zSNP#6_R&nYbTHZPw$g%)eJ~AzC<%Hj`!*{lvKHT8$YX%%pzANC36gI#*VTUo*<}tV zOheQkhB)emUlxvJ{@&o;m5RM;Y_oY1Y<$1W>yjhMEb@SNM5XUGYXWze-dw#xYJ#PLBG7J}%vY*-OqJ-s{^oK@vp_V#^J(W&r3Zme~!4 z3sp~*$bjyZa zXLyKII7)+EXLIkPWcy9wy2!X{{@X^_Bhn#a7vJiDj4~}IQ*rEFA=C7QHB)_(0t1+| z6FtG5H#DBD1+eK@R3M|bewAk=;_UX_`g|LJJ_h}lknqH_ZbrfCjugT13;3BO7<~*y zo>7Fe8)5q&p}6yR`QLWjnGx{M`B@8VblP2`uG%#;Mp#QIwTBbw_aQSdKi=nOyYpk^ zsQ=bi?cm2OV*6o`Ow@s9pkm9g6M(h5~%<)Tw z(<}Gd0#HFZDXx#+QXMrjnIb2`JUY`fI&*LJS<33>mu1I9rf5=mI!we3Z>4j(M_N48Sy2gk7FE0}JP z;H8ns+U9lp;9CJ&XABqmTXxnB_zob!^mE0Fj-O| zS+j4ECA%vj*>^%S$d-LbD9dlC?(N=l@9)>W_jLZJ|IFt+=XpM#=Xt;H%$)Om=Y8j$ zcYjTRr&ZK*dT~#_s1c6mq|G_ID-bptA~(6MOIBM%ut)e5=yty^RUE>$k-`^RhyAL zwwBmGTKwf^CoTH|^-}oDn^#e{zB_WA882+6F*gQIGsNGg@?Ndb@>E^M!WXb6h z2Q8RfNq%oel(br}m~Xm%v(q_N7XNkJ&yMX|esDRZTK3DTYo40f&cp~4>dLKDfcJ=4 z!50L*ZqI%i)8qUu?Xk%vnXE~@0)@kGtk?000S^c!y~eHiWgZbdZwj*KYGnw~c?df$@&*dYSyRggXPsK=ioBMos zLCU2W6gv`O(<^J$|>VAJKQc&wh4Snqqi5bI+X?*go)Kx^x`vUY(a)Aha`6Zqu0S>$$Fi=yotaO-o?K zq91si72QaZ8Cd6c%4WvFCJPhE&rTiXri`VsXjrHDI;LJJG{e&M`!mkf%hg+KX4ZW) z#I0n(W=;$C=9*@k7a9LzOWbVubK$9X4{y`&Q&X=vq4P1CyJZo!#QXN7oWCsI5zx&R zb3t{>d4F==>I{y~HLEn$5t|yn` z$|L&zv=oHPanbiC6#_Lp44|Ty!Bjsd|7ocbOm!W(5SJs-7e{plH9QJnrT=-U5db|s z22=floQrF5(HBdFLJj}4R4A1vYWOXHn|=*b{gPafYmw;t(^3F5`wj?cz-ckyL^RO) zA+SmZ2G+?i zbSRIr3s2Gc-@s05Le4D~k07-sMu6_vd(7X{^0zr++-%>5;Ynepd4B|YfoBG<(p!nm z_Mp!I(fn6viuZQjDU!G-*kb&5T}$NOulc@9X>oOZU*gve(5^Rz<^E*m@Ooo-?oVbA z>y3AFe=>vWfw|j0T<#W|%usF6Z;DBq;MHk47H2wvGXJ<_aBeK4VwYXw)fwMqi<;eS z&wUY=DZ4|173wtK#dr^;ShyDqrs-^lbQA=xB8=Vyp9q|7cnnQd-@3@GG{UGksW|3oAbfVNP z0VTC>M#49iX`bdTt4sJu&NKPc&4VP9t2 z(V2ysWvo#Jm9HGW`2k+qrMN8F!|$@2e&dUeE>SHVK;&k{onXzr(?aV!Ze{Ts<&S|;;WOio0SnGyEvscs((5ItmA~>_X{p6n zM9K)XKDBTUfi^j38^>L&TS5qUOd7wIe@VNH5QvyGeu~11eO0pDcjA|}cv+*vZ3W(# zxRn>n2amLU9C6=?E!^XbCQOc?+JeU2d+B#|Xw!0`%#KcqyGBtn*vZRIq#~Na5+&T< zFzPs5VafL!&B78@+}|)KaZQCK-){s8OO$cnZ!qy$wO&t{RxcA31@V`1K6$CtdYM+} z;8sm$yyIaDU87!c;CYhW<$6Y`Mpbqe$3>l;ena2AD1j5rXU_aXNQzhs34O+dEdQ_m z|Ak{8JY68U1zCj8T5+^wmX&m`|?#!O*?Av=A`CF-l2bkj7{a4uAHV z2|Vg{i;<#IYw~>@1~7+%1wKrIzinx|EIMWfGWOqZd>d+fi!rCrrq1)`;C+s5JqaJ8 z$GuKWq08%wQ5p7Rv{r8lUj!yPa}Gn>r&&8<+UBHf*l*2d0MiKF5j^p)sC6lU z=3;in!E6zN^{sV?K(m|ig{l|eWlp20g}fS1EObJiBwhHgQi#cgt!)7En9a=2(YL=o z_K}H@ohQpA+W=SsFo64jJitdF1b7fA1w08f1%?1qfn($%t=*)ibKaJ@7pid*b$t?s-p* zpjM>DP$y7VQ;$-=2UCDyU?f-ytO~vZt_IK3@Y0;4xj|D)GfhiLD@JQd>q47H+f7G7 zCq-vN7eLoQHw%G4L?HH%2uM9-f}V^1FuetR2VCOk8O8Of~2?8@xRoXuR%{DB3?!o0`NCRZ1F#9$5^ReV%qquvpEZFs zo3(_smbIOAh|PfQG20WiGPZiQPBuK-G}{MuAiEK}1-m`_b@tor;p}nj&2R=d0)7xK z0at>bg!{w8;4$!C4lxc@4i}CDjwc)y9K9S%2wDUiVjn^Tp@*4^#EA}8HDT<83pO=Vg@o{G858?*Lx|~Nv9bDFfp-43ZX-)Y~HJi;Z1X~ zOFThgKsv+dCj41d#7Un3u(Z$EXabMJMe z=`hvaQ%lYAZx!TU@4J!R>W*6ITlT(lDM0;B)nmq6KJo3vjG;E6TY;FH&(!+(@X7SY z#>=E2CLY=COUeh+DEOT+^fu8epJ*;0w074oezya=6Ul&y)a)D z_0W3hEl;16tfpCws`bX*$e&lL!X?rvw9 z=4FI&4bswU$y91GrkGNQ=;}|)wT9qos(CnlrjcDe-i4ygFmq53p~Y2EpR<6aoK|fs zjf3g6rL&Hg+Gb1jz_F{nvK4)@h}#iE`713EduGkv#*1g0^&j-sEPYNV;aRTP8>1pL z%;WKL%7wZSIahRAN<+dnHAkOrUt|8Prq@cvc&nZ1lA+KKT6`^+AoH{&uHyV@ti_8AjB z3f{)&uzi|}aPwWQtS)otxBA3sHc74sm+e)mdLFc?zJYd5mz8eQd+R0Dzj@BNRqAZj zjC}j#bi!$Jt1y3I<$&`Klj?NMKI9}iRd*bo+&4u%Xt>CNTC0FMUoGW$7I|sWWXYo` zMw#BZwWf~C>I^r43*>fMy!?rHVuW*R>ioJ8QE@y&*X~M*w_x94g9eKpaWJ8odag@o z8!ee<2fcx&GsPb%W%=B7V!UhjE#u6Bs-N=0L0@MfM9 zRaF1B<|h%WW7!^cOu5XK(JQylE#wzRm!GO0xF&hcx@fq^|EgU~T{VHINbJ!ao|P5! z*r;%AoehdgvZ(Ls=O@%@m%n|I6uaQ3GG>o;Gs(^!&$}e29Tv)|UA9$7ziKBPd3*Dr zj4)N@Yty_3k6BTi&+Bts-F+xwcY+L4@%6-7w0T0<)A&N1abh0#4Rn+%tJ^}EJG&82 zv%B<&Cf=P+M_R#a+(q$0icrKxhVXlqHrgyB%dNvYbuO|Stu&tDX~@W96QREN6Xwzr z&JRig7q=>D?jo};Jur^4ZhaY~e}ZdcDqqMT1IZtIM4;%F=Gm5-mFKTYGd+j!0EUV( zs~oXF90hH5_N+n{JeD({7by_eop~J$x_ju|0HuK90SQf$qI{*>rB4uIjVJlSm8Av* zy~NJTx}{prb)G~gs#-Lbq2t1|;I|&NSo*m6^oi#M9`(O4y2(3@JT%b#QV868$Wrpk zIITbqUC;Y0)&P6cL3iJDzZ0ZwoBJD1iemh(9!2yZwnlAwpE#W?$*^6v6unuDyMo z2I4o%5ROGKjda$cNDQ}0dbKj&az>;~9l3vXAV82n6>!RR&vkSli>|ZzVoG>$UDyO_ zPSV~DyC%3M{ampWmD|{J8EU=Bpw`;MkHzBZEW(#&?|ZupuP<)Pcovk8TouH}*kCHn zd~!XS9xRztsuQo0{_k?N?YLbCfUKTK7>vlQT*VJ&eJ~nm!+W$vnC9dvdek5ASC?U& zQMPCca8jCun$^4x@k)Un-yVCly*MU|8r>LQHBH$JJzYv&8yLAaeuD`bmYkpr7I>U) z5hRe9tXKL;tPz=30Y+vf=OZ&SQ_JACnJLfYrZdy3DB-rrPY*=f9_T)k4>Pq*DUuqn zO{;{+O(z!!m1%Tnxn*>!zHiqTu3YIjePokPqR|-^{uVE=kgm^xt(JVhxwdSzs`}3d;(+fkYl%{zMXgv z=R5ndIluDx(uG*sP=)smqFtU(--zp=B;QcQ+exUTKD2&h6;hes{6G+SycxADxQJKA z3Fg;|X~q_}ftzv)8;{4IT^w@auUH(=snX0m#2YsjGpNx@Ti`J zowhYws{eM3sSKY0tR>JY?YMZsW9rLKZH&&{iy5jgjO(gVAIs&t+l@M2BeFrRQ+}=N EKR)7<6951J literal 0 HcmV?d00001 diff --git a/public/fonts/_aijTyevf54tkVDLy-dlnLO3LdcAZYWl9Si6vvxL-qU.woff b/public/fonts/_aijTyevf54tkVDLy-dlnLO3LdcAZYWl9Si6vvxL-qU.woff new file mode 100644 index 0000000000000000000000000000000000000000..8951646f79983a6eaed8d34e5e3c69b20dad6662 GIT binary patch literal 23196 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 S-dX3YgSL=e`i4v|>c0T&R%vqp literal 0 HcmV?d00001 diff --git a/public/images/explorer_icons.png b/public/images/explorer_icons.png deleted file mode 100644 index ed9d2fffb64a2e6e282b90e489d83fc4ddfac3cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5763 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 literal 0 HcmV?d00001 diff --git a/public/images/pet_store_api.png b/public/images/pet_store_api.png deleted file mode 100644 index f9f9cd4aeb35a108c4b2f1dddb59977d56c595d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 824 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 z 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 
- + \ No newline at end of file diff --git a/public/lib/loadSwaggerUI.js b/public/lib/loadSwaggerUI.js index 23b2f8e..ec05c09 100644 --- a/public/lib/loadSwaggerUI.js +++ b/public/lib/loadSwaggerUI.js @@ -4,8 +4,8 @@ /*global SwaggerUi, log, ApiKeyAuthorization, hljs, window, $ */ $(function() { $.getJSON('config.json', function(config) { - log(config); - loadSwaggerUi(config); + log(config); + loadSwaggerUi(config); }); var accessToken; diff --git a/public/lib/shred.bundle.js b/public/lib/shred.bundle.js deleted file mode 100644 index 74d0816..0000000 --- a/public/lib/shred.bundle.js +++ /dev/null @@ -1,2765 +0,0 @@ -var require = function (file, cwd) { - var resolved = require.resolve(file, cwd || '/'); - var mod = require.modules[resolved]; - if (!mod) throw new Error( - 'Failed to resolve module ' + file + ', tried ' + resolved - ); - var res = mod._cached ? mod._cached : mod(); - return res; -} - -require.paths = []; -require.modules = {}; -require.extensions = [".js",".coffee"]; - -require._core = { - 'assert': true, - 'events': true, - 'fs': true, - 'path': true, - 'vm': true -}; - -require.resolve = (function () { - return function (x, cwd) { - if (!cwd) cwd = '/'; - - if (require._core[x]) return x; - var path = require.modules.path(); - var y = cwd || '.'; - - if (x.match(/^(?:\.\.?\/|\/)/)) { - var m = loadAsFileSync(path.resolve(y, x)) - || loadAsDirectorySync(path.resolve(y, x)); - if (m) return m; - } - - var n = loadNodeModulesSync(x, y); - if (n) return n; - - throw new Error("Cannot find module '" + x + "'"); - - function loadAsFileSync (x) { - if (require.modules[x]) { - return x; - } - - for (var i = 0; i < require.extensions.length; i++) { - var ext = require.extensions[i]; - if (require.modules[x + ext]) return x + ext; - } - } - - function loadAsDirectorySync (x) { - x = x.replace(/\/+$/, ''); - var pkgfile = x + '/package.json'; - if (require.modules[pkgfile]) { - var pkg = require.modules[pkgfile](); - var b = pkg.browserify; - if (typeof b === 'object' && b.main) { - var m = loadAsFileSync(path.resolve(x, b.main)); - if (m) return m; - } - else if (typeof b === 'string') { - var m = loadAsFileSync(path.resolve(x, b)); - if (m) return m; - } - else if (pkg.main) { - var m = loadAsFileSync(path.resolve(x, pkg.main)); - if (m) return m; - } - } - - return loadAsFileSync(x + '/index'); - } - - function loadNodeModulesSync (x, start) { - var dirs = nodeModulesPathsSync(start); - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - var m = loadAsFileSync(dir + '/' + x); - if (m) return m; - var n = loadAsDirectorySync(dir + '/' + x); - if (n) return n; - } - - var m = loadAsFileSync(x); - if (m) return m; - } - - function nodeModulesPathsSync (start) { - var parts; - if (start === '/') parts = [ '' ]; - else parts = path.normalize(start).split('/'); - - var dirs = []; - for (var i = parts.length - 1; i >= 0; i--) { - if (parts[i] === 'node_modules') continue; - var dir = parts.slice(0, i + 1).join('/') + '/node_modules'; - dirs.push(dir); - } - - return dirs; - } - }; -})(); - -require.alias = function (from, to) { - var path = require.modules.path(); - var res = null; - try { - res = require.resolve(from + '/package.json', '/'); - } - catch (err) { - res = require.resolve(from, '/'); - } - var basedir = path.dirname(res); - - var keys = (Object.keys || function (obj) { - var res = []; - for (var key in obj) res.push(key) - return res; - })(require.modules); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (key.slice(0, basedir.length + 1) === basedir + '/') { - var f = key.slice(basedir.length); - require.modules[to + f] = require.modules[basedir + f]; - } - else if (key === basedir) { - require.modules[to] = require.modules[basedir]; - } - } -}; - -require.define = function (filename, fn) { - var dirname = require._core[filename] - ? '' - : require.modules.path().dirname(filename) - ; - - var require_ = function (file) { - return require(file, dirname) - }; - require_.resolve = function (name) { - return require.resolve(name, dirname); - }; - require_.modules = require.modules; - require_.define = require.define; - var module_ = { exports : {} }; - - require.modules[filename] = function () { - require.modules[filename]._cached = module_.exports; - fn.call( - module_.exports, - require_, - module_, - module_.exports, - dirname, - filename - ); - require.modules[filename]._cached = module_.exports; - return module_.exports; - }; -}; - -if (typeof process === 'undefined') process = {}; - -if (!process.nextTick) process.nextTick = (function () { - var queue = []; - var canPost = typeof window !== 'undefined' - && window.postMessage && window.addEventListener - ; - - if (canPost) { - window.addEventListener('message', function (ev) { - if (ev.source === window && ev.data === 'browserify-tick') { - ev.stopPropagation(); - if (queue.length > 0) { - var fn = queue.shift(); - fn(); - } - } - }, true); - } - - return function (fn) { - if (canPost) { - queue.push(fn); - window.postMessage('browserify-tick', '*'); - } - else setTimeout(fn, 0); - }; -})(); - -if (!process.title) process.title = 'browser'; - -if (!process.binding) process.binding = function (name) { - if (name === 'evals') return require('vm') - else throw new Error('No such module') -}; - -if (!process.cwd) process.cwd = function () { return '.' }; - -require.define("path", function (require, module, exports, __dirname, __filename) { - function filter (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - if (fn(xs[i], i, xs)) res.push(xs[i]); - } - return res; -} - -// resolves . and .. elements in a path array with directory names there -// must be no slashes, empty elements, or device names (c:\) in the array -// (so also no leading and trailing slashes - it does not distinguish -// relative and absolute paths) -function normalizeArray(parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length; i >= 0; i--) { - var last = parts[i]; - if (last == '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up--; up) { - parts.unshift('..'); - } - } - - return parts; -} - -// Regex to split a filename into [*, dir, basename, ext] -// posix version -var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; - -// path.resolve([from ...], to) -// posix version -exports.resolve = function() { -var resolvedPath = '', - resolvedAbsolute = false; - -for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { - var path = (i >= 0) - ? arguments[i] - : process.cwd(); - - // Skip empty and invalid entries - if (typeof path !== 'string' || !path) { - continue; - } - - resolvedPath = path + '/' + resolvedPath; - resolvedAbsolute = path.charAt(0) === '/'; -} - -// At this point the path should be resolved to a full absolute path, but -// handle relative paths to be safe (might happen when process.cwd() fails) - -// Normalize the path -resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; -}; - -// path.normalize(path) -// posix version -exports.normalize = function(path) { -var isAbsolute = path.charAt(0) === '/', - trailingSlash = path.slice(-1) === '/'; - -// Normalize the path -path = normalizeArray(filter(path.split('/'), function(p) { - return !!p; - }), !isAbsolute).join('/'); - - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - - return (isAbsolute ? '/' : '') + path; -}; - - -// posix version -exports.join = function() { - var paths = Array.prototype.slice.call(arguments, 0); - return exports.normalize(filter(paths, function(p, index) { - return p && typeof p === 'string'; - }).join('/')); -}; - - -exports.dirname = function(path) { - var dir = splitPathRe.exec(path)[1] || ''; - var isWindows = false; - if (!dir) { - // No dirname - return '.'; - } else if (dir.length === 1 || - (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { - // It is just a slash or a drive letter with a slash - return dir; - } else { - // It is a full dirname, strip trailing slash - return dir.substring(0, dir.length - 1); - } -}; - - -exports.basename = function(path, ext) { - var f = splitPathRe.exec(path)[2] || ''; - // TODO: make this comparison case-insensitive on windows? - if (ext && f.substr(-1 * ext.length) === ext) { - f = f.substr(0, f.length - ext.length); - } - return f; -}; - - -exports.extname = function(path) { - return splitPathRe.exec(path)[3] || ''; -}; - -}); - -require.define("/shred.js", function (require, module, exports, __dirname, __filename) { - // Shred is an HTTP client library intended to simplify the use of Node's -// built-in HTTP library. In particular, we wanted to make it easier to interact -// with HTTP-based APIs. -// -// See the [examples](./examples.html) for more details. - -// Ax is a nice logging library we wrote. You can use any logger, providing it -// has `info`, `warn`, `debug`, and `error` methods that take a string. -var Ax = require("ax") - , CookieJarLib = require( "cookiejar" ) - , CookieJar = CookieJarLib.CookieJar -; - -// Shred takes some options, including a logger and request defaults. - -var Shred = function(options) { - options = (options||{}); - this.agent = options.agent; - this.defaults = options.defaults||{}; - this.log = options.logger||(new Ax({ level: "info" })); - this._sharedCookieJar = new CookieJar(); - this.logCurl = options.logCurl || false; -}; - -// Most of the real work is done in the request and reponse classes. - -Shred.Request = require("./shred/request"); -Shred.Response = require("./shred/response"); - -// The `request` method kicks off a new request, instantiating a new `Request` -// object and passing along whatever default options we were given. - -Shred.prototype = { - request: function(options) { - options.logger = this.log; - options.logCurl = options.logCurl || this.logCurl; - options.cookieJar = ( 'cookieJar' in options ) ? options.cookieJar : this._sharedCookieJar; // let them set cookieJar = null - options.agent = options.agent || this.agent; - // fill in default options - for (var key in this.defaults) { - if (this.defaults.hasOwnProperty(key) && !options[key]) { - options[key] = this.defaults[key] - } - } - return new Shred.Request(options); - } -}; - -// Define a bunch of convenience methods so that you don't have to include -// a `method` property in your request options. - -"get put post delete".split(" ").forEach(function(method) { - Shred.prototype[method] = function(options) { - options.method = method; - return this.request(options); - }; -}); - - -module.exports = Shred; - -}); - -require.define("/node_modules/ax/package.json", function (require, module, exports, __dirname, __filename) { - module.exports = {"main":"./lib/ax.js"} -}); - -require.define("/node_modules/ax/lib/ax.js", function (require, module, exports, __dirname, __filename) { - var inspect = require("util").inspect - , fs = require("fs") -; - - -// this is a quick-and-dirty logger. there are other nicer loggers out there -// but the ones i found were also somewhat involved. this one has a Ruby -// logger type interface -// -// we can easily replace this, provide the info, debug, etc. methods are the -// same. or, we can change Haiku to use a more standard node.js interface - -var format = function(level,message) { - var debug = (level=="debug"||level=="error"); - if (!message) { return message.toString(); } - if (typeof(message) == "object") { - if (message instanceof Error && debug) { - return message.stack; - } else { - return inspect(message); - } - } else { - return message.toString(); - } -}; - -var noOp = function(message) { return this; } -var makeLogger = function(level,fn) { - return function(message) { - this.stream.write(this.format(level, message)+"\n"); - return this; - } -}; - -var Logger = function(options) { - var logger = this; - var options = options||{}; - - // Default options - options.level = options.level || "info"; - options.timestamp = options.timestamp || true; - options.prefix = options.prefix || ""; - logger.options = options; - - // Allows a prefix to be added to the message. - // - // var logger = new Ax({ module: 'Haiku' }) - // logger.warn('this is going to be awesome!'); - // //=> Haiku: this is going to be awesome! - // - if (logger.options.module){ - logger.options.prefix = logger.options.module; - } - - // Write to stderr or a file - if (logger.options.file){ - logger.stream = fs.createWriteStream(logger.options.file, {"flags": "a"}); - } else { - if(process.title === "node") - logger.stream = process.stderr; - else if(process.title === "browser") - logger.stream = function () { - // Work around weird console context issue: http://code.google.com/p/chromium/issues/detail?id=48662 - return console[logger.options.level].apply(console, arguments); - }; - } - - switch(logger.options.level){ - case 'debug': - ['debug', 'info', 'warn'].forEach(function (level) { - logger[level] = Logger.writer(level); - }); - case 'info': - ['info', 'warn'].forEach(function (level) { - logger[level] = Logger.writer(level); - }); - case 'warn': - logger.warn = Logger.writer('warn'); - } -} - -// Used to define logger methods -Logger.writer = function(level){ - return function(message){ - var logger = this; - - if(process.title === "node") - logger.stream.write(logger.format(level, message) + '\n'); - else if(process.title === "browser") - logger.stream(logger.format(level, message) + '\n'); - - }; -} - - -Logger.prototype = { - info: function(){}, - debug: function(){}, - warn: function(){}, - error: Logger.writer('error'), - format: function(level, message){ - if (! message) return ''; - - var logger = this - , prefix = logger.options.prefix - , timestamp = logger.options.timestamp ? " " + (new Date().toISOString()) : "" - ; - - return (prefix + timestamp + ": " + message); - } -}; - -module.exports = Logger; - -}); - -require.define("util", function (require, module, exports, __dirname, __filename) { - // todo - -}); - -require.define("fs", function (require, module, exports, __dirname, __filename) { - // nothing to see here... no file methods for the browser - -}); - -require.define("/node_modules/cookiejar/package.json", function (require, module, exports, __dirname, __filename) { - module.exports = {"main":"cookiejar.js"} -}); - -require.define("/node_modules/cookiejar/cookiejar.js", function (require, module, exports, __dirname, __filename) { - exports.CookieAccessInfo=CookieAccessInfo=function CookieAccessInfo(domain,path,secure,script) { - if(this instanceof CookieAccessInfo) { - this.domain=domain||undefined; - this.path=path||"/"; - this.secure=!!secure; - this.script=!!script; - return this; - } - else { - return new CookieAccessInfo(domain,path,secure,script) - } -} - -exports.Cookie=Cookie=function Cookie(cookiestr) { - if(cookiestr instanceof Cookie) { - return cookiestr; - } - else { - if(this instanceof Cookie) { - this.name = null; - this.value = null; - this.expiration_date = Infinity; - this.path = "/"; - this.domain = null; - this.secure = false; //how to define? - this.noscript = false; //httponly - if(cookiestr) { - this.parse(cookiestr) - } - return this; - } - return new Cookie(cookiestr) - } -} - -Cookie.prototype.toString = function toString() { - var str=[this.name+"="+this.value]; - if(this.expiration_date !== Infinity) { - str.push("expires="+(new Date(this.expiration_date)).toGMTString()); - } - if(this.domain) { - str.push("domain="+this.domain); - } - if(this.path) { - str.push("path="+this.path); - } - if(this.secure) { - str.push("secure"); - } - if(this.noscript) { - str.push("httponly"); - } - return str.join("; "); -} - -Cookie.prototype.toValueString = function toValueString() { - return this.name+"="+this.value; -} - -var cookie_str_splitter=/[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g -Cookie.prototype.parse = function parse(str) { - if(this instanceof Cookie) { - var parts=str.split(";") - , pair=parts[0].match(/([^=]+)=((?:.|\n)*)/) - , key=pair[1] - , value=pair[2]; - this.name = key; - this.value = value; - - for(var i=1;i ", request.method.toUpperCase(), - request.url].join(" ") - return [ summary, "- Headers:", headers].join("\n"); -}; - -Request.prototype.format_headers = function () { - var array = [] - var headers = this._headers - for (var key in headers) { - if (headers.hasOwnProperty(key)) { - var value = headers[key] - array.push("\t" + key + ": " + value); - } - } - return array.join("\n"); -}; - -// Allow chainable 'on's: shred.get({ ... }).on( ... ). You can pass in a -// single function, a pair (event, function), or a hash: -// { event: function, event: function } -Request.prototype.on = function (eventOrHash, listener) { - var emitter = this.emitter; - // Pass in a single argument as a function then make it the default response handler - if (arguments.length === 1 && typeof(eventOrHash) === 'function') { - emitter.on('response', eventOrHash); - } else if (arguments.length === 1 && typeof(eventOrHash) === 'object') { - for (var key in eventOrHash) { - if (eventOrHash.hasOwnProperty(key)) { - emitter.on(key, eventOrHash[key]); - } - } - } else { - emitter.on(eventOrHash, listener); - } - return this; -}; - -// Add in the header methods. Again, these ensure we don't get the same header -// multiple times with different case conventions. -HeaderMixins.gettersAndSetters(Request); - -// `processOptions` is called from the constructor to handle all the work -// associated with making sure we do our best to ensure we have a valid request. - -var processOptions = function(request,options) { - - request.log.debug("Processing request options .."); - - // We'll use `request.emitter` to manage the `on` event handlers. - request.emitter = (new Emitter); - - request.agent = options.agent; - - // Set up the handlers ... - if (options.on) { - for (var key in options.on) { - if (options.on.hasOwnProperty(key)) { - request.emitter.on(key, options.on[key]); - } - } - } - - // Make sure we were give a URL or a host - if (!options.url && !options.host) { - request.emitter.emit("request_error", - new Error("No url or url options (host, port, etc.)")); - return; - } - - // Allow for the [use of a proxy](http://www.jmarshall.com/easy/http/#proxies). - - if (options.url) { - if (options.proxy) { - request.url = options.proxy; - request.path = options.url; - } else { - request.url = options.url; - } - } - - // Set the remaining options. - request.query = options.query||options.parameters||request.query ; - request.method = options.method; - request.setHeader("user-agent",options.agent||"Shred"); - request.setHeaders(options.headers); - - if (request.cookieJar) { - var cookies = request.cookieJar.getCookies( CookieAccessInfo( request.host, request.path ) ); - if (cookies.length) { - var cookieString = request.getHeader('cookie')||''; - for (var cookieIndex = 0; cookieIndex < cookies.length; ++cookieIndex) { - if ( cookieString.length && cookieString[ cookieString.length - 1 ] != ';' ) - { - cookieString += ';'; - } - cookieString += cookies[ cookieIndex ].name + '=' + cookies[ cookieIndex ].value + ';'; - } - request.setHeader("cookie", cookieString); - } - } - - // The content entity can be set either using the `body` or `content` attributes. - if (options.body||options.content) { - request.content = options.body||options.content; - } - request.timeout = options.timeout; - -}; - -// `createRequest` is also called by the constructor, after `processOptions`. -// This actually makes the request and processes the response, so `createRequest` -// is a bit of a misnomer. - -var createRequest = function(request) { - var timeout ; - - request.log.debug("Creating request .."); - request.log.debug(request); - - var reqParams = { - host: request.host, - port: request.port, - method: request.method, - path: request.path + (request.query ? '?'+request.query : ""), - headers: request.getHeaders(), - // Node's HTTP/S modules will ignore this, but we are using the - // browserify-http module in the browser for both HTTP and HTTPS, and this - // is how you differentiate the two. - scheme: request.scheme, - // Use a provided agent. 'Undefined' is the default, which uses a global - // agent. - agent: request.agent - }; - - if (request.logCurl) { - logCurl(request); - } - - var http = request.scheme == "http" ? HTTP : HTTPS; - - // Set up the real request using the selected library. The request won't be - // sent until we call `.end()`. - request._raw = http.request(reqParams, function(response) { - request.log.debug("Received response .."); - - // We haven't timed out and we have a response, so make sure we clear the - // timeout so it doesn't fire while we're processing the response. - clearTimeout(timeout); - - // Construct a Shred `Response` object from the response. This will stream - // the response, thus the need for the callback. We can access the response - // entity safely once we're in the callback. - response = new Response(response, request, function(response) { - - // Set up some event magic. The precedence is given first to - // status-specific handlers, then to responses for a given event, and then - // finally to the more general `response` handler. In the last case, we - // need to first make sure we're not dealing with a a redirect. - var emit = function(event) { - var emitter = request.emitter; - var textStatus = STATUS_CODES[response.status] ? STATUS_CODES[response.status].toLowerCase() : null; - if (emitter.listeners(response.status).length > 0 || emitter.listeners(textStatus).length > 0) { - emitter.emit(response.status, response); - emitter.emit(textStatus, response); - } else { - if (emitter.listeners(event).length>0) { - emitter.emit(event, response); - } else if (!response.isRedirect) { - emitter.emit("response", response); - //console.warn("Request has no event listener for status code " + response.status); - } - } - }; - - // Next, check for a redirect. We simply repeat the request with the URL - // given in the `Location` header. We fire a `redirect` event. - if (response.isRedirect) { - request.log.debug("Redirecting to " - + response.getHeader("Location")); - request.url = response.getHeader("Location"); - emit("redirect"); - createRequest(request); - - // Okay, it's not a redirect. Is it an error of some kind? - } else if (response.isError) { - emit("error"); - } else { - // It looks like we're good shape. Trigger the `success` event. - emit("success"); - } - }); - }); - - // We're still setting up the request. Next, we're going to handle error cases - // where we have no response. We don't emit an error event because that event - // takes a response. We don't response handlers to have to check for a null - // value. However, we [should introduce a different event - // type](https://github.com/spire-io/shred/issues/3) for this type of error. - request._raw.on("error", function(error) { - request.emitter.emit("request_error", error); - }); - - request._raw.on("socket", function(socket) { - request.emitter.emit("socket", socket); - }); - - // TCP timeouts should also trigger the "response_error" event. - request._raw.on('socket', function () { - request._raw.socket.on('timeout', function () { - // This should trigger the "error" event on the raw request, which will - // trigger the "response_error" on the shred request. - request._raw.abort(); - }); - }); - - - // We're almost there. Next, we need to write the request entity to the - // underlying request object. - if (request.content) { - request.log.debug("Streaming body: '" + - request.content.data.slice(0,59) + "' ... "); - request._raw.write(request.content.data); - } - - // Finally, we need to set up the timeout. We do this last so that we don't - // start the clock ticking until the last possible moment. - if (request.timeout) { - timeout = setTimeout(function() { - request.log.debug("Timeout fired, aborting request ..."); - request._raw.abort(); - request.emitter.emit("timeout", request); - },request.timeout); - } - - // The `.end()` method will cause the request to fire. Technically, it might - // have already sent the headers and body. - request.log.debug("Sending request ..."); - request._raw.end(); -}; - -// Logs the curl command for the request. -var logCurl = function (req) { - var headers = req.getHeaders(); - var headerString = ""; - - for (var key in headers) { - headerString += '-H "' + key + ": " + headers[key] + '" '; - } - - var bodyString = "" - - if (req.content) { - bodyString += "-d '" + req.content.body + "' "; - } - - var query = req.query ? '?' + req.query : ""; - - console.log("curl " + - "-X " + req.method.toUpperCase() + " " + - req.scheme + "://" + req.host + ":" + req.port + req.path + query + " " + - headerString + - bodyString - ); -}; - - -module.exports = Request; - -}); - -require.define("http", function (require, module, exports, __dirname, __filename) { - // todo - -}); - -require.define("https", function (require, module, exports, __dirname, __filename) { - // todo - -}); - -require.define("/shred/parseUri.js", function (require, module, exports, __dirname, __filename) { - // parseUri 1.2.2 -// (c) Steven Levithan -// MIT License - -function parseUri (str) { - var o = parseUri.options, - m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), - uri = {}, - i = 14; - - while (i--) uri[o.key[i]] = m[i] || ""; - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; -}; - -parseUri.options = { - strictMode: false, - key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], - q: { - name: "queryKey", - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } -}; - -module.exports = parseUri; - -}); - -require.define("events", function (require, module, exports, __dirname, __filename) { - if (!process.EventEmitter) process.EventEmitter = function () {}; - -var EventEmitter = exports.EventEmitter = process.EventEmitter; -var isArray = typeof Array.isArray === 'function' - ? Array.isArray - : function (xs) { - return Object.toString.call(xs) === '[object Array]' - } -; - -// By default EventEmitters will print a warning if more than -// 10 listeners are added to it. This is a useful default which -// helps finding memory leaks. -// -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -var defaultMaxListeners = 10; -EventEmitter.prototype.setMaxListeners = function(n) { - if (!this._events) this._events = {}; - this._events.maxListeners = n; -}; - - -EventEmitter.prototype.emit = function(type) { - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events || !this._events.error || - (isArray(this._events.error) && !this._events.error.length)) - { - if (arguments[1] instanceof Error) { - throw arguments[1]; // Unhandled 'error' event - } else { - throw new Error("Uncaught, unspecified 'error' event."); - } - return false; - } - } - - if (!this._events) return false; - var handler = this._events[type]; - if (!handler) return false; - - if (typeof handler == 'function') { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - var args = Array.prototype.slice.call(arguments, 1); - handler.apply(this, args); - } - return true; - - } else if (isArray(handler)) { - var args = Array.prototype.slice.call(arguments, 1); - - var listeners = handler.slice(); - for (var i = 0, l = listeners.length; i < l; i++) { - listeners[i].apply(this, args); - } - return true; - - } else { - return false; - } -}; - -// EventEmitter is defined in src/node_events.cc -// EventEmitter.prototype.emit() is also defined there. -EventEmitter.prototype.addListener = function(type, listener) { - if ('function' !== typeof listener) { - throw new Error('addListener only takes instances of Function'); - } - - if (!this._events) this._events = {}; - - // To avoid recursion in the case that type == "newListeners"! Before - // adding it to the listeners, first emit "newListeners". - this.emit('newListener', type, listener); - - if (!this._events[type]) { - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - } else if (isArray(this._events[type])) { - - // Check for listener leak - if (!this._events[type].warned) { - var m; - if (this._events.maxListeners !== undefined) { - m = this._events.maxListeners; - } else { - m = defaultMaxListeners; - } - - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - console.trace(); - } - } - - // If we've already got an array, just append. - this._events[type].push(listener); - } else { - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; - } - - return this; -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.once = function(type, listener) { - var self = this; - self.on(type, function g() { - self.removeListener(type, g); - listener.apply(this, arguments); - }); - - return this; -}; - -EventEmitter.prototype.removeListener = function(type, listener) { - if ('function' !== typeof listener) { - throw new Error('removeListener only takes instances of Function'); - } - - // does not use listeners(), so no side effect of creating _events[type] - if (!this._events || !this._events[type]) return this; - - var list = this._events[type]; - - if (isArray(list)) { - var i = list.indexOf(listener); - if (i < 0) return this; - list.splice(i, 1); - if (list.length == 0) - delete this._events[type]; - } else if (this._events[type] === listener) { - delete this._events[type]; - } - - return this; -}; - -EventEmitter.prototype.removeAllListeners = function(type) { - // does not use listeners(), so no side effect of creating _events[type] - if (type && this._events && this._events[type]) this._events[type] = null; - return this; -}; - -EventEmitter.prototype.listeners = function(type) { - if (!this._events) this._events = {}; - if (!this._events[type]) this._events[type] = []; - if (!isArray(this._events[type])) { - this._events[type] = [this._events[type]]; - } - return this._events[type]; -}; - -}); - -require.define("/node_modules/sprintf/package.json", function (require, module, exports, __dirname, __filename) { - module.exports = {"main":"./lib/sprintf"} -}); - -require.define("/node_modules/sprintf/lib/sprintf.js", function (require, module, exports, __dirname, __filename) { - /** -sprintf() for JavaScript 0.7-beta1 -http://www.diveintojavascript.com/projects/javascript-sprintf - -Copyright (c) Alexandru Marasteanu -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of sprintf() for JavaScript nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -Changelog: -2010.11.07 - 0.7-beta1-node - - converted it to a node.js compatible module - -2010.09.06 - 0.7-beta1 - - features: vsprintf, support for named placeholders - - enhancements: format cache, reduced global namespace pollution - -2010.05.22 - 0.6: - - reverted to 0.4 and fixed the bug regarding the sign of the number 0 - Note: - Thanks to Raphael Pigulla (http://www.n3rd.org/) - who warned me about a bug in 0.5, I discovered that the last update was - a regress. I appologize for that. - -2010.05.09 - 0.5: - - bug fix: 0 is now preceeded with a + sign - - bug fix: the sign was not at the right position on padded results (Kamal Abdali) - - switched from GPL to BSD license - -2007.10.21 - 0.4: - - unit test and patch (David Baird) - -2007.09.17 - 0.3: - - bug fix: no longer throws exception on empty paramenters (Hans Pufal) - -2007.09.11 - 0.2: - - feature: added argument swapping - -2007.04.03 - 0.1: - - initial release -**/ - -var sprintf = (function() { - function get_type(variable) { - return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); - } - function str_repeat(input, multiplier) { - for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} - return output.join(''); - } - - var str_format = function() { - if (!str_format.cache.hasOwnProperty(arguments[0])) { - str_format.cache[arguments[0]] = str_format.parse(arguments[0]); - } - return str_format.format.call(null, str_format.cache[arguments[0]], arguments); - }; - - str_format.format = function(parse_tree, argv) { - var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; - for (i = 0; i < tree_length; i++) { - node_type = get_type(parse_tree[i]); - if (node_type === 'string') { - output.push(parse_tree[i]); - } - else if (node_type === 'array') { - match = parse_tree[i]; // convenience purposes only - if (match[2]) { // keyword argument - arg = argv[cursor]; - for (k = 0; k < match[2].length; k++) { - if (!arg.hasOwnProperty(match[2][k])) { - throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); - } - arg = arg[match[2][k]]; - } - } - else if (match[1]) { // positional argument (explicit) - arg = argv[match[1]]; - } - else { // positional argument (implicit) - arg = argv[cursor++]; - } - - if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { - throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); - } - switch (match[8]) { - case 'b': arg = arg.toString(2); break; - case 'c': arg = String.fromCharCode(arg); break; - case 'd': arg = parseInt(arg, 10); break; - case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; - case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; - case 'o': arg = arg.toString(8); break; - case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; - case 'u': arg = Math.abs(arg); break; - case 'x': arg = arg.toString(16); break; - case 'X': arg = arg.toString(16).toUpperCase(); break; - } - arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); - pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; - pad_length = match[6] - String(arg).length; - pad = match[6] ? str_repeat(pad_character, pad_length) : ''; - output.push(match[5] ? arg + pad : pad + arg); - } - } - return output.join(''); - }; - - str_format.cache = {}; - - str_format.parse = function(fmt) { - var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; - while (_fmt) { - if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { - parse_tree.push(match[0]); - } - else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { - parse_tree.push('%'); - } - else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { - if (match[2]) { - arg_names |= 1; - var field_list = [], replacement_field = match[2], field_match = []; - if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { - if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else { - throw('[sprintf] huh?'); - } - } - } - else { - throw('[sprintf] huh?'); - } - match[2] = field_list; - } - else { - arg_names |= 2; - } - if (arg_names === 3) { - throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); - } - parse_tree.push(match); - } - else { - throw('[sprintf] huh?'); - } - _fmt = _fmt.substring(match[0].length); - } - return parse_tree; - }; - - return str_format; -})(); - -var vsprintf = function(fmt, argv) { - argv.unshift(fmt); - return sprintf.apply(null, argv); -}; - -exports.sprintf = sprintf; -exports.vsprintf = vsprintf; -}); - -require.define("/shred/response.js", function (require, module, exports, __dirname, __filename) { - // The `Response object` encapsulates a Node.js HTTP response. - -var Content = require("./content") - , HeaderMixins = require("./mixins/headers") - , CookieJarLib = require( "cookiejar" ) - , Cookie = CookieJarLib.Cookie -; - -// Browser doesn't have zlib. -var zlib = null; -try { - zlib = require('zlib'); -} catch (e) { - console.warn("no zlib library"); -} - -// Iconv doesn't work in browser -var Iconv = null; -try { - Iconv = require('iconv-lite'); -} catch (e) { - console.warn("no iconv library"); -} - -// Construct a `Response` object. You should never have to do this directly. The -// `Request` object handles this, getting the raw response object and passing it -// in here, along with the request. The callback allows us to stream the response -// and then use the callback to let the request know when it's ready. -var Response = function(raw, request, callback) { - var response = this; - this._raw = raw; - - // The `._setHeaders` method is "private"; you can't otherwise set headers on - // the response. - this._setHeaders.call(this,raw.headers); - - // store any cookies - if (request.cookieJar && this.getHeader('set-cookie')) { - var cookieStrings = this.getHeader('set-cookie'); - var cookieObjs = [] - , cookie; - - for (var i = 0; i < cookieStrings.length; i++) { - var cookieString = cookieStrings[i]; - if (!cookieString) { - continue; - } - - if (!cookieString.match(/domain\=/i)) { - cookieString += '; domain=' + request.host; - } - - if (!cookieString.match(/path\=/i)) { - cookieString += '; path=' + request.path; - } - - try { - cookie = new Cookie(cookieString); - if (cookie) { - cookieObjs.push(cookie); - } - } catch (e) { - console.warn("Tried to set bad cookie: " + cookieString); - } - } - - request.cookieJar.setCookies(cookieObjs); - } - - this.request = request; - this.client = request.client; - this.log = this.request.log; - - // Stream the response content entity and fire the callback when we're done. - // Store the incoming data in a array of Buffers which we concatinate into one - // buffer at the end. We need to use buffers instead of strings here in order - // to preserve binary data. - var chunkBuffers = []; - var dataLength = 0; - raw.on("data", function(chunk) { - chunkBuffers.push(chunk); - dataLength += chunk.length; - }); - raw.on("end", function() { - var body; - if (typeof Buffer === 'undefined') { - // Just concatinate into a string - body = chunkBuffers.join(''); - } else { - // Initialize new buffer and add the chunks one-at-a-time. - body = new Buffer(dataLength); - for (var i = 0, pos = 0; i < chunkBuffers.length; i++) { - chunkBuffers[i].copy(body, pos); - pos += chunkBuffers[i].length; - } - } - - var setBodyAndFinish = function (body) { - response._body = new Content({ - body: body, - type: response.getHeader("Content-Type") - }); - callback(response); - } - - if (zlib && response.getHeader("Content-Encoding") === 'gzip'){ - zlib.gunzip(body, function (err, gunzippedBody) { - if (Iconv && response.request.encoding){ - body = Iconv.fromEncoding(gunzippedBody,response.request.encoding); - } else { - body = gunzippedBody.toString(); - } - setBodyAndFinish(body); - }) - } - else{ - if (response.request.encoding){ - body = Iconv.fromEncoding(body,response.request.encoding); - } - setBodyAndFinish(body); - } - }); -}; - -// The `Response` object can be pretty overwhelming to view using the built-in -// Node.js inspect method. We want to make it a bit more manageable. This -// probably goes [too far in the other -// direction](https://github.com/spire-io/shred/issues/2). - -Response.prototype = { - inspect: function() { - var response = this; - var headers = this.format_headers(); - var summary = [" ", response.status].join(" ") - return [ summary, "- Headers:", headers].join("\n"); - }, - format_headers: function () { - var array = [] - var headers = this._headers - for (var key in headers) { - if (headers.hasOwnProperty(key)) { - var value = headers[key] - array.push("\t" + key + ": " + value); - } - } - return array.join("\n"); - } -}; - -// `Response` object properties, all of which are read-only: -Object.defineProperties(Response.prototype, { - -// - **status**. The HTTP status code for the response. - status: { - get: function() { return this._raw.statusCode; }, - enumerable: true - }, - -// - **content**. The HTTP content entity, if any. Provided as a [content -// object](./content.html), which will attempt to convert the entity based upon -// the `content-type` header. The converted value is available as -// `content.data`. The original raw content entity is available as -// `content.body`. - body: { - get: function() { return this._body; } - }, - content: { - get: function() { return this.body; }, - enumerable: true - }, - -// - **isRedirect**. Is the response a redirect? These are responses with 3xx -// status and a `Location` header. - isRedirect: { - get: function() { - return (this.status>299 - &&this.status<400 - &&this.getHeader("Location")); - }, - enumerable: true - }, - -// - **isError**. Is the response an error? These are responses with status of -// 400 or greater. - isError: { - get: function() { - return (this.status === 0 || this.status > 399) - }, - enumerable: true - } -}); - -// Add in the [getters for accessing the normalized headers](./headers.js). -HeaderMixins.getters(Response); -HeaderMixins.privateSetters(Response); - -// Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes -// getAllResponseHeaders() to return {} if the response is a CORS request. -// xhr.getHeader still works correctly. -var getHeader = Response.prototype.getHeader; -Response.prototype.getHeader = function (name) { - return (getHeader.call(this,name) || - (typeof this._raw.getHeader === 'function' && this._raw.getHeader(name))); -}; - -module.exports = Response; - -}); - -require.define("/shred/content.js", function (require, module, exports, __dirname, __filename) { - -// The purpose of the `Content` object is to abstract away the data conversions -// to and from raw content entities as strings. For example, you want to be able -// to pass in a Javascript object and have it be automatically converted into a -// JSON string if the `content-type` is set to a JSON-based media type. -// Conversely, you want to be able to transparently get back a Javascript object -// in the response if the `content-type` is a JSON-based media-type. - -// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5). - -// The `Content` constructor takes an options object, which *must* have either a -// `body` or `data` property and *may* have a `type` property indicating the -// media type. If there is no `type` attribute, a default will be inferred. -var Content = function(options) { - this.body = options.body; - this.data = options.data; - this.type = options.type; -}; - -Content.prototype = { - // Treat `toString()` as asking for the `content.body`. That is, the raw content entity. - // - // toString: function() { return this.body; } - // - // Commented out, but I've forgotten why. :/ -}; - - -// `Content` objects have the following attributes: -Object.defineProperties(Content.prototype,{ - -// - **type**. Typically accessed as `content.type`, reflects the `content-type` -// header associated with the request or response. If not passed as an options -// to the constructor or set explicitly, it will infer the type the `data` -// attribute, if possible, and, failing that, will default to `text/plain`. - type: { - get: function() { - if (this._type) { - return this._type; - } else { - if (this._data) { - switch(typeof this._data) { - case "string": return "text/plain"; - case "object": return "application/json"; - } - } - } - return "text/plain"; - }, - set: function(value) { - this._type = value; - return this; - }, - enumerable: true - }, - -// - **data**. Typically accessed as `content.data`, reflects the content entity -// converted into Javascript data. This can be a string, if the `type` is, say, -// `text/plain`, but can also be a Javascript object. The conversion applied is -// based on the `processor` attribute. The `data` attribute can also be set -// directly, in which case the conversion will be done the other way, to infer -// the `body` attribute. - data: { - get: function() { - if (this._body) { - return this.processor.parser(this._body); - } else { - return this._data; - } - }, - set: function(data) { - if (this._body&&data) Errors.setDataWithBody(this); - this._data = data; - return this; - }, - enumerable: true - }, - -// - **body**. Typically accessed as `content.body`, reflects the content entity -// as a UTF-8 string. It is the mirror of the `data` attribute. If you set the -// `data` attribute, the `body` attribute will be inferred and vice-versa. If -// you attempt to set both, an exception is raised. - body: { - get: function() { - if (this._data) { - return this.processor.stringify(this._data); - } else { - return this.processor.stringify(this._body); - } - }, - set: function(body) { - if (this._data&&body) Errors.setBodyWithData(this); - this._body = body; - return this; - }, - enumerable: true - }, - -// - **processor**. The functions that will be used to convert to/from `data` and -// `body` attributes. You can add processors. The two that are built-in are for -// `text/plain`, which is basically an identity transformation and -// `application/json` and other JSON-based media types (including custom media -// types with `+json`). You can add your own processors. See below. - processor: { - get: function() { - var processor = Content.processors[this.type]; - if (processor) { - return processor; - } else { - // Return the first processor that matches any part of the - // content type. ex: application/vnd.foobar.baz+json will match json. - var main = this.type.split(";")[0]; - var parts = main.split(/\+|\//); - for (var i=0, l=parts.length; i < l; i++) { - processor = Content.processors[parts[i]] - } - return processor || {parser:identity,stringify:toString}; - } - }, - enumerable: true - }, - -// - **length**. Typically accessed as `content.length`, returns the length in -// bytes of the raw content entity. - length: { - get: function() { - if (typeof Buffer !== 'undefined') { - return Buffer.byteLength(this.body); - } - return this.body.length; - } - } -}); - -Content.processors = {}; - -// The `registerProcessor` function allows you to add your own processors to -// convert content entities. Each processor consists of a Javascript object with -// two properties: -// - **parser**. The function used to parse a raw content entity and convert it -// into a Javascript data type. -// - **stringify**. The function used to convert a Javascript data type into a -// raw content entity. -Content.registerProcessor = function(types,processor) { - -// You can pass an array of types that will trigger this processor, or just one. -// We determine the array via duck-typing here. - if (types.forEach) { - types.forEach(function(type) { - Content.processors[type] = processor; - }); - } else { - // If you didn't pass an array, we just use what you pass in. - Content.processors[types] = processor; - } -}; - -// Register the identity processor, which is used for text-based media types. -var identity = function(x) { return x; } - , toString = function(x) { return x.toString(); } -Content.registerProcessor( - ["text/html","text/plain","text"], - { parser: identity, stringify: toString }); - -// Register the JSON processor, which is used for JSON-based media types. -Content.registerProcessor( - ["application/json; charset=utf-8","application/json","json"], - { - parser: function(string) { - return JSON.parse(string); - }, - stringify: function(data) { - return JSON.stringify(data); }}); - -// Error functions are defined separately here in an attempt to make the code -// easier to read. -var Errors = { - setDataWithBody: function(object) { - throw new Error("Attempt to set data attribute of a content object " + - "when the body attributes was already set."); - }, - setBodyWithData: function(object) { - throw new Error("Attempt to set body attribute of a content object " + - "when the data attributes was already set."); - } -} -module.exports = Content; - -}); - -require.define("/shred/mixins/headers.js", function (require, module, exports, __dirname, __filename) { - // The header mixins allow you to add HTTP header support to any object. This -// might seem pointless: why not simply use a hash? The main reason is that, per -// the [HTTP spec](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), -// headers are case-insensitive. So, for example, `content-type` is the same as -// `CONTENT-TYPE` which is the same as `Content-Type`. Since there is no way to -// overload the index operator in Javascript, using a hash to represent the -// headers means it's possible to have two conflicting values for a single -// header. -// -// The solution to this is to provide explicit methods to set or get headers. -// This also has the benefit of allowing us to introduce additional variations, -// including snake case, which we automatically convert to what Matthew King has -// dubbed "corset case" - the hyphen-separated names with initial caps: -// `Content-Type`. We use corset-case just in case we're dealing with servers -// that haven't properly implemented the spec. - -// Convert headers to corset-case. **Example:** `CONTENT-TYPE` will be converted -// to `Content-Type`. - -var corsetCase = function(string) { - return string.toLowerCase() - //.replace("_","-") - .replace(/(^|-)(\w)/g, - function(s) { return s.toUpperCase(); }); -}; - -// We suspect that `initializeHeaders` was once more complicated ... -var initializeHeaders = function(object) { - return {}; -}; - -// Access the `_headers` property using lazy initialization. **Warning:** If you -// mix this into an object that is using the `_headers` property already, you're -// going to have trouble. -var $H = function(object) { - return object._headers||(object._headers=initializeHeaders(object)); -}; - -// Hide the implementations as private functions, separate from how we expose them. - -// The "real" `getHeader` function: get the header after normalizing the name. -var getHeader = function(object,name) { - return $H(object)[corsetCase(name)]; -}; - -// The "real" `getHeader` function: get one or more headers, or all of them -// if you don't ask for any specifics. -var getHeaders = function(object,names) { - var keys = (names && names.length>0) ? names : Object.keys($H(object)); - var hash = keys.reduce(function(hash,key) { - hash[key] = getHeader(object,key); - return hash; - },{}); - // Freeze the resulting hash so you don't mistakenly think you're modifying - // the real headers. - Object.freeze(hash); - return hash; -}; - -// The "real" `setHeader` function: set a header, after normalizing the name. -var setHeader = function(object,name,value) { - $H(object)[corsetCase(name)] = value; - return object; -}; - -// The "real" `setHeaders` function: set multiple headers based on a hash. -var setHeaders = function(object,hash) { - for( var key in hash ) { setHeader(object,key,hash[key]); }; - return this; -}; - -// Here's where we actually bind the functionality to an object. These mixins work by -// exposing mixin functions. Each function mixes in a specific batch of features. -module.exports = { - - // Add getters. - getters: function(constructor) { - constructor.prototype.getHeader = function(name) { return getHeader(this,name); }; - constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); }; - }, - // Add setters but as "private" methods. - privateSetters: function(constructor) { - constructor.prototype._setHeader = function(key,value) { return setHeader(this,key,value); }; - constructor.prototype._setHeaders = function(hash) { return setHeaders(this,hash); }; - }, - // Add setters. - setters: function(constructor) { - constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); }; - constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); }; - }, - // Add both getters and setters. - gettersAndSetters: function(constructor) { - constructor.prototype.getHeader = function(name) { return getHeader(this,name); }; - constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); }; - constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); }; - constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); }; - }, -}; - -}); - -require.define("/node_modules/iconv-lite/package.json", function (require, module, exports, __dirname, __filename) { - module.exports = {} -}); - -require.define("/node_modules/iconv-lite/index.js", function (require, module, exports, __dirname, __filename) { - // Module exports -var iconv = module.exports = { - toEncoding: function(str, encoding) { - return iconv.getCodec(encoding).toEncoding(str); - }, - fromEncoding: function(buf, encoding) { - return iconv.getCodec(encoding).fromEncoding(buf); - }, - - defaultCharUnicode: '�', - defaultCharSingleByte: '?', - - // Get correct codec for given encoding. - getCodec: function(encoding) { - var enc = encoding || "utf8"; - var codecOptions = undefined; - while (1) { - if (getType(enc) === "String") - enc = enc.replace(/[- ]/g, "").toLowerCase(); - var codec = iconv.encodings[enc]; - var type = getType(codec); - if (type === "String") { - // Link to other encoding. - codecOptions = {originalEncoding: enc}; - enc = codec; - } - else if (type === "Object" && codec.type != undefined) { - // Options for other encoding. - codecOptions = codec; - enc = codec.type; - } - else if (type === "Function") - // Codec itself. - return codec(codecOptions); - else - throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')"); - } - }, - - // Define basic encodings - encodings: { - internal: function(options) { - return { - toEncoding: function(str) { - return new Buffer(ensureString(str), options.originalEncoding); - }, - fromEncoding: function(buf) { - return ensureBuffer(buf).toString(options.originalEncoding); - } - }; - }, - utf8: "internal", - ucs2: "internal", - binary: "internal", - ascii: "internal", - base64: "internal", - - // Codepage single-byte encodings. - singlebyte: function(options) { - // Prepare chars if needed - if (!options.chars || (options.chars.length !== 128 && options.chars.length !== 256)) - throw new Error("Encoding '"+options.type+"' has incorrect 'chars' (must be of len 128 or 256)"); - - if (options.chars.length === 128) - options.chars = asciiString + options.chars; - - if (!options.charsBuf) { - options.charsBuf = new Buffer(options.chars, 'ucs2'); - } - - if (!options.revCharsBuf) { - options.revCharsBuf = new Buffer(65536); - var defChar = iconv.defaultCharSingleByte.charCodeAt(0); - for (var i = 0; i < options.revCharsBuf.length; i++) - options.revCharsBuf[i] = defChar; - for (var i = 0; i < options.chars.length; i++) - options.revCharsBuf[options.chars.charCodeAt(i)] = i; - } - - return { - toEncoding: function(str) { - str = ensureString(str); - - var buf = new Buffer(str.length); - var revCharsBuf = options.revCharsBuf; - for (var i = 0; i < str.length; i++) - buf[i] = revCharsBuf[str.charCodeAt(i)]; - - return buf; - }, - fromEncoding: function(buf) { - buf = ensureBuffer(buf); - - // Strings are immutable in JS -> we use ucs2 buffer to speed up computations. - var charsBuf = options.charsBuf; - var newBuf = new Buffer(buf.length*2); - var idx1 = 0, idx2 = 0; - for (var i = 0, _len = buf.length; i < _len; i++) { - idx1 = buf[i]*2; idx2 = i*2; - newBuf[idx2] = charsBuf[idx1]; - newBuf[idx2+1] = charsBuf[idx1+1]; - } - return newBuf.toString('ucs2'); - } - }; - }, - - // Codepage double-byte encodings. - table: function(options) { - var table = options.table, key, revCharsTable = options.revCharsTable; - if (!table) { - throw new Error("Encoding '" + options.type +"' has incorect 'table' option"); - } - if(!revCharsTable) { - revCharsTable = options.revCharsTable = {}; - for (key in table) { - revCharsTable[table[key]] = parseInt(key); - } - } - - return { - toEncoding: function(str) { - str = ensureString(str); - var strLen = str.length; - var bufLen = strLen; - for (var i = 0; i < strLen; i++) - if (str.charCodeAt(i) >> 7) - bufLen++; - - var newBuf = new Buffer(bufLen), gbkcode, unicode, - defaultChar = revCharsTable[iconv.defaultCharUnicode.charCodeAt(0)]; - - for (var i = 0, j = 0; i < strLen; i++) { - unicode = str.charCodeAt(i); - if (unicode >> 7) { - gbkcode = revCharsTable[unicode] || defaultChar; - newBuf[j++] = gbkcode >> 8; //high byte; - newBuf[j++] = gbkcode & 0xFF; //low byte - } else {//ascii - newBuf[j++] = unicode; - } - } - return newBuf; - }, - fromEncoding: function(buf) { - buf = ensureBuffer(buf); - var bufLen = buf.length, strLen = 0; - for (var i = 0; i < bufLen; i++) { - strLen++; - if (buf[i] & 0x80) //the high bit is 1, so this byte is gbkcode's high byte.skip next byte - i++; - } - var newBuf = new Buffer(strLen*2), unicode, gbkcode, - defaultChar = iconv.defaultCharUnicode.charCodeAt(0); - - for (var i = 0, j = 0; i < bufLen; i++, j+=2) { - gbkcode = buf[i]; - if (gbkcode & 0x80) { - gbkcode = (gbkcode << 8) + buf[++i]; - unicode = table[gbkcode] || defaultChar; - } else { - unicode = gbkcode; - } - newBuf[j] = unicode & 0xFF; //low byte - newBuf[j+1] = unicode >> 8; //high byte - } - return newBuf.toString('ucs2'); - } - } - } - } -}; - -// Add aliases to convert functions -iconv.encode = iconv.toEncoding; -iconv.decode = iconv.fromEncoding; - -// Load other encodings from files in /encodings dir. -var encodingsDir = __dirname+"/encodings/", - fs = require('fs'); -fs.readdirSync(encodingsDir).forEach(function(file) { - if(fs.statSync(encodingsDir + file).isDirectory()) return; - var encodings = require(encodingsDir + file) - for (var key in encodings) - iconv.encodings[key] = encodings[key] -}); - -// Utilities -var asciiString = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'+ - ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f'; - -var ensureBuffer = function(buf) { - buf = buf || new Buffer(0); - return (buf instanceof Buffer) ? buf : new Buffer(buf.toString(), "utf8"); -} - -var ensureString = function(str) { - str = str || ""; - return (str instanceof String) ? str : str.toString((str instanceof Buffer) ? 'utf8' : undefined); -} - -var getType = function(obj) { - return Object.prototype.toString.call(obj).slice(8, -1); -} - - -}); - -require.define("/node_modules/http-browserify/package.json", function (require, module, exports, __dirname, __filename) { - module.exports = {"main":"index.js","browserify":"browser.js"} -}); - -require.define("/node_modules/http-browserify/browser.js", function (require, module, exports, __dirname, __filename) { - var http = module.exports; -var EventEmitter = require('events').EventEmitter; -var Request = require('./lib/request'); - -http.request = function (params, cb) { - if (!params) params = {}; - if (!params.host) params.host = window.location.host.split(':')[0]; - if (!params.port) params.port = window.location.port; - - var req = new Request(new xhrHttp, params); - if (cb) req.on('response', cb); - return req; -}; - -http.get = function (params, cb) { - params.method = 'GET'; - var req = http.request(params, cb); - req.end(); - return req; -}; - -var xhrHttp = (function () { - if (typeof window === 'undefined') { - throw new Error('no window object present'); - } - else if (window.XMLHttpRequest) { - return window.XMLHttpRequest; - } - else if (window.ActiveXObject) { - var axs = [ - 'Msxml2.XMLHTTP.6.0', - 'Msxml2.XMLHTTP.3.0', - 'Microsoft.XMLHTTP' - ]; - for (var i = 0; i < axs.length; i++) { - try { - var ax = new(window.ActiveXObject)(axs[i]); - return function () { - if (ax) { - var ax_ = ax; - ax = null; - return ax_; - } - else { - return new(window.ActiveXObject)(axs[i]); - } - }; - } - catch (e) {} - } - throw new Error('ajax not supported in this browser') - } - else { - throw new Error('ajax not supported in this browser'); - } -})(); - -http.STATUS_CODES = { - 100 : 'Continue', - 101 : 'Switching Protocols', - 102 : 'Processing', // RFC 2518, obsoleted by RFC 4918 - 200 : 'OK', - 201 : 'Created', - 202 : 'Accepted', - 203 : 'Non-Authoritative Information', - 204 : 'No Content', - 205 : 'Reset Content', - 206 : 'Partial Content', - 207 : 'Multi-Status', // RFC 4918 - 300 : 'Multiple Choices', - 301 : 'Moved Permanently', - 302 : 'Moved Temporarily', - 303 : 'See Other', - 304 : 'Not Modified', - 305 : 'Use Proxy', - 307 : 'Temporary Redirect', - 400 : 'Bad Request', - 401 : 'Unauthorized', - 402 : 'Payment Required', - 403 : 'Forbidden', - 404 : 'Not Found', - 405 : 'Method Not Allowed', - 406 : 'Not Acceptable', - 407 : 'Proxy Authentication Required', - 408 : 'Request Time-out', - 409 : 'Conflict', - 410 : 'Gone', - 411 : 'Length Required', - 412 : 'Precondition Failed', - 413 : 'Request Entity Too Large', - 414 : 'Request-URI Too Large', - 415 : 'Unsupported Media Type', - 416 : 'Requested Range Not Satisfiable', - 417 : 'Expectation Failed', - 418 : 'I\'m a teapot', // RFC 2324 - 422 : 'Unprocessable Entity', // RFC 4918 - 423 : 'Locked', // RFC 4918 - 424 : 'Failed Dependency', // RFC 4918 - 425 : 'Unordered Collection', // RFC 4918 - 426 : 'Upgrade Required', // RFC 2817 - 500 : 'Internal Server Error', - 501 : 'Not Implemented', - 502 : 'Bad Gateway', - 503 : 'Service Unavailable', - 504 : 'Gateway Time-out', - 505 : 'HTTP Version not supported', - 506 : 'Variant Also Negotiates', // RFC 2295 - 507 : 'Insufficient Storage', // RFC 4918 - 509 : 'Bandwidth Limit Exceeded', - 510 : 'Not Extended' // RFC 2774 -}; - -}); - -require.define("/node_modules/http-browserify/lib/request.js", function (require, module, exports, __dirname, __filename) { - var EventEmitter = require('events').EventEmitter; -var Response = require('./response'); -var isSafeHeader = require('./isSafeHeader'); - -var Request = module.exports = function (xhr, params) { - var self = this; - self.xhr = xhr; - self.body = ''; - - var uri = params.host + ':' + params.port + (params.path || '/'); - - xhr.open( - params.method || 'GET', - (params.scheme || 'http') + '://' + uri, - true - ); - - if (params.headers) { - Object.keys(params.headers).forEach(function (key) { - if (!isSafeHeader(key)) return; - var value = params.headers[key]; - if (Array.isArray(value)) { - value.forEach(function (v) { - xhr.setRequestHeader(key, v); - }); - } - else xhr.setRequestHeader(key, value) - }); - } - - var res = new Response(xhr); - res.on('ready', function () { - self.emit('response', res); - }); - - xhr.onreadystatechange = function () { - res.handle(xhr); - }; -}; - -Request.prototype = new EventEmitter; - -Request.prototype.setHeader = function (key, value) { - if ((Array.isArray && Array.isArray(value)) - || value instanceof Array) { - for (var i = 0; i < value.length; i++) { - this.xhr.setRequestHeader(key, value[i]); - } - } - else { - this.xhr.setRequestHeader(key, value); - } -}; - -Request.prototype.write = function (s) { - this.body += s; -}; - -Request.prototype.end = function (s) { - if (s !== undefined) this.write(s); - this.xhr.send(this.body); -}; - -}); - -require.define("/node_modules/http-browserify/lib/response.js", function (require, module, exports, __dirname, __filename) { - var EventEmitter = require('events').EventEmitter; -var isSafeHeader = require('./isSafeHeader'); - -var Response = module.exports = function (xhr) { - this.xhr = xhr; - this.offset = 0; -}; - -Response.prototype = new EventEmitter; - -var capable = { - streaming : true, - status2 : true -}; - -function parseHeaders (xhr) { - var lines = xhr.getAllResponseHeaders().split(/\r?\n/); - var headers = {}; - for (var i = 0; i < lines.length; i++) { - var line = lines[i]; - if (line === '') continue; - - var m = line.match(/^([^:]+):\s*(.*)/); - if (m) { - var key = m[1].toLowerCase(), value = m[2]; - - if (headers[key] !== undefined) { - if ((Array.isArray && Array.isArray(headers[key])) - || headers[key] instanceof Array) { - headers[key].push(value); - } - else { - headers[key] = [ headers[key], value ]; - } - } - else { - headers[key] = value; - } - } - else { - headers[line] = true; - } - } - return headers; -} - -Response.prototype.getHeader = function (key) { - var header = this.headers ? this.headers[key.toLowerCase()] : null; - if (header) return header; - - // Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes - // getAllResponseHeaders() to return {} if the response is a CORS request. - // xhr.getHeader still works correctly. - if (isSafeHeader(key)) { - return this.xhr.getResponseHeader(key); - } - return null; -}; - -Response.prototype.handle = function () { - var xhr = this.xhr; - if (xhr.readyState === 2 && capable.status2) { - try { - this.statusCode = xhr.status; - this.headers = parseHeaders(xhr); - } - catch (err) { - capable.status2 = false; - } - - if (capable.status2) { - this.emit('ready'); - } - } - else if (capable.streaming && xhr.readyState === 3) { - try { - if (!this.statusCode) { - this.statusCode = xhr.status; - this.headers = parseHeaders(xhr); - this.emit('ready'); - } - } - catch (err) {} - - try { - this.write(); - } - catch (err) { - capable.streaming = false; - } - } - else if (xhr.readyState === 4) { - if (!this.statusCode) { - this.statusCode = xhr.status; - this.emit('ready'); - } - this.write(); - - if (xhr.error) { - this.emit('error', xhr.responseText); - } - else this.emit('end'); - } -}; - -Response.prototype.write = function () { - var xhr = this.xhr; - if (xhr.responseText.length > this.offset) { - this.emit('data', xhr.responseText.slice(this.offset)); - this.offset = xhr.responseText.length; - } -}; - -}); - -require.define("/node_modules/http-browserify/lib/isSafeHeader.js", function (require, module, exports, __dirname, __filename) { - // Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html -var unsafeHeaders = [ - "accept-charset", - "accept-encoding", - "access-control-request-headers", - "access-control-request-method", - "connection", - "content-length", - "cookie", - "cookie2", - "content-transfer-encoding", - "date", - "expect", - "host", - "keep-alive", - "origin", - "referer", - "set-cookie", - "te", - "trailer", - "transfer-encoding", - "upgrade", - "user-agent", - "via" -]; - -module.exports = function (headerName) { - if (!headerName) return false; - return (unsafeHeaders.indexOf(headerName.toLowerCase()) === -1) -}; - -}); - -require.alias("http-browserify", "/node_modules/http"); - -require.alias("http-browserify", "/node_modules/https"); \ No newline at end of file diff --git a/public/lib/shred/content.js b/public/lib/shred/content.js deleted file mode 100644 index b8051fe..0000000 --- a/public/lib/shred/content.js +++ /dev/null @@ -1,193 +0,0 @@ - -// The purpose of the `Content` object is to abstract away the data conversions -// to and from raw content entities as strings. For example, you want to be able -// to pass in a Javascript object and have it be automatically converted into a -// JSON string if the `content-type` is set to a JSON-based media type. -// Conversely, you want to be able to transparently get back a Javascript object -// in the response if the `content-type` is a JSON-based media-type. - -// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5). - -// The `Content` constructor takes an options object, which *must* have either a -// `body` or `data` property and *may* have a `type` property indicating the -// media type. If there is no `type` attribute, a default will be inferred. -var Content = function(options) { - this.body = options.body; - this.data = options.data; - this.type = options.type; -}; - -Content.prototype = { - // Treat `toString()` as asking for the `content.body`. That is, the raw content entity. - // - // toString: function() { return this.body; } - // - // Commented out, but I've forgotten why. :/ -}; - - -// `Content` objects have the following attributes: -Object.defineProperties(Content.prototype,{ - -// - **type**. Typically accessed as `content.type`, reflects the `content-type` -// header associated with the request or response. If not passed as an options -// to the constructor or set explicitly, it will infer the type the `data` -// attribute, if possible, and, failing that, will default to `text/plain`. - type: { - get: function() { - if (this._type) { - return this._type; - } else { - if (this._data) { - switch(typeof this._data) { - case "string": return "text/plain"; - case "object": return "application/json"; - } - } - } - return "text/plain"; - }, - set: function(value) { - this._type = value; - return this; - }, - enumerable: true - }, - -// - **data**. Typically accessed as `content.data`, reflects the content entity -// converted into Javascript data. This can be a string, if the `type` is, say, -// `text/plain`, but can also be a Javascript object. The conversion applied is -// based on the `processor` attribute. The `data` attribute can also be set -// directly, in which case the conversion will be done the other way, to infer -// the `body` attribute. - data: { - get: function() { - if (this._body) { - return this.processor.parser(this._body); - } else { - return this._data; - } - }, - set: function(data) { - if (this._body&&data) Errors.setDataWithBody(this); - this._data = data; - return this; - }, - enumerable: true - }, - -// - **body**. Typically accessed as `content.body`, reflects the content entity -// as a UTF-8 string. It is the mirror of the `data` attribute. If you set the -// `data` attribute, the `body` attribute will be inferred and vice-versa. If -// you attempt to set both, an exception is raised. - body: { - get: function() { - if (this._data) { - return this.processor.stringify(this._data); - } else { - return this._body.toString(); - } - }, - set: function(body) { - if (this._data&&body) Errors.setBodyWithData(this); - this._body = body; - return this; - }, - enumerable: true - }, - -// - **processor**. The functions that will be used to convert to/from `data` and -// `body` attributes. You can add processors. The two that are built-in are for -// `text/plain`, which is basically an identity transformation and -// `application/json` and other JSON-based media types (including custom media -// types with `+json`). You can add your own processors. See below. - processor: { - get: function() { - var processor = Content.processors[this.type]; - if (processor) { - return processor; - } else { - // Return the first processor that matches any part of the - // content type. ex: application/vnd.foobar.baz+json will match json. - var main = this.type.split(";")[0]; - var parts = main.split(/\+|\//); - for (var i=0, l=parts.length; i < l; i++) { - processor = Content.processors[parts[i]] - } - return processor || {parser:identity,stringify:toString}; - } - }, - enumerable: true - }, - -// - **length**. Typically accessed as `content.length`, returns the length in -// bytes of the raw content entity. - length: { - get: function() { - if (typeof Buffer !== 'undefined') { - return Buffer.byteLength(this.body); - } - return this.body.length; - } - } -}); - -Content.processors = {}; - -// The `registerProcessor` function allows you to add your own processors to -// convert content entities. Each processor consists of a Javascript object with -// two properties: -// - **parser**. The function used to parse a raw content entity and convert it -// into a Javascript data type. -// - **stringify**. The function used to convert a Javascript data type into a -// raw content entity. -Content.registerProcessor = function(types,processor) { - -// You can pass an array of types that will trigger this processor, or just one. -// We determine the array via duck-typing here. - if (types.forEach) { - types.forEach(function(type) { - Content.processors[type] = processor; - }); - } else { - // If you didn't pass an array, we just use what you pass in. - Content.processors[types] = processor; - } -}; - -// Register the identity processor, which is used for text-based media types. -var identity = function(x) { return x; } - , toString = function(x) { return x.toString(); } -Content.registerProcessor( - ["text/html","text/plain","text"], - { parser: identity, stringify: toString }); - -// Register the JSON processor, which is used for JSON-based media types. -Content.registerProcessor( - ["application/json; charset=utf-8","application/json","json"], - { - parser: function(string) { - return JSON.parse(string); - }, - stringify: function(data) { - return JSON.stringify(data); }}); - -var qs = require('querystring'); -// Register the post processor, which is used for JSON-based media types. -Content.registerProcessor( - ["application/x-www-form-urlencoded"], - { parser : qs.parse, stringify : qs.stringify }); - -// Error functions are defined separately here in an attempt to make the code -// easier to read. -var Errors = { - setDataWithBody: function(object) { - throw new Error("Attempt to set data attribute of a content object " + - "when the body attributes was already set."); - }, - setBodyWithData: function(object) { - throw new Error("Attempt to set body attribute of a content object " + - "when the data attributes was already set."); - } -} -module.exports = Content; \ No newline at end of file diff --git a/public/lib/swagger-oauth.js b/public/lib/swagger-oauth.js deleted file mode 100644 index 19777eb..0000000 --- a/public/lib/swagger-oauth.js +++ /dev/null @@ -1,218 +0,0 @@ -var appName; -var popupMask; -var popupDialog; -var clientId; -var realm; - -function handleLogin() { - var scopes = []; - - if(window.swaggerUi.api.authSchemes - && window.swaggerUi.api.authSchemes.oauth2 - && window.swaggerUi.api.authSchemes.oauth2.scopes) { - scopes = window.swaggerUi.api.authSchemes.oauth2.scopes; - } - - if(window.swaggerUi.api - && window.swaggerUi.api.info) { - appName = window.swaggerUi.api.info.title; - } - - if(popupDialog.length > 0) - popupDialog = popupDialog.last(); - else { - popupDialog = $( - [ - '
', - '
Select OAuth2.0 Scopes
', - '
', - '

Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.', - 'Learn how to use', - '

', - '

' + appName + ' API requires the following scopes. Select which ones you want to grant to Swagger UI.

', - '
    ', - '
', - '

', - '
', - '
', - '
'].join('')); - $(document.body).append(popupDialog); - - popup = popupDialog.find('ul.api-popup-scopes').empty(); - for (i = 0; i < scopes.length; i ++) { - scope = scopes[i]; - str = '
  • ' + '
  • '; - popup.append(str); - } - - - var $win = $(window), - dw = $win.width(), - dh = $win.height(), - st = $win.scrollTop(), - dlgWd = popupDialog.outerWidth(), - dlgHt = popupDialog.outerHeight(), - top = (dh -dlgHt)/2 + st, - left = (dw - dlgWd)/2; - - popupDialog.css({ - top: (top < 0? 0 : top) + 'px', - left: (left < 0? 0 : left) + 'px' - }); - - popupDialog.find('button.api-popup-cancel').click(function() { - popupMask.hide(); - popupDialog.hide(); - }); - popupDialog.find('button.api-popup-authbtn').click(function() { - popupMask.hide(); - popupDialog.hide(); - - var authSchemes = window.swaggerUi.api.authSchemes; - var location = window.location; - var locationUrl = location.protocol + '//' + location.host + location.pathname; - var redirectUrl = locationUrl.replace("index.html","").concat("/o2c.html").replace("//o2c.html","/o2c.html"); - var url = null; - - var p = window.swaggerUi.api.authSchemes; - for (var key in p) { - if (p.hasOwnProperty(key)) { - var o = p[key].grantTypes; - for(var t in o) { - if(o.hasOwnProperty(t) && t === 'implicit') { - var dets = o[t]; - url = dets.loginEndpoint.url + "?response_type=token"; - window.swaggerUi.tokenName = dets.tokenName; - } - } - } - } - var scopes = []; - var scopeForUrl=''; - var o = $('.api-popup-scopes').find('input:checked'); - - for(var k =0; k < o.length; k++) { - scopes.push($(o[k]).attr("scope")); - if(k > 0){ - scopeForUrl+=' '; - } - scopeForUrl+=$(o[k]).attr("scope"); - } - - window.enabledScopes=scopes; - - - url += '&redirect_uri=' + encodeURIComponent(redirectUrl); - url += '&realm=' + encodeURIComponent(realm); - url += '&client_id=' + encodeURIComponent(clientId); - url += '&scope=' + encodeURIComponent(scopeForUrl); - - window.open(url); - }); - } - popupMask.show(); - popupDialog.show(); - return; -} - - -function handleLogout() { - for(key in window.authorizations.authz){ - window.authorizations.remove(key) - } - window.enabledScopes = null; - $('.api-ic.ic-on').addClass('ic-off'); - $('.api-ic.ic-on').removeClass('ic-on'); - - // set the info box - $('.api-ic.ic-warning').addClass('ic-error'); - $('.api-ic.ic-warning').removeClass('ic-warning'); -} - -function initOAuth(opts) { - var o = (opts||{}); - var errors = []; - - appName = (o.appName||errors.push("missing appName")); - popupMask = (o.popupMask||$('#api-common-mask')); - popupDialog = (o.popupDialog||$('.api-popup-dialog')); - clientId = (o.clientId||errors.push("missing client id")); - realm = (o.realm||errors.push("missing realm")); - - if(errors.length > 0){ - log("auth unable initialize oauth: " + errors); - return; - } - - $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); - $('.api-ic').click(function(s) { - if($(s.target).hasClass('ic-off')) - handleLogin(); - else { - handleLogout(); - } - false; - }); -} - -function onOAuthComplete(token) { - if(token) { - if(token.error) { - var checkbox = $('input[type=checkbox],.secured') - checkbox.each(function(pos){ - checkbox[pos].checked = false; - }); - alert(token.error); - } - else { - var b = token[window.swaggerUi.tokenName]; - if(b){ - // if all roles are satisfied - var o = null; - $.each($('.auth #api_information_panel'), function(k, v) { - var children = v; - if(children && children.childNodes) { - var requiredScopes = []; - $.each((children.childNodes), function (k1, v1){ - var inner = v1.innerHTML; - if(inner) - requiredScopes.push(inner); - }); - var diff = []; - for(var i=0; i < requiredScopes.length; i++) { - var s = requiredScopes[i]; - if(window.enabledScopes && window.enabledScopes.indexOf(s) == -1) { - diff.push(s); - } - } - if(diff.length > 0){ - o = v.parentNode; - $(o.parentNode).find('.api-ic.ic-on').addClass('ic-off'); - $(o.parentNode).find('.api-ic.ic-on').removeClass('ic-on'); - - // sorry, not all scopes are satisfied - $(o).find('.api-ic').addClass('ic-warning'); - $(o).find('.api-ic').removeClass('ic-error'); - } - else { - o = v.parentNode; - $(o.parentNode).find('.api-ic.ic-off').addClass('ic-on'); - $(o.parentNode).find('.api-ic.ic-off').removeClass('ic-off'); - - // all scopes are satisfied - $(o).find('.api-ic').addClass('ic-info'); - $(o).find('.api-ic').removeClass('ic-warning'); - $(o).find('.api-ic').removeClass('ic-error'); - } - } - }); - - window.authorizations.add("key", new ApiKeyAuthorization("Authorization", "Bearer " + b, "header")); - } - } - } -} \ No newline at end of file diff --git a/public/o2c.html b/public/o2c.html deleted file mode 100644 index d32d130..0000000 --- a/public/o2c.html +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file