像素猎手: Pixiv 批量下载工具

可能是目前最好用的P站批量抓图工具

  1. // ==UserScript==
  2. // @name Pxer: the tool for pixiv.net
  3. // @name:zh-CN 像素猎手: Pixiv 批量下载工具
  4. // @name:en-US Pxer: the tool for pixiv.net
  5. // @name:ja-JP Pxer: Pixiv に向くクローラー
  6. // @description Maybe the best tool for pixiv.net for capture pictures
  7. // @description:zh-CN 可能是目前最好用的P站批量抓图工具
  8. // @description:en-US Maybe the best tool for pixiv.net for capture pictures
  9. // @description:ja-JP Pixiv の全てのツールで一番使いやすいバッチキャプチャーソフトかもしれない
  10. // @icon https://pxer-app.pea3nut.org/public/favicon.ico
  11. // @version 2021.12.5
  12. // @namespace http://pxer.pea3nut.org/sfp
  13. // @homepageURL http://pxer.pea3nut.org/
  14. // @supportURL https://github.com/FoXZilla/Pxer/issues/new/choose
  15. // @author pea3nut / eternal-flame-AD
  16. // @grant none
  17. // @noframes
  18. // @require https://cdn.jsdelivr.net/npm/vue@2.6/dist/vue.min.js
  19. // @include https://www.pixiv.net*
  20. // @include http://www.pixiv.net**
  21. // @include http://pxer.pea3nut.org*
  22. // @include https://pxer.pea3nut.org*
  23. // ==/UserScript==
  24. javascript: void(function() {
  25.  
  26. window['PXER_URL'] = 'https://pxer-app.pea3nut.org/';
  27. window['PXER_MODE'] = 'sfp';
  28.  
  29. window['pxer'] = window['pxer'] || {};
  30. pxer.util = pxer.util || {};
  31. pxer.util.afterLoad =function(fn){
  32. if(document.readyState !== 'loading'){
  33. setTimeout(fn);
  34. }else{
  35. document.addEventListener('DOMContentLoaded', fn);
  36. }
  37. };
  38. pxer.util.compile = function (str, scope = window) {
  39. let matchResult = null;
  40. while (matchResult = str.match(/{{\s*([\w_]+)\s*}}/)) {
  41. str = str.replace(matchResult[0], scope[matchResult[1]]);
  42. }
  43. return str;
  44. };
  45. pxer.util.set = function (obj, key, val) {
  46. const keys = key.split('.');
  47. let pointer = obj;
  48. for (let i = 0; i < keys.length; i++) {
  49. if (i === keys.length - 1) {
  50. pointer[keys[i]] = val;
  51. } else {
  52. pointer[keys[i]] = pointer[keys[i]] || {};
  53. pointer = pointer[keys[i]];
  54. }
  55. }
  56. };
  57. // @ref https://www.jianshu.com/p/162dad820f48
  58. pxer.util.get = function self(data,f){
  59. if(f.substr) f = f.split(/\.|\\|\//);
  60.  
  61. if(f.length && data){
  62. return self(data[f.shift()],f)
  63. }else if(!f.length && data){
  64. return data
  65. }else {
  66. return "";
  67. }
  68. };
  69. pxer.util.addFile = async function (url) {
  70. const sector = url.includes('?') ? '&' : '?';
  71. const pxerVersion = /*@auto-fill*/'2021.12.5'/*@auto-fill*/;
  72.  
  73. if (!/^(https?:)?\/\//.test(url)) url = pxer.url + url;
  74. url = url + sector + `pxer-version=${pxerVersion}`;
  75.  
  76. const createScript = () => new Promise(function (resolve, reject) {
  77. const elt = document.createElement('script');
  78. elt.addEventListener('error', reject);
  79. elt.addEventListener('load', resolve);
  80. elt.addEventListener('load', () => pxer.log('Loaded ' + url));
  81. elt.src = url;
  82. document.documentElement.appendChild(elt);
  83. return elt;
  84. });
  85. const createCss = () => new Promise(function (resolve) {
  86. const elt = document.createElement('link');
  87. elt.rel = 'stylesheet';
  88. elt.href = url;
  89. document.documentElement.appendChild(elt);
  90. resolve();
  91. });
  92. const createIcon = () => new Promise(function (resolve) {
  93. pxer.util.afterLoad(() => {
  94. Array.from(document.querySelectorAll("link[rel*='icon']")).forEach(elt => elt.href = url);
  95. });
  96. (document.head || document.documentElement).appendChild(function(){
  97. const elt = document.createElement('link');
  98. elt.rel = 'shortcut icon';
  99. elt.type = 'image/x-icon';
  100. elt.href = url;
  101. return elt;
  102. }());
  103. resolve();
  104. });
  105.  
  106. const fileFormat = url.match(/\.([^.]+?)(\?.+?)?$/)[1];
  107. switch (fileFormat) {
  108. case 'js':
  109. return createScript();
  110. case 'css':
  111. return createCss();
  112. case 'ico':
  113. return createIcon();
  114. case 'json':
  115. return fetch(url).then(res => res.json());
  116. default:
  117. return fetch(url).then(res => res.text());
  118. }
  119. };
  120.  
  121. (async function(){
  122. window['PXER_URL'] = window['PXER_URL'] || 'https://pxer-app.pea3nut.org/';
  123. window['PXER_MODE'] = window['PXER_MODE'] || 'native';
  124. window['PXER_LANG'] = window['PXER_LANG'] || (document.documentElement.lang || window.navigator.language).split('-')[0];
  125.  
  126. pxer.url = PXER_URL;
  127. pxer.mode = PXER_MODE;
  128. pxer.lang = PXER_LANG;
  129. pxer.log = (...msg) => console.log('[Pxer]', ...msg);
  130.  
  131. switch (PXER_MODE) {
  132. case 'dev':
  133. case 'master':
  134. // old version doesn't declare "@require vuejs"
  135. await pxer.util.addFile('https://cdn.jsdelivr.net/npm/vue@2.6/dist/vue.min.js');
  136. case 'native':
  137. await pxer.util.addFile('native.js');
  138. break;
  139. case 'local':
  140. await pxer.util.addFile('src/local.js');
  141. break;
  142. case 'sfp':
  143. break;
  144. }
  145. })().catch(console.error);
  146.  
  147. // package.json
  148. pxer.util.set(pxer, 'package', {
  149. "name": "pxer",
  150. "version": "2021.12.5",
  151. "private": true,
  152. "scripts": {
  153. "dev": "npm run build && ws --https --port 8125 --cors.origin=*",
  154. "build": "node-sass src/ --output src/ && node build/build-launcher && node build/build-native && node build/build-sfp",
  155. "test-build": "ws --directory dist/ --https --port 8125 --cors.origin *"
  156. },
  157. "dependencies": {
  158. "request": "^2.88.0",
  159. "vue": "^2.6.10"
  160. },
  161. "devDependencies": {
  162. "bootstrap": "^4.3.1",
  163. "ejs": "^2.7.1",
  164. "local-web-server": "^3.0.7",
  165. "node-sass": "^4.12.0"
  166. }
  167. }
  168. )
  169. ;
  170.  
  171.  
  172. // src/view/template.html
  173. pxer.util.set(pxer, 'uiTemplate', `<div id="pxerApp" class="pxer-app">
  174.  
  175. <div class="pxer-nav">
  176. <div class="pn-header">
  177. <a href="http://pxer.pea3nut.org/" target="_blank">Pxer <small>{{ pxerVersion }}</small></a>
  178. </div>
  179. <div class="pn-message" v-text="errmsg" v-if="errmsg">
  180. oops~ get some error
  181. </div>
  182. <div v-if="showAll || canCrawl" class="pn-buttons">
  183. <div
  184. class="pnb-progress"
  185. v-show="showAll || isRunning || ['ready','re-ready'].includes(state)"
  186. >
  187. <span>{{ finishCount >= 0 ? finishCount : '-' }} / {{ taskCount }}</span>
  188. </div>
  189. <button
  190. v-show="showAll || ['ready'].includes(state)"
  191. @click="showTaskOption = !showTaskOption"
  192. class="btn btn-outline-info"
  193. >{{ t('button.option') }}</button>
  194.  
  195. <div
  196. id="wave"
  197. v-if="state==='init' || showLoadingButton"
  198. >
  199. <span class="dot"></span>
  200. <span class="dot"></span>
  201. <span class="dot"></span>
  202. </div>
  203. <button
  204. class="btn btn-outline-primary"
  205. @click="crawlDirectly"
  206. v-else-if="canCrawlDirectly"
  207. >{{ t('button.crawl') }}</button>
  208. <template v-else>
  209. <button class="btn btn-outline-success"
  210. @click="load"
  211. v-if="state==='standby'&&showLoadBtn"
  212. >{{ t('button.load') }}</button>
  213. <button class="btn btn-outline-primary"
  214. @click="run"
  215. v-if="state==='ready' || (state==='re-ready'&&pxer.taskList.length)"
  216. >{{ t('button.crawl') }}</button>
  217. <button class="btn btn-outline-danger"
  218. @click="stop"
  219. v-if="isRunning"
  220. >{{ t('button.stop') }}</button>
  221. <template v-if="showAll || showFailTaskList.length">
  222. <button class="btn btn-outline-warning"
  223. @click="showPxerFailWindow=!showPxerFailWindow"
  224. >{{ t('button.successBut') }}</button><span class="pnb-warn-number"
  225. v-text="showFailTaskList.length>99?99:showFailTaskList.length"></span>
  226. </template>
  227. </template>
  228. </div>
  229. </div>
  230.  
  231. <div class="pxer-fail" v-if="showAll ||(showPxerFailWindow &&showFailTaskList.length)">
  232. <table class="table">
  233. <thead class="pft-head"><tr>
  234. <td>{{ t('label.pictureId') }}</td>
  235. <td width="100">{{ t('label.reason') }}</td>
  236. <td>{{ t('label.way') }}</td>
  237. <td width="170" class="text-right">
  238. <button class="btn btn-outline-secondary"
  239. @click="checkedFailWorksList =pxer.failList">{{ t('button.selectAll') }}</button>
  240. <button class="btn btn-outline-success" @click="tryCheckedPfi">{{ t('button.retryTheSelected') }}</button>
  241. </td>
  242. </tr></thead>
  243. <tbody><tr v-for="pfi of showFailTaskList">
  244. <td><a :href="pfi.url">{{pfi.task.id}}</a></td>
  245. <td v-text="formatFailType(pfi.type)"></td>
  246. <td v-html="formatFailSolution(pfi.type)"></td>
  247. <td class="text-right"><input type="checkbox" :value="pfi" v-model="checkedFailWorksList"></td>
  248. </tr></tbody>
  249. </table>
  250. </div>
  251.  
  252.  
  253. <div class="pxer-task-option form-inline" v-if="showAll ||(showTaskOption&&state==='ready')">
  254. <div class="form-group">
  255. <label class="pcf-title">{{ t('label.onlyGetTop') }}</label>
  256. <input type="number" class="form-control" v-model="taskOption.limit" />
  257. </div>
  258. <div class="form-group">
  259. <label class="pcf-title">{{ t('label.onlyGetBeforeId') }}</label>
  260. <input type="number" class="form-control" v-model="taskOption.stopId" />
  261. </div>
  262. <div class="form-group ptp-buttons">
  263. <button class="btn btn-outline-success" @click="useTaskOption">{{ t('button.apply') }}</button>
  264. </div>
  265. </div>
  266.  
  267.  
  268.  
  269.  
  270.  
  271. <div class="pxer-print" v-if="showAll ||['finish'].indexOf(state)!==-1">
  272. <div class="pp-filter pxer-class-fieldset">
  273. <div class="ppf-title pcf-title">{{ t('title.filterOptions') }}</div>
  274. <div class="ppf-form">
  275. <div class="form-row">
  276. <div class="form-row">
  277. <div class="form-group col">
  278. <label>{{ t('label.likeCount') }} ≥</label>
  279. <input type="number" class="form-control" v-model.number="pxer.pfConfig.rated" />
  280. </div>
  281. <div class="form-group col">
  282. <label>{{ t('label.viewCount') }} ≥</label>
  283. <input type="number" class="form-control" v-model.number="pxer.pfConfig.view" />
  284. </div>
  285. <div class="form-group col">
  286. <label>{{ t('label.likeProportion') }} ≥</label>
  287. <input
  288. type="number"
  289. class="form-control"
  290. v-model.number="pxer.pfConfig.rated_pro"
  291. :placeholder="t('phrase.likeProportion')"
  292. />
  293. </div>
  294. </div>
  295. </div>
  296. <div class="card ppf-tag-card">
  297. <div class="card-header">
  298. {{ t('title.filterByTag')}}
  299. <div class="float-right">
  300. <span class="badge badge-secondary">{{ t('label.whatever') }}</span>
  301. <span class="badge badge-danger ">{{ t('label.exclude') }}</span>
  302. <span class="badge badge-success">{{ t('label.mustInclude') }}</span>
  303. </div>
  304. </div>
  305. <div class="card-body" :style="tagFilterFolded ? 'height: 500px' : ''">
  306. <button
  307. v-for="tagName in tagInfo.tags"
  308. class="btn btn-sm ppf-tag"
  309. :class="countTagTheme(tagName)"
  310. @click="onTagClick(tagName)"
  311. @dblclick.stop
  312. >
  313. {{ tagName }}
  314. <span class="badge badge-light">{{ tagInfo.count[tagName] }}</span>
  315. </button>
  316. <div
  317. v-if="tagFilterFolded"
  318. class="ppf-show-all-tag"
  319. @click="showAllTagFilter = true"
  320. >{{ t('button.showAll')}}</div>
  321. </div>
  322. </div>
  323. </div>
  324. </div>
  325. <div class="pp-print pxer-class-fieldset">
  326. <div class="ppp-title pcf-title">{{ t('title.printOptions') }}</div>
  327. <div class="ppp-form">
  328. <div class="form-group">
  329. <label>{{ t('label.singleIllust') }}</label>
  330. <select class="form-control" v-model="pxer.ppConfig.illust_single">
  331. <option value="max">{{ t('option.max') }}</option>
  332. <option value="600p">600p</option>
  333. <option value="no">{{ t('option.no') }}</option>
  334. </select>
  335. </div>
  336. <div class="form-group">
  337. <label>{{ t('label.multipleIllust') }}</label>
  338. <select class="form-control" v-model="pxer.ppConfig.illust_multiple">
  339. <option value="max">{{ t('option.max') }}</option>
  340. <option value="1200p">1200p</option>
  341. <option value="cover_600p">{{ t('option.cover600p') }}</option>
  342. <option value="no">{{ t('option.no') }}</option>
  343. </select>
  344. </div>
  345. <div class="form-group">
  346. <label>{{ t('label.singleManga') }}</label>
  347. <select class="form-control" v-model="pxer.ppConfig.manga_single">
  348. <option value="max">{{ t('option.max') }}</option>
  349. <option value="600p">600p</option>
  350. <option value="no">{{ t('option.no') }}</option>
  351. </select>
  352. </div>
  353. <div class="form-group">
  354. <label>{{ t('label.multipleManga') }}</label>
  355. <select class="form-control" v-model="pxer.ppConfig.manga_multiple">
  356. <option value="max">{{ t('option.max') }}</option>
  357. <option value="1200p">1200p</option>
  358. <option value="cover_600p">{{ t('option.cover600p') }}</option>
  359. <option value="no">{{ t('option.no') }}</option>
  360. </select>
  361. </div>
  362. <div class="form-group">
  363. <label>{{ t('label.ugoira') }}</label>
  364. <select class="form-control" v-model="printConfigUgoira">
  365. <option value="max-no">{{ t('option.ugoiraMax') }}</option>
  366. <option value="600p-no">{{ t('option.ugoira600p') }}</option>
  367. <option value="max-yes">{{ t('option.ugoiraMax') }} + {{ t('option.ugoiraConfig') }}</option>
  368. <option value="600p-yes">{{ t('option.ugoira600p') }} + {{ t('option.ugoiraConfig') }}</option>
  369. <option value="no-no">{{ t('option.no') }}</option>
  370. </select>
  371. </div>
  372. <div class="pppf-buttons">
  373. <p class="pppfb-msg" v-html="taskInfo" v-if="taskInfo"></p>
  374. <button class="btn btn-outline-info" @click="count">{{ t('button.preview') }}</button>
  375. <button class="btn btn-outline-success" @click="printWorks">{{ t('button.print') }}</button>
  376. </div>
  377. </div>
  378. </div>
  379. </div>
  380.  
  381. </div>`)
  382. ;
  383.  
  384.  
  385. // src/view/style.css
  386. document.documentElement.appendChild(
  387. document.createElement('style')
  388. ).innerHTML = `.pxer-app {
  389. /*!
  390. * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)
  391. * Copyright 2011-2019 The Bootstrap Authors
  392. * Copyright 2011-2019 Twitter, Inc.
  393. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  394. */
  395. max-width: 970px;
  396. width: 100%;
  397. margin: 0 auto;
  398. box-sizing: border-box;
  399. color: #212529;
  400. font-size: 14px; }
  401. .pxer-app html {
  402. box-sizing: border-box;
  403. -ms-overflow-style: scrollbar; }
  404. .pxer-app *,
  405. .pxer-app *::before,
  406. .pxer-app *::after {
  407. box-sizing: inherit; }
  408. .pxer-app .container {
  409. width: 100%;
  410. padding-right: 15px;
  411. padding-left: 15px;
  412. margin-right: auto;
  413. margin-left: auto; }
  414. @media (min-width: 576px) {
  415. .pxer-app .container {
  416. max-width: 540px; } }
  417. @media (min-width: 768px) {
  418. .pxer-app .container {
  419. max-width: 720px; } }
  420. @media (min-width: 992px) {
  421. .pxer-app .container {
  422. max-width: 960px; } }
  423. @media (min-width: 1200px) {
  424. .pxer-app .container {
  425. max-width: 1140px; } }
  426. .pxer-app .container-fluid {
  427. width: 100%;
  428. padding-right: 15px;
  429. padding-left: 15px;
  430. margin-right: auto;
  431. margin-left: auto; }
  432. .pxer-app .row {
  433. display: flex;
  434. flex-wrap: wrap;
  435. margin-right: -15px;
  436. margin-left: -15px; }
  437. .pxer-app .no-gutters {
  438. margin-right: 0;
  439. margin-left: 0; }
  440. .pxer-app .no-gutters > .col,
  441. .pxer-app .no-gutters > [class*="col-"] {
  442. padding-right: 0;
  443. padding-left: 0; }
  444. .pxer-app .col-1, .pxer-app .col-2, .pxer-app .col-3, .pxer-app .col-4, .pxer-app .col-5, .pxer-app .col-6, .pxer-app .col-7, .pxer-app .col-8, .pxer-app .col-9, .pxer-app .col-10, .pxer-app .col-11, .pxer-app .col-12, .pxer-app .col,
  445. .pxer-app .col-auto, .pxer-app .col-sm-1, .pxer-app .col-sm-2, .pxer-app .col-sm-3, .pxer-app .col-sm-4, .pxer-app .col-sm-5, .pxer-app .col-sm-6, .pxer-app .col-sm-7, .pxer-app .col-sm-8, .pxer-app .col-sm-9, .pxer-app .col-sm-10, .pxer-app .col-sm-11, .pxer-app .col-sm-12, .pxer-app .col-sm,
  446. .pxer-app .col-sm-auto, .pxer-app .col-md-1, .pxer-app .col-md-2, .pxer-app .col-md-3, .pxer-app .col-md-4, .pxer-app .col-md-5, .pxer-app .col-md-6, .pxer-app .col-md-7, .pxer-app .col-md-8, .pxer-app .col-md-9, .pxer-app .col-md-10, .pxer-app .col-md-11, .pxer-app .col-md-12, .pxer-app .col-md,
  447. .pxer-app .col-md-auto, .pxer-app .col-lg-1, .pxer-app .col-lg-2, .pxer-app .col-lg-3, .pxer-app .col-lg-4, .pxer-app .col-lg-5, .pxer-app .col-lg-6, .pxer-app .col-lg-7, .pxer-app .col-lg-8, .pxer-app .col-lg-9, .pxer-app .col-lg-10, .pxer-app .col-lg-11, .pxer-app .col-lg-12, .pxer-app .col-lg,
  448. .pxer-app .col-lg-auto, .pxer-app .col-xl-1, .pxer-app .col-xl-2, .pxer-app .col-xl-3, .pxer-app .col-xl-4, .pxer-app .col-xl-5, .pxer-app .col-xl-6, .pxer-app .col-xl-7, .pxer-app .col-xl-8, .pxer-app .col-xl-9, .pxer-app .col-xl-10, .pxer-app .col-xl-11, .pxer-app .col-xl-12, .pxer-app .col-xl,
  449. .pxer-app .col-xl-auto {
  450. position: relative;
  451. width: 100%;
  452. padding-right: 15px;
  453. padding-left: 15px; }
  454. .pxer-app .col {
  455. flex-basis: 0;
  456. flex-grow: 1;
  457. max-width: 100%; }
  458. .pxer-app .col-auto {
  459. flex: 0 0 auto;
  460. width: auto;
  461. max-width: 100%; }
  462. .pxer-app .col-1 {
  463. flex: 0 0 8.33333%;
  464. max-width: 8.33333%; }
  465. .pxer-app .col-2 {
  466. flex: 0 0 16.66667%;
  467. max-width: 16.66667%; }
  468. .pxer-app .col-3 {
  469. flex: 0 0 25%;
  470. max-width: 25%; }
  471. .pxer-app .col-4 {
  472. flex: 0 0 33.33333%;
  473. max-width: 33.33333%; }
  474. .pxer-app .col-5 {
  475. flex: 0 0 41.66667%;
  476. max-width: 41.66667%; }
  477. .pxer-app .col-6 {
  478. flex: 0 0 50%;
  479. max-width: 50%; }
  480. .pxer-app .col-7 {
  481. flex: 0 0 58.33333%;
  482. max-width: 58.33333%; }
  483. .pxer-app .col-8 {
  484. flex: 0 0 66.66667%;
  485. max-width: 66.66667%; }
  486. .pxer-app .col-9 {
  487. flex: 0 0 75%;
  488. max-width: 75%; }
  489. .pxer-app .col-10 {
  490. flex: 0 0 83.33333%;
  491. max-width: 83.33333%; }
  492. .pxer-app .col-11 {
  493. flex: 0 0 91.66667%;
  494. max-width: 91.66667%; }
  495. .pxer-app .col-12 {
  496. flex: 0 0 100%;
  497. max-width: 100%; }
  498. .pxer-app .order-first {
  499. order: -1; }
  500. .pxer-app .order-last {
  501. order: 13; }
  502. .pxer-app .order-0 {
  503. order: 0; }
  504. .pxer-app .order-1 {
  505. order: 1; }
  506. .pxer-app .order-2 {
  507. order: 2; }
  508. .pxer-app .order-3 {
  509. order: 3; }
  510. .pxer-app .order-4 {
  511. order: 4; }
  512. .pxer-app .order-5 {
  513. order: 5; }
  514. .pxer-app .order-6 {
  515. order: 6; }
  516. .pxer-app .order-7 {
  517. order: 7; }
  518. .pxer-app .order-8 {
  519. order: 8; }
  520. .pxer-app .order-9 {
  521. order: 9; }
  522. .pxer-app .order-10 {
  523. order: 10; }
  524. .pxer-app .order-11 {
  525. order: 11; }
  526. .pxer-app .order-12 {
  527. order: 12; }
  528. .pxer-app .offset-1 {
  529. margin-left: 8.33333%; }
  530. .pxer-app .offset-2 {
  531. margin-left: 16.66667%; }
  532. .pxer-app .offset-3 {
  533. margin-left: 25%; }
  534. .pxer-app .offset-4 {
  535. margin-left: 33.33333%; }
  536. .pxer-app .offset-5 {
  537. margin-left: 41.66667%; }
  538. .pxer-app .offset-6 {
  539. margin-left: 50%; }
  540. .pxer-app .offset-7 {
  541. margin-left: 58.33333%; }
  542. .pxer-app .offset-8 {
  543. margin-left: 66.66667%; }
  544. .pxer-app .offset-9 {
  545. margin-left: 75%; }
  546. .pxer-app .offset-10 {
  547. margin-left: 83.33333%; }
  548. .pxer-app .offset-11 {
  549. margin-left: 91.66667%; }
  550. @media (min-width: 576px) {
  551. .pxer-app .col-sm {
  552. flex-basis: 0;
  553. flex-grow: 1;
  554. max-width: 100%; }
  555. .pxer-app .col-sm-auto {
  556. flex: 0 0 auto;
  557. width: auto;
  558. max-width: 100%; }
  559. .pxer-app .col-sm-1 {
  560. flex: 0 0 8.33333%;
  561. max-width: 8.33333%; }
  562. .pxer-app .col-sm-2 {
  563. flex: 0 0 16.66667%;
  564. max-width: 16.66667%; }
  565. .pxer-app .col-sm-3 {
  566. flex: 0 0 25%;
  567. max-width: 25%; }
  568. .pxer-app .col-sm-4 {
  569. flex: 0 0 33.33333%;
  570. max-width: 33.33333%; }
  571. .pxer-app .col-sm-5 {
  572. flex: 0 0 41.66667%;
  573. max-width: 41.66667%; }
  574. .pxer-app .col-sm-6 {
  575. flex: 0 0 50%;
  576. max-width: 50%; }
  577. .pxer-app .col-sm-7 {
  578. flex: 0 0 58.33333%;
  579. max-width: 58.33333%; }
  580. .pxer-app .col-sm-8 {
  581. flex: 0 0 66.66667%;
  582. max-width: 66.66667%; }
  583. .pxer-app .col-sm-9 {
  584. flex: 0 0 75%;
  585. max-width: 75%; }
  586. .pxer-app .col-sm-10 {
  587. flex: 0 0 83.33333%;
  588. max-width: 83.33333%; }
  589. .pxer-app .col-sm-11 {
  590. flex: 0 0 91.66667%;
  591. max-width: 91.66667%; }
  592. .pxer-app .col-sm-12 {
  593. flex: 0 0 100%;
  594. max-width: 100%; }
  595. .pxer-app .order-sm-first {
  596. order: -1; }
  597. .pxer-app .order-sm-last {
  598. order: 13; }
  599. .pxer-app .order-sm-0 {
  600. order: 0; }
  601. .pxer-app .order-sm-1 {
  602. order: 1; }
  603. .pxer-app .order-sm-2 {
  604. order: 2; }
  605. .pxer-app .order-sm-3 {
  606. order: 3; }
  607. .pxer-app .order-sm-4 {
  608. order: 4; }
  609. .pxer-app .order-sm-5 {
  610. order: 5; }
  611. .pxer-app .order-sm-6 {
  612. order: 6; }
  613. .pxer-app .order-sm-7 {
  614. order: 7; }
  615. .pxer-app .order-sm-8 {
  616. order: 8; }
  617. .pxer-app .order-sm-9 {
  618. order: 9; }
  619. .pxer-app .order-sm-10 {
  620. order: 10; }
  621. .pxer-app .order-sm-11 {
  622. order: 11; }
  623. .pxer-app .order-sm-12 {
  624. order: 12; }
  625. .pxer-app .offset-sm-0 {
  626. margin-left: 0; }
  627. .pxer-app .offset-sm-1 {
  628. margin-left: 8.33333%; }
  629. .pxer-app .offset-sm-2 {
  630. margin-left: 16.66667%; }
  631. .pxer-app .offset-sm-3 {
  632. margin-left: 25%; }
  633. .pxer-app .offset-sm-4 {
  634. margin-left: 33.33333%; }
  635. .pxer-app .offset-sm-5 {
  636. margin-left: 41.66667%; }
  637. .pxer-app .offset-sm-6 {
  638. margin-left: 50%; }
  639. .pxer-app .offset-sm-7 {
  640. margin-left: 58.33333%; }
  641. .pxer-app .offset-sm-8 {
  642. margin-left: 66.66667%; }
  643. .pxer-app .offset-sm-9 {
  644. margin-left: 75%; }
  645. .pxer-app .offset-sm-10 {
  646. margin-left: 83.33333%; }
  647. .pxer-app .offset-sm-11 {
  648. margin-left: 91.66667%; } }
  649. @media (min-width: 768px) {
  650. .pxer-app .col-md {
  651. flex-basis: 0;
  652. flex-grow: 1;
  653. max-width: 100%; }
  654. .pxer-app .col-md-auto {
  655. flex: 0 0 auto;
  656. width: auto;
  657. max-width: 100%; }
  658. .pxer-app .col-md-1 {
  659. flex: 0 0 8.33333%;
  660. max-width: 8.33333%; }
  661. .pxer-app .col-md-2 {
  662. flex: 0 0 16.66667%;
  663. max-width: 16.66667%; }
  664. .pxer-app .col-md-3 {
  665. flex: 0 0 25%;
  666. max-width: 25%; }
  667. .pxer-app .col-md-4 {
  668. flex: 0 0 33.33333%;
  669. max-width: 33.33333%; }
  670. .pxer-app .col-md-5 {
  671. flex: 0 0 41.66667%;
  672. max-width: 41.66667%; }
  673. .pxer-app .col-md-6 {
  674. flex: 0 0 50%;
  675. max-width: 50%; }
  676. .pxer-app .col-md-7 {
  677. flex: 0 0 58.33333%;
  678. max-width: 58.33333%; }
  679. .pxer-app .col-md-8 {
  680. flex: 0 0 66.66667%;
  681. max-width: 66.66667%; }
  682. .pxer-app .col-md-9 {
  683. flex: 0 0 75%;
  684. max-width: 75%; }
  685. .pxer-app .col-md-10 {
  686. flex: 0 0 83.33333%;
  687. max-width: 83.33333%; }
  688. .pxer-app .col-md-11 {
  689. flex: 0 0 91.66667%;
  690. max-width: 91.66667%; }
  691. .pxer-app .col-md-12 {
  692. flex: 0 0 100%;
  693. max-width: 100%; }
  694. .pxer-app .order-md-first {
  695. order: -1; }
  696. .pxer-app .order-md-last {
  697. order: 13; }
  698. .pxer-app .order-md-0 {
  699. order: 0; }
  700. .pxer-app .order-md-1 {
  701. order: 1; }
  702. .pxer-app .order-md-2 {
  703. order: 2; }
  704. .pxer-app .order-md-3 {
  705. order: 3; }
  706. .pxer-app .order-md-4 {
  707. order: 4; }
  708. .pxer-app .order-md-5 {
  709. order: 5; }
  710. .pxer-app .order-md-6 {
  711. order: 6; }
  712. .pxer-app .order-md-7 {
  713. order: 7; }
  714. .pxer-app .order-md-8 {
  715. order: 8; }
  716. .pxer-app .order-md-9 {
  717. order: 9; }
  718. .pxer-app .order-md-10 {
  719. order: 10; }
  720. .pxer-app .order-md-11 {
  721. order: 11; }
  722. .pxer-app .order-md-12 {
  723. order: 12; }
  724. .pxer-app .offset-md-0 {
  725. margin-left: 0; }
  726. .pxer-app .offset-md-1 {
  727. margin-left: 8.33333%; }
  728. .pxer-app .offset-md-2 {
  729. margin-left: 16.66667%; }
  730. .pxer-app .offset-md-3 {
  731. margin-left: 25%; }
  732. .pxer-app .offset-md-4 {
  733. margin-left: 33.33333%; }
  734. .pxer-app .offset-md-5 {
  735. margin-left: 41.66667%; }
  736. .pxer-app .offset-md-6 {
  737. margin-left: 50%; }
  738. .pxer-app .offset-md-7 {
  739. margin-left: 58.33333%; }
  740. .pxer-app .offset-md-8 {
  741. margin-left: 66.66667%; }
  742. .pxer-app .offset-md-9 {
  743. margin-left: 75%; }
  744. .pxer-app .offset-md-10 {
  745. margin-left: 83.33333%; }
  746. .pxer-app .offset-md-11 {
  747. margin-left: 91.66667%; } }
  748. @media (min-width: 992px) {
  749. .pxer-app .col-lg {
  750. flex-basis: 0;
  751. flex-grow: 1;
  752. max-width: 100%; }
  753. .pxer-app .col-lg-auto {
  754. flex: 0 0 auto;
  755. width: auto;
  756. max-width: 100%; }
  757. .pxer-app .col-lg-1 {
  758. flex: 0 0 8.33333%;
  759. max-width: 8.33333%; }
  760. .pxer-app .col-lg-2 {
  761. flex: 0 0 16.66667%;
  762. max-width: 16.66667%; }
  763. .pxer-app .col-lg-3 {
  764. flex: 0 0 25%;
  765. max-width: 25%; }
  766. .pxer-app .col-lg-4 {
  767. flex: 0 0 33.33333%;
  768. max-width: 33.33333%; }
  769. .pxer-app .col-lg-5 {
  770. flex: 0 0 41.66667%;
  771. max-width: 41.66667%; }
  772. .pxer-app .col-lg-6 {
  773. flex: 0 0 50%;
  774. max-width: 50%; }
  775. .pxer-app .col-lg-7 {
  776. flex: 0 0 58.33333%;
  777. max-width: 58.33333%; }
  778. .pxer-app .col-lg-8 {
  779. flex: 0 0 66.66667%;
  780. max-width: 66.66667%; }
  781. .pxer-app .col-lg-9 {
  782. flex: 0 0 75%;
  783. max-width: 75%; }
  784. .pxer-app .col-lg-10 {
  785. flex: 0 0 83.33333%;
  786. max-width: 83.33333%; }
  787. .pxer-app .col-lg-11 {
  788. flex: 0 0 91.66667%;
  789. max-width: 91.66667%; }
  790. .pxer-app .col-lg-12 {
  791. flex: 0 0 100%;
  792. max-width: 100%; }
  793. .pxer-app .order-lg-first {
  794. order: -1; }
  795. .pxer-app .order-lg-last {
  796. order: 13; }
  797. .pxer-app .order-lg-0 {
  798. order: 0; }
  799. .pxer-app .order-lg-1 {
  800. order: 1; }
  801. .pxer-app .order-lg-2 {
  802. order: 2; }
  803. .pxer-app .order-lg-3 {
  804. order: 3; }
  805. .pxer-app .order-lg-4 {
  806. order: 4; }
  807. .pxer-app .order-lg-5 {
  808. order: 5; }
  809. .pxer-app .order-lg-6 {
  810. order: 6; }
  811. .pxer-app .order-lg-7 {
  812. order: 7; }
  813. .pxer-app .order-lg-8 {
  814. order: 8; }
  815. .pxer-app .order-lg-9 {
  816. order: 9; }
  817. .pxer-app .order-lg-10 {
  818. order: 10; }
  819. .pxer-app .order-lg-11 {
  820. order: 11; }
  821. .pxer-app .order-lg-12 {
  822. order: 12; }
  823. .pxer-app .offset-lg-0 {
  824. margin-left: 0; }
  825. .pxer-app .offset-lg-1 {
  826. margin-left: 8.33333%; }
  827. .pxer-app .offset-lg-2 {
  828. margin-left: 16.66667%; }
  829. .pxer-app .offset-lg-3 {
  830. margin-left: 25%; }
  831. .pxer-app .offset-lg-4 {
  832. margin-left: 33.33333%; }
  833. .pxer-app .offset-lg-5 {
  834. margin-left: 41.66667%; }
  835. .pxer-app .offset-lg-6 {
  836. margin-left: 50%; }
  837. .pxer-app .offset-lg-7 {
  838. margin-left: 58.33333%; }
  839. .pxer-app .offset-lg-8 {
  840. margin-left: 66.66667%; }
  841. .pxer-app .offset-lg-9 {
  842. margin-left: 75%; }
  843. .pxer-app .offset-lg-10 {
  844. margin-left: 83.33333%; }
  845. .pxer-app .offset-lg-11 {
  846. margin-left: 91.66667%; } }
  847. @media (min-width: 1200px) {
  848. .pxer-app .col-xl {
  849. flex-basis: 0;
  850. flex-grow: 1;
  851. max-width: 100%; }
  852. .pxer-app .col-xl-auto {
  853. flex: 0 0 auto;
  854. width: auto;
  855. max-width: 100%; }
  856. .pxer-app .col-xl-1 {
  857. flex: 0 0 8.33333%;
  858. max-width: 8.33333%; }
  859. .pxer-app .col-xl-2 {
  860. flex: 0 0 16.66667%;
  861. max-width: 16.66667%; }
  862. .pxer-app .col-xl-3 {
  863. flex: 0 0 25%;
  864. max-width: 25%; }
  865. .pxer-app .col-xl-4 {
  866. flex: 0 0 33.33333%;
  867. max-width: 33.33333%; }
  868. .pxer-app .col-xl-5 {
  869. flex: 0 0 41.66667%;
  870. max-width: 41.66667%; }
  871. .pxer-app .col-xl-6 {
  872. flex: 0 0 50%;
  873. max-width: 50%; }
  874. .pxer-app .col-xl-7 {
  875. flex: 0 0 58.33333%;
  876. max-width: 58.33333%; }
  877. .pxer-app .col-xl-8 {
  878. flex: 0 0 66.66667%;
  879. max-width: 66.66667%; }
  880. .pxer-app .col-xl-9 {
  881. flex: 0 0 75%;
  882. max-width: 75%; }
  883. .pxer-app .col-xl-10 {
  884. flex: 0 0 83.33333%;
  885. max-width: 83.33333%; }
  886. .pxer-app .col-xl-11 {
  887. flex: 0 0 91.66667%;
  888. max-width: 91.66667%; }
  889. .pxer-app .col-xl-12 {
  890. flex: 0 0 100%;
  891. max-width: 100%; }
  892. .pxer-app .order-xl-first {
  893. order: -1; }
  894. .pxer-app .order-xl-last {
  895. order: 13; }
  896. .pxer-app .order-xl-0 {
  897. order: 0; }
  898. .pxer-app .order-xl-1 {
  899. order: 1; }
  900. .pxer-app .order-xl-2 {
  901. order: 2; }
  902. .pxer-app .order-xl-3 {
  903. order: 3; }
  904. .pxer-app .order-xl-4 {
  905. order: 4; }
  906. .pxer-app .order-xl-5 {
  907. order: 5; }
  908. .pxer-app .order-xl-6 {
  909. order: 6; }
  910. .pxer-app .order-xl-7 {
  911. order: 7; }
  912. .pxer-app .order-xl-8 {
  913. order: 8; }
  914. .pxer-app .order-xl-9 {
  915. order: 9; }
  916. .pxer-app .order-xl-10 {
  917. order: 10; }
  918. .pxer-app .order-xl-11 {
  919. order: 11; }
  920. .pxer-app .order-xl-12 {
  921. order: 12; }
  922. .pxer-app .offset-xl-0 {
  923. margin-left: 0; }
  924. .pxer-app .offset-xl-1 {
  925. margin-left: 8.33333%; }
  926. .pxer-app .offset-xl-2 {
  927. margin-left: 16.66667%; }
  928. .pxer-app .offset-xl-3 {
  929. margin-left: 25%; }
  930. .pxer-app .offset-xl-4 {
  931. margin-left: 33.33333%; }
  932. .pxer-app .offset-xl-5 {
  933. margin-left: 41.66667%; }
  934. .pxer-app .offset-xl-6 {
  935. margin-left: 50%; }
  936. .pxer-app .offset-xl-7 {
  937. margin-left: 58.33333%; }
  938. .pxer-app .offset-xl-8 {
  939. margin-left: 66.66667%; }
  940. .pxer-app .offset-xl-9 {
  941. margin-left: 75%; }
  942. .pxer-app .offset-xl-10 {
  943. margin-left: 83.33333%; }
  944. .pxer-app .offset-xl-11 {
  945. margin-left: 91.66667%; } }
  946. .pxer-app .d-none {
  947. display: none !important; }
  948. .pxer-app .d-inline {
  949. display: inline !important; }
  950. .pxer-app .d-inline-block {
  951. display: inline-block !important; }
  952. .pxer-app .d-block {
  953. display: block !important; }
  954. .pxer-app .d-table {
  955. display: table !important; }
  956. .pxer-app .d-table-row {
  957. display: table-row !important; }
  958. .pxer-app .d-table-cell {
  959. display: table-cell !important; }
  960. .pxer-app .d-flex {
  961. display: flex !important; }
  962. .pxer-app .d-inline-flex {
  963. display: inline-flex !important; }
  964. @media (min-width: 576px) {
  965. .pxer-app .d-sm-none {
  966. display: none !important; }
  967. .pxer-app .d-sm-inline {
  968. display: inline !important; }
  969. .pxer-app .d-sm-inline-block {
  970. display: inline-block !important; }
  971. .pxer-app .d-sm-block {
  972. display: block !important; }
  973. .pxer-app .d-sm-table {
  974. display: table !important; }
  975. .pxer-app .d-sm-table-row {
  976. display: table-row !important; }
  977. .pxer-app .d-sm-table-cell {
  978. display: table-cell !important; }
  979. .pxer-app .d-sm-flex {
  980. display: flex !important; }
  981. .pxer-app .d-sm-inline-flex {
  982. display: inline-flex !important; } }
  983. @media (min-width: 768px) {
  984. .pxer-app .d-md-none {
  985. display: none !important; }
  986. .pxer-app .d-md-inline {
  987. display: inline !important; }
  988. .pxer-app .d-md-inline-block {
  989. display: inline-block !important; }
  990. .pxer-app .d-md-block {
  991. display: block !important; }
  992. .pxer-app .d-md-table {
  993. display: table !important; }
  994. .pxer-app .d-md-table-row {
  995. display: table-row !important; }
  996. .pxer-app .d-md-table-cell {
  997. display: table-cell !important; }
  998. .pxer-app .d-md-flex {
  999. display: flex !important; }
  1000. .pxer-app .d-md-inline-flex {
  1001. display: inline-flex !important; } }
  1002. @media (min-width: 992px) {
  1003. .pxer-app .d-lg-none {
  1004. display: none !important; }
  1005. .pxer-app .d-lg-inline {
  1006. display: inline !important; }
  1007. .pxer-app .d-lg-inline-block {
  1008. display: inline-block !important; }
  1009. .pxer-app .d-lg-block {
  1010. display: block !important; }
  1011. .pxer-app .d-lg-table {
  1012. display: table !important; }
  1013. .pxer-app .d-lg-table-row {
  1014. display: table-row !important; }
  1015. .pxer-app .d-lg-table-cell {
  1016. display: table-cell !important; }
  1017. .pxer-app .d-lg-flex {
  1018. display: flex !important; }
  1019. .pxer-app .d-lg-inline-flex {
  1020. display: inline-flex !important; } }
  1021. @media (min-width: 1200px) {
  1022. .pxer-app .d-xl-none {
  1023. display: none !important; }
  1024. .pxer-app .d-xl-inline {
  1025. display: inline !important; }
  1026. .pxer-app .d-xl-inline-block {
  1027. display: inline-block !important; }
  1028. .pxer-app .d-xl-block {
  1029. display: block !important; }
  1030. .pxer-app .d-xl-table {
  1031. display: table !important; }
  1032. .pxer-app .d-xl-table-row {
  1033. display: table-row !important; }
  1034. .pxer-app .d-xl-table-cell {
  1035. display: table-cell !important; }
  1036. .pxer-app .d-xl-flex {
  1037. display: flex !important; }
  1038. .pxer-app .d-xl-inline-flex {
  1039. display: inline-flex !important; } }
  1040. @media print {
  1041. .pxer-app .d-print-none {
  1042. display: none !important; }
  1043. .pxer-app .d-print-inline {
  1044. display: inline !important; }
  1045. .pxer-app .d-print-inline-block {
  1046. display: inline-block !important; }
  1047. .pxer-app .d-print-block {
  1048. display: block !important; }
  1049. .pxer-app .d-print-table {
  1050. display: table !important; }
  1051. .pxer-app .d-print-table-row {
  1052. display: table-row !important; }
  1053. .pxer-app .d-print-table-cell {
  1054. display: table-cell !important; }
  1055. .pxer-app .d-print-flex {
  1056. display: flex !important; }
  1057. .pxer-app .d-print-inline-flex {
  1058. display: inline-flex !important; } }
  1059. .pxer-app .flex-row {
  1060. flex-direction: row !important; }
  1061. .pxer-app .flex-column {
  1062. flex-direction: column !important; }
  1063. .pxer-app .flex-row-reverse {
  1064. flex-direction: row-reverse !important; }
  1065. .pxer-app .flex-column-reverse {
  1066. flex-direction: column-reverse !important; }
  1067. .pxer-app .flex-wrap {
  1068. flex-wrap: wrap !important; }
  1069. .pxer-app .flex-nowrap {
  1070. flex-wrap: nowrap !important; }
  1071. .pxer-app .flex-wrap-reverse {
  1072. flex-wrap: wrap-reverse !important; }
  1073. .pxer-app .flex-fill {
  1074. flex: 1 1 auto !important; }
  1075. .pxer-app .flex-grow-0 {
  1076. flex-grow: 0 !important; }
  1077. .pxer-app .flex-grow-1 {
  1078. flex-grow: 1 !important; }
  1079. .pxer-app .flex-shrink-0 {
  1080. flex-shrink: 0 !important; }
  1081. .pxer-app .flex-shrink-1 {
  1082. flex-shrink: 1 !important; }
  1083. .pxer-app .justify-content-start {
  1084. justify-content: flex-start !important; }
  1085. .pxer-app .justify-content-end {
  1086. justify-content: flex-end !important; }
  1087. .pxer-app .justify-content-center {
  1088. justify-content: center !important; }
  1089. .pxer-app .justify-content-between {
  1090. justify-content: space-between !important; }
  1091. .pxer-app .justify-content-around {
  1092. justify-content: space-around !important; }
  1093. .pxer-app .align-items-start {
  1094. align-items: flex-start !important; }
  1095. .pxer-app .align-items-end {
  1096. align-items: flex-end !important; }
  1097. .pxer-app .align-items-center {
  1098. align-items: center !important; }
  1099. .pxer-app .align-items-baseline {
  1100. align-items: baseline !important; }
  1101. .pxer-app .align-items-stretch {
  1102. align-items: stretch !important; }
  1103. .pxer-app .align-content-start {
  1104. align-content: flex-start !important; }
  1105. .pxer-app .align-content-end {
  1106. align-content: flex-end !important; }
  1107. .pxer-app .align-content-center {
  1108. align-content: center !important; }
  1109. .pxer-app .align-content-between {
  1110. align-content: space-between !important; }
  1111. .pxer-app .align-content-around {
  1112. align-content: space-around !important; }
  1113. .pxer-app .align-content-stretch {
  1114. align-content: stretch !important; }
  1115. .pxer-app .align-self-auto {
  1116. align-self: auto !important; }
  1117. .pxer-app .align-self-start {
  1118. align-self: flex-start !important; }
  1119. .pxer-app .align-self-end {
  1120. align-self: flex-end !important; }
  1121. .pxer-app .align-self-center {
  1122. align-self: center !important; }
  1123. .pxer-app .align-self-baseline {
  1124. align-self: baseline !important; }
  1125. .pxer-app .align-self-stretch {
  1126. align-self: stretch !important; }
  1127. @media (min-width: 576px) {
  1128. .pxer-app .flex-sm-row {
  1129. flex-direction: row !important; }
  1130. .pxer-app .flex-sm-column {
  1131. flex-direction: column !important; }
  1132. .pxer-app .flex-sm-row-reverse {
  1133. flex-direction: row-reverse !important; }
  1134. .pxer-app .flex-sm-column-reverse {
  1135. flex-direction: column-reverse !important; }
  1136. .pxer-app .flex-sm-wrap {
  1137. flex-wrap: wrap !important; }
  1138. .pxer-app .flex-sm-nowrap {
  1139. flex-wrap: nowrap !important; }
  1140. .pxer-app .flex-sm-wrap-reverse {
  1141. flex-wrap: wrap-reverse !important; }
  1142. .pxer-app .flex-sm-fill {
  1143. flex: 1 1 auto !important; }
  1144. .pxer-app .flex-sm-grow-0 {
  1145. flex-grow: 0 !important; }
  1146. .pxer-app .flex-sm-grow-1 {
  1147. flex-grow: 1 !important; }
  1148. .pxer-app .flex-sm-shrink-0 {
  1149. flex-shrink: 0 !important; }
  1150. .pxer-app .flex-sm-shrink-1 {
  1151. flex-shrink: 1 !important; }
  1152. .pxer-app .justify-content-sm-start {
  1153. justify-content: flex-start !important; }
  1154. .pxer-app .justify-content-sm-end {
  1155. justify-content: flex-end !important; }
  1156. .pxer-app .justify-content-sm-center {
  1157. justify-content: center !important; }
  1158. .pxer-app .justify-content-sm-between {
  1159. justify-content: space-between !important; }
  1160. .pxer-app .justify-content-sm-around {
  1161. justify-content: space-around !important; }
  1162. .pxer-app .align-items-sm-start {
  1163. align-items: flex-start !important; }
  1164. .pxer-app .align-items-sm-end {
  1165. align-items: flex-end !important; }
  1166. .pxer-app .align-items-sm-center {
  1167. align-items: center !important; }
  1168. .pxer-app .align-items-sm-baseline {
  1169. align-items: baseline !important; }
  1170. .pxer-app .align-items-sm-stretch {
  1171. align-items: stretch !important; }
  1172. .pxer-app .align-content-sm-start {
  1173. align-content: flex-start !important; }
  1174. .pxer-app .align-content-sm-end {
  1175. align-content: flex-end !important; }
  1176. .pxer-app .align-content-sm-center {
  1177. align-content: center !important; }
  1178. .pxer-app .align-content-sm-between {
  1179. align-content: space-between !important; }
  1180. .pxer-app .align-content-sm-around {
  1181. align-content: space-around !important; }
  1182. .pxer-app .align-content-sm-stretch {
  1183. align-content: stretch !important; }
  1184. .pxer-app .align-self-sm-auto {
  1185. align-self: auto !important; }
  1186. .pxer-app .align-self-sm-start {
  1187. align-self: flex-start !important; }
  1188. .pxer-app .align-self-sm-end {
  1189. align-self: flex-end !important; }
  1190. .pxer-app .align-self-sm-center {
  1191. align-self: center !important; }
  1192. .pxer-app .align-self-sm-baseline {
  1193. align-self: baseline !important; }
  1194. .pxer-app .align-self-sm-stretch {
  1195. align-self: stretch !important; } }
  1196. @media (min-width: 768px) {
  1197. .pxer-app .flex-md-row {
  1198. flex-direction: row !important; }
  1199. .pxer-app .flex-md-column {
  1200. flex-direction: column !important; }
  1201. .pxer-app .flex-md-row-reverse {
  1202. flex-direction: row-reverse !important; }
  1203. .pxer-app .flex-md-column-reverse {
  1204. flex-direction: column-reverse !important; }
  1205. .pxer-app .flex-md-wrap {
  1206. flex-wrap: wrap !important; }
  1207. .pxer-app .flex-md-nowrap {
  1208. flex-wrap: nowrap !important; }
  1209. .pxer-app .flex-md-wrap-reverse {
  1210. flex-wrap: wrap-reverse !important; }
  1211. .pxer-app .flex-md-fill {
  1212. flex: 1 1 auto !important; }
  1213. .pxer-app .flex-md-grow-0 {
  1214. flex-grow: 0 !important; }
  1215. .pxer-app .flex-md-grow-1 {
  1216. flex-grow: 1 !important; }
  1217. .pxer-app .flex-md-shrink-0 {
  1218. flex-shrink: 0 !important; }
  1219. .pxer-app .flex-md-shrink-1 {
  1220. flex-shrink: 1 !important; }
  1221. .pxer-app .justify-content-md-start {
  1222. justify-content: flex-start !important; }
  1223. .pxer-app .justify-content-md-end {
  1224. justify-content: flex-end !important; }
  1225. .pxer-app .justify-content-md-center {
  1226. justify-content: center !important; }
  1227. .pxer-app .justify-content-md-between {
  1228. justify-content: space-between !important; }
  1229. .pxer-app .justify-content-md-around {
  1230. justify-content: space-around !important; }
  1231. .pxer-app .align-items-md-start {
  1232. align-items: flex-start !important; }
  1233. .pxer-app .align-items-md-end {
  1234. align-items: flex-end !important; }
  1235. .pxer-app .align-items-md-center {
  1236. align-items: center !important; }
  1237. .pxer-app .align-items-md-baseline {
  1238. align-items: baseline !important; }
  1239. .pxer-app .align-items-md-stretch {
  1240. align-items: stretch !important; }
  1241. .pxer-app .align-content-md-start {
  1242. align-content: flex-start !important; }
  1243. .pxer-app .align-content-md-end {
  1244. align-content: flex-end !important; }
  1245. .pxer-app .align-content-md-center {
  1246. align-content: center !important; }
  1247. .pxer-app .align-content-md-between {
  1248. align-content: space-between !important; }
  1249. .pxer-app .align-content-md-around {
  1250. align-content: space-around !important; }
  1251. .pxer-app .align-content-md-stretch {
  1252. align-content: stretch !important; }
  1253. .pxer-app .align-self-md-auto {
  1254. align-self: auto !important; }
  1255. .pxer-app .align-self-md-start {
  1256. align-self: flex-start !important; }
  1257. .pxer-app .align-self-md-end {
  1258. align-self: flex-end !important; }
  1259. .pxer-app .align-self-md-center {
  1260. align-self: center !important; }
  1261. .pxer-app .align-self-md-baseline {
  1262. align-self: baseline !important; }
  1263. .pxer-app .align-self-md-stretch {
  1264. align-self: stretch !important; } }
  1265. @media (min-width: 992px) {
  1266. .pxer-app .flex-lg-row {
  1267. flex-direction: row !important; }
  1268. .pxer-app .flex-lg-column {
  1269. flex-direction: column !important; }
  1270. .pxer-app .flex-lg-row-reverse {
  1271. flex-direction: row-reverse !important; }
  1272. .pxer-app .flex-lg-column-reverse {
  1273. flex-direction: column-reverse !important; }
  1274. .pxer-app .flex-lg-wrap {
  1275. flex-wrap: wrap !important; }
  1276. .pxer-app .flex-lg-nowrap {
  1277. flex-wrap: nowrap !important; }
  1278. .pxer-app .flex-lg-wrap-reverse {
  1279. flex-wrap: wrap-reverse !important; }
  1280. .pxer-app .flex-lg-fill {
  1281. flex: 1 1 auto !important; }
  1282. .pxer-app .flex-lg-grow-0 {
  1283. flex-grow: 0 !important; }
  1284. .pxer-app .flex-lg-grow-1 {
  1285. flex-grow: 1 !important; }
  1286. .pxer-app .flex-lg-shrink-0 {
  1287. flex-shrink: 0 !important; }
  1288. .pxer-app .flex-lg-shrink-1 {
  1289. flex-shrink: 1 !important; }
  1290. .pxer-app .justify-content-lg-start {
  1291. justify-content: flex-start !important; }
  1292. .pxer-app .justify-content-lg-end {
  1293. justify-content: flex-end !important; }
  1294. .pxer-app .justify-content-lg-center {
  1295. justify-content: center !important; }
  1296. .pxer-app .justify-content-lg-between {
  1297. justify-content: space-between !important; }
  1298. .pxer-app .justify-content-lg-around {
  1299. justify-content: space-around !important; }
  1300. .pxer-app .align-items-lg-start {
  1301. align-items: flex-start !important; }
  1302. .pxer-app .align-items-lg-end {
  1303. align-items: flex-end !important; }
  1304. .pxer-app .align-items-lg-center {
  1305. align-items: center !important; }
  1306. .pxer-app .align-items-lg-baseline {
  1307. align-items: baseline !important; }
  1308. .pxer-app .align-items-lg-stretch {
  1309. align-items: stretch !important; }
  1310. .pxer-app .align-content-lg-start {
  1311. align-content: flex-start !important; }
  1312. .pxer-app .align-content-lg-end {
  1313. align-content: flex-end !important; }
  1314. .pxer-app .align-content-lg-center {
  1315. align-content: center !important; }
  1316. .pxer-app .align-content-lg-between {
  1317. align-content: space-between !important; }
  1318. .pxer-app .align-content-lg-around {
  1319. align-content: space-around !important; }
  1320. .pxer-app .align-content-lg-stretch {
  1321. align-content: stretch !important; }
  1322. .pxer-app .align-self-lg-auto {
  1323. align-self: auto !important; }
  1324. .pxer-app .align-self-lg-start {
  1325. align-self: flex-start !important; }
  1326. .pxer-app .align-self-lg-end {
  1327. align-self: flex-end !important; }
  1328. .pxer-app .align-self-lg-center {
  1329. align-self: center !important; }
  1330. .pxer-app .align-self-lg-baseline {
  1331. align-self: baseline !important; }
  1332. .pxer-app .align-self-lg-stretch {
  1333. align-self: stretch !important; } }
  1334. @media (min-width: 1200px) {
  1335. .pxer-app .flex-xl-row {
  1336. flex-direction: row !important; }
  1337. .pxer-app .flex-xl-column {
  1338. flex-direction: column !important; }
  1339. .pxer-app .flex-xl-row-reverse {
  1340. flex-direction: row-reverse !important; }
  1341. .pxer-app .flex-xl-column-reverse {
  1342. flex-direction: column-reverse !important; }
  1343. .pxer-app .flex-xl-wrap {
  1344. flex-wrap: wrap !important; }
  1345. .pxer-app .flex-xl-nowrap {
  1346. flex-wrap: nowrap !important; }
  1347. .pxer-app .flex-xl-wrap-reverse {
  1348. flex-wrap: wrap-reverse !important; }
  1349. .pxer-app .flex-xl-fill {
  1350. flex: 1 1 auto !important; }
  1351. .pxer-app .flex-xl-grow-0 {
  1352. flex-grow: 0 !important; }
  1353. .pxer-app .flex-xl-grow-1 {
  1354. flex-grow: 1 !important; }
  1355. .pxer-app .flex-xl-shrink-0 {
  1356. flex-shrink: 0 !important; }
  1357. .pxer-app .flex-xl-shrink-1 {
  1358. flex-shrink: 1 !important; }
  1359. .pxer-app .justify-content-xl-start {
  1360. justify-content: flex-start !important; }
  1361. .pxer-app .justify-content-xl-end {
  1362. justify-content: flex-end !important; }
  1363. .pxer-app .justify-content-xl-center {
  1364. justify-content: center !important; }
  1365. .pxer-app .justify-content-xl-between {
  1366. justify-content: space-between !important; }
  1367. .pxer-app .justify-content-xl-around {
  1368. justify-content: space-around !important; }
  1369. .pxer-app .align-items-xl-start {
  1370. align-items: flex-start !important; }
  1371. .pxer-app .align-items-xl-end {
  1372. align-items: flex-end !important; }
  1373. .pxer-app .align-items-xl-center {
  1374. align-items: center !important; }
  1375. .pxer-app .align-items-xl-baseline {
  1376. align-items: baseline !important; }
  1377. .pxer-app .align-items-xl-stretch {
  1378. align-items: stretch !important; }
  1379. .pxer-app .align-content-xl-start {
  1380. align-content: flex-start !important; }
  1381. .pxer-app .align-content-xl-end {
  1382. align-content: flex-end !important; }
  1383. .pxer-app .align-content-xl-center {
  1384. align-content: center !important; }
  1385. .pxer-app .align-content-xl-between {
  1386. align-content: space-between !important; }
  1387. .pxer-app .align-content-xl-around {
  1388. align-content: space-around !important; }
  1389. .pxer-app .align-content-xl-stretch {
  1390. align-content: stretch !important; }
  1391. .pxer-app .align-self-xl-auto {
  1392. align-self: auto !important; }
  1393. .pxer-app .align-self-xl-start {
  1394. align-self: flex-start !important; }
  1395. .pxer-app .align-self-xl-end {
  1396. align-self: flex-end !important; }
  1397. .pxer-app .align-self-xl-center {
  1398. align-self: center !important; }
  1399. .pxer-app .align-self-xl-baseline {
  1400. align-self: baseline !important; }
  1401. .pxer-app .align-self-xl-stretch {
  1402. align-self: stretch !important; } }
  1403. .pxer-app .m-0 {
  1404. margin: 0 !important; }
  1405. .pxer-app .mt-0,
  1406. .pxer-app .my-0 {
  1407. margin-top: 0 !important; }
  1408. .pxer-app .mr-0,
  1409. .pxer-app .mx-0 {
  1410. margin-right: 0 !important; }
  1411. .pxer-app .mb-0,
  1412. .pxer-app .my-0 {
  1413. margin-bottom: 0 !important; }
  1414. .pxer-app .ml-0,
  1415. .pxer-app .mx-0 {
  1416. margin-left: 0 !important; }
  1417. .pxer-app .m-1 {
  1418. margin: 0.25rem !important; }
  1419. .pxer-app .mt-1,
  1420. .pxer-app .my-1 {
  1421. margin-top: 0.25rem !important; }
  1422. .pxer-app .mr-1,
  1423. .pxer-app .mx-1 {
  1424. margin-right: 0.25rem !important; }
  1425. .pxer-app .mb-1,
  1426. .pxer-app .my-1 {
  1427. margin-bottom: 0.25rem !important; }
  1428. .pxer-app .ml-1,
  1429. .pxer-app .mx-1 {
  1430. margin-left: 0.25rem !important; }
  1431. .pxer-app .m-2 {
  1432. margin: 0.5rem !important; }
  1433. .pxer-app .mt-2,
  1434. .pxer-app .my-2 {
  1435. margin-top: 0.5rem !important; }
  1436. .pxer-app .mr-2,
  1437. .pxer-app .mx-2 {
  1438. margin-right: 0.5rem !important; }
  1439. .pxer-app .mb-2,
  1440. .pxer-app .my-2 {
  1441. margin-bottom: 0.5rem !important; }
  1442. .pxer-app .ml-2,
  1443. .pxer-app .mx-2 {
  1444. margin-left: 0.5rem !important; }
  1445. .pxer-app .m-3 {
  1446. margin: 1rem !important; }
  1447. .pxer-app .mt-3,
  1448. .pxer-app .my-3 {
  1449. margin-top: 1rem !important; }
  1450. .pxer-app .mr-3,
  1451. .pxer-app .mx-3 {
  1452. margin-right: 1rem !important; }
  1453. .pxer-app .mb-3,
  1454. .pxer-app .my-3 {
  1455. margin-bottom: 1rem !important; }
  1456. .pxer-app .ml-3,
  1457. .pxer-app .mx-3 {
  1458. margin-left: 1rem !important; }
  1459. .pxer-app .m-4 {
  1460. margin: 1.5rem !important; }
  1461. .pxer-app .mt-4,
  1462. .pxer-app .my-4 {
  1463. margin-top: 1.5rem !important; }
  1464. .pxer-app .mr-4,
  1465. .pxer-app .mx-4 {
  1466. margin-right: 1.5rem !important; }
  1467. .pxer-app .mb-4,
  1468. .pxer-app .my-4 {
  1469. margin-bottom: 1.5rem !important; }
  1470. .pxer-app .ml-4,
  1471. .pxer-app .mx-4 {
  1472. margin-left: 1.5rem !important; }
  1473. .pxer-app .m-5 {
  1474. margin: 3rem !important; }
  1475. .pxer-app .mt-5,
  1476. .pxer-app .my-5 {
  1477. margin-top: 3rem !important; }
  1478. .pxer-app .mr-5,
  1479. .pxer-app .mx-5 {
  1480. margin-right: 3rem !important; }
  1481. .pxer-app .mb-5,
  1482. .pxer-app .my-5 {
  1483. margin-bottom: 3rem !important; }
  1484. .pxer-app .ml-5,
  1485. .pxer-app .mx-5 {
  1486. margin-left: 3rem !important; }
  1487. .pxer-app .p-0 {
  1488. padding: 0 !important; }
  1489. .pxer-app .pt-0,
  1490. .pxer-app .py-0 {
  1491. padding-top: 0 !important; }
  1492. .pxer-app .pr-0,
  1493. .pxer-app .px-0 {
  1494. padding-right: 0 !important; }
  1495. .pxer-app .pb-0,
  1496. .pxer-app .py-0 {
  1497. padding-bottom: 0 !important; }
  1498. .pxer-app .pl-0,
  1499. .pxer-app .px-0 {
  1500. padding-left: 0 !important; }
  1501. .pxer-app .p-1 {
  1502. padding: 0.25rem !important; }
  1503. .pxer-app .pt-1,
  1504. .pxer-app .py-1 {
  1505. padding-top: 0.25rem !important; }
  1506. .pxer-app .pr-1,
  1507. .pxer-app .px-1 {
  1508. padding-right: 0.25rem !important; }
  1509. .pxer-app .pb-1,
  1510. .pxer-app .py-1 {
  1511. padding-bottom: 0.25rem !important; }
  1512. .pxer-app .pl-1,
  1513. .pxer-app .px-1 {
  1514. padding-left: 0.25rem !important; }
  1515. .pxer-app .p-2 {
  1516. padding: 0.5rem !important; }
  1517. .pxer-app .pt-2,
  1518. .pxer-app .py-2 {
  1519. padding-top: 0.5rem !important; }
  1520. .pxer-app .pr-2,
  1521. .pxer-app .px-2 {
  1522. padding-right: 0.5rem !important; }
  1523. .pxer-app .pb-2,
  1524. .pxer-app .py-2 {
  1525. padding-bottom: 0.5rem !important; }
  1526. .pxer-app .pl-2,
  1527. .pxer-app .px-2 {
  1528. padding-left: 0.5rem !important; }
  1529. .pxer-app .p-3 {
  1530. padding: 1rem !important; }
  1531. .pxer-app .pt-3,
  1532. .pxer-app .py-3 {
  1533. padding-top: 1rem !important; }
  1534. .pxer-app .pr-3,
  1535. .pxer-app .px-3 {
  1536. padding-right: 1rem !important; }
  1537. .pxer-app .pb-3,
  1538. .pxer-app .py-3 {
  1539. padding-bottom: 1rem !important; }
  1540. .pxer-app .pl-3,
  1541. .pxer-app .px-3 {
  1542. padding-left: 1rem !important; }
  1543. .pxer-app .p-4 {
  1544. padding: 1.5rem !important; }
  1545. .pxer-app .pt-4,
  1546. .pxer-app .py-4 {
  1547. padding-top: 1.5rem !important; }
  1548. .pxer-app .pr-4,
  1549. .pxer-app .px-4 {
  1550. padding-right: 1.5rem !important; }
  1551. .pxer-app .pb-4,
  1552. .pxer-app .py-4 {
  1553. padding-bottom: 1.5rem !important; }
  1554. .pxer-app .pl-4,
  1555. .pxer-app .px-4 {
  1556. padding-left: 1.5rem !important; }
  1557. .pxer-app .p-5 {
  1558. padding: 3rem !important; }
  1559. .pxer-app .pt-5,
  1560. .pxer-app .py-5 {
  1561. padding-top: 3rem !important; }
  1562. .pxer-app .pr-5,
  1563. .pxer-app .px-5 {
  1564. padding-right: 3rem !important; }
  1565. .pxer-app .pb-5,
  1566. .pxer-app .py-5 {
  1567. padding-bottom: 3rem !important; }
  1568. .pxer-app .pl-5,
  1569. .pxer-app .px-5 {
  1570. padding-left: 3rem !important; }
  1571. .pxer-app .m-n1 {
  1572. margin: -0.25rem !important; }
  1573. .pxer-app .mt-n1,
  1574. .pxer-app .my-n1 {
  1575. margin-top: -0.25rem !important; }
  1576. .pxer-app .mr-n1,
  1577. .pxer-app .mx-n1 {
  1578. margin-right: -0.25rem !important; }
  1579. .pxer-app .mb-n1,
  1580. .pxer-app .my-n1 {
  1581. margin-bottom: -0.25rem !important; }
  1582. .pxer-app .ml-n1,
  1583. .pxer-app .mx-n1 {
  1584. margin-left: -0.25rem !important; }
  1585. .pxer-app .m-n2 {
  1586. margin: -0.5rem !important; }
  1587. .pxer-app .mt-n2,
  1588. .pxer-app .my-n2 {
  1589. margin-top: -0.5rem !important; }
  1590. .pxer-app .mr-n2,
  1591. .pxer-app .mx-n2 {
  1592. margin-right: -0.5rem !important; }
  1593. .pxer-app .mb-n2,
  1594. .pxer-app .my-n2 {
  1595. margin-bottom: -0.5rem !important; }
  1596. .pxer-app .ml-n2,
  1597. .pxer-app .mx-n2 {
  1598. margin-left: -0.5rem !important; }
  1599. .pxer-app .m-n3 {
  1600. margin: -1rem !important; }
  1601. .pxer-app .mt-n3,
  1602. .pxer-app .my-n3 {
  1603. margin-top: -1rem !important; }
  1604. .pxer-app .mr-n3,
  1605. .pxer-app .mx-n3 {
  1606. margin-right: -1rem !important; }
  1607. .pxer-app .mb-n3,
  1608. .pxer-app .my-n3 {
  1609. margin-bottom: -1rem !important; }
  1610. .pxer-app .ml-n3,
  1611. .pxer-app .mx-n3 {
  1612. margin-left: -1rem !important; }
  1613. .pxer-app .m-n4 {
  1614. margin: -1.5rem !important; }
  1615. .pxer-app .mt-n4,
  1616. .pxer-app .my-n4 {
  1617. margin-top: -1.5rem !important; }
  1618. .pxer-app .mr-n4,
  1619. .pxer-app .mx-n4 {
  1620. margin-right: -1.5rem !important; }
  1621. .pxer-app .mb-n4,
  1622. .pxer-app .my-n4 {
  1623. margin-bottom: -1.5rem !important; }
  1624. .pxer-app .ml-n4,
  1625. .pxer-app .mx-n4 {
  1626. margin-left: -1.5rem !important; }
  1627. .pxer-app .m-n5 {
  1628. margin: -3rem !important; }
  1629. .pxer-app .mt-n5,
  1630. .pxer-app .my-n5 {
  1631. margin-top: -3rem !important; }
  1632. .pxer-app .mr-n5,
  1633. .pxer-app .mx-n5 {
  1634. margin-right: -3rem !important; }
  1635. .pxer-app .mb-n5,
  1636. .pxer-app .my-n5 {
  1637. margin-bottom: -3rem !important; }
  1638. .pxer-app .ml-n5,
  1639. .pxer-app .mx-n5 {
  1640. margin-left: -3rem !important; }
  1641. .pxer-app .m-auto {
  1642. margin: auto !important; }
  1643. .pxer-app .mt-auto,
  1644. .pxer-app .my-auto {
  1645. margin-top: auto !important; }
  1646. .pxer-app .mr-auto,
  1647. .pxer-app .mx-auto {
  1648. margin-right: auto !important; }
  1649. .pxer-app .mb-auto,
  1650. .pxer-app .my-auto {
  1651. margin-bottom: auto !important; }
  1652. .pxer-app .ml-auto,
  1653. .pxer-app .mx-auto {
  1654. margin-left: auto !important; }
  1655. @media (min-width: 576px) {
  1656. .pxer-app .m-sm-0 {
  1657. margin: 0 !important; }
  1658. .pxer-app .mt-sm-0,
  1659. .pxer-app .my-sm-0 {
  1660. margin-top: 0 !important; }
  1661. .pxer-app .mr-sm-0,
  1662. .pxer-app .mx-sm-0 {
  1663. margin-right: 0 !important; }
  1664. .pxer-app .mb-sm-0,
  1665. .pxer-app .my-sm-0 {
  1666. margin-bottom: 0 !important; }
  1667. .pxer-app .ml-sm-0,
  1668. .pxer-app .mx-sm-0 {
  1669. margin-left: 0 !important; }
  1670. .pxer-app .m-sm-1 {
  1671. margin: 0.25rem !important; }
  1672. .pxer-app .mt-sm-1,
  1673. .pxer-app .my-sm-1 {
  1674. margin-top: 0.25rem !important; }
  1675. .pxer-app .mr-sm-1,
  1676. .pxer-app .mx-sm-1 {
  1677. margin-right: 0.25rem !important; }
  1678. .pxer-app .mb-sm-1,
  1679. .pxer-app .my-sm-1 {
  1680. margin-bottom: 0.25rem !important; }
  1681. .pxer-app .ml-sm-1,
  1682. .pxer-app .mx-sm-1 {
  1683. margin-left: 0.25rem !important; }
  1684. .pxer-app .m-sm-2 {
  1685. margin: 0.5rem !important; }
  1686. .pxer-app .mt-sm-2,
  1687. .pxer-app .my-sm-2 {
  1688. margin-top: 0.5rem !important; }
  1689. .pxer-app .mr-sm-2,
  1690. .pxer-app .mx-sm-2 {
  1691. margin-right: 0.5rem !important; }
  1692. .pxer-app .mb-sm-2,
  1693. .pxer-app .my-sm-2 {
  1694. margin-bottom: 0.5rem !important; }
  1695. .pxer-app .ml-sm-2,
  1696. .pxer-app .mx-sm-2 {
  1697. margin-left: 0.5rem !important; }
  1698. .pxer-app .m-sm-3 {
  1699. margin: 1rem !important; }
  1700. .pxer-app .mt-sm-3,
  1701. .pxer-app .my-sm-3 {
  1702. margin-top: 1rem !important; }
  1703. .pxer-app .mr-sm-3,
  1704. .pxer-app .mx-sm-3 {
  1705. margin-right: 1rem !important; }
  1706. .pxer-app .mb-sm-3,
  1707. .pxer-app .my-sm-3 {
  1708. margin-bottom: 1rem !important; }
  1709. .pxer-app .ml-sm-3,
  1710. .pxer-app .mx-sm-3 {
  1711. margin-left: 1rem !important; }
  1712. .pxer-app .m-sm-4 {
  1713. margin: 1.5rem !important; }
  1714. .pxer-app .mt-sm-4,
  1715. .pxer-app .my-sm-4 {
  1716. margin-top: 1.5rem !important; }
  1717. .pxer-app .mr-sm-4,
  1718. .pxer-app .mx-sm-4 {
  1719. margin-right: 1.5rem !important; }
  1720. .pxer-app .mb-sm-4,
  1721. .pxer-app .my-sm-4 {
  1722. margin-bottom: 1.5rem !important; }
  1723. .pxer-app .ml-sm-4,
  1724. .pxer-app .mx-sm-4 {
  1725. margin-left: 1.5rem !important; }
  1726. .pxer-app .m-sm-5 {
  1727. margin: 3rem !important; }
  1728. .pxer-app .mt-sm-5,
  1729. .pxer-app .my-sm-5 {
  1730. margin-top: 3rem !important; }
  1731. .pxer-app .mr-sm-5,
  1732. .pxer-app .mx-sm-5 {
  1733. margin-right: 3rem !important; }
  1734. .pxer-app .mb-sm-5,
  1735. .pxer-app .my-sm-5 {
  1736. margin-bottom: 3rem !important; }
  1737. .pxer-app .ml-sm-5,
  1738. .pxer-app .mx-sm-5 {
  1739. margin-left: 3rem !important; }
  1740. .pxer-app .p-sm-0 {
  1741. padding: 0 !important; }
  1742. .pxer-app .pt-sm-0,
  1743. .pxer-app .py-sm-0 {
  1744. padding-top: 0 !important; }
  1745. .pxer-app .pr-sm-0,
  1746. .pxer-app .px-sm-0 {
  1747. padding-right: 0 !important; }
  1748. .pxer-app .pb-sm-0,
  1749. .pxer-app .py-sm-0 {
  1750. padding-bottom: 0 !important; }
  1751. .pxer-app .pl-sm-0,
  1752. .pxer-app .px-sm-0 {
  1753. padding-left: 0 !important; }
  1754. .pxer-app .p-sm-1 {
  1755. padding: 0.25rem !important; }
  1756. .pxer-app .pt-sm-1,
  1757. .pxer-app .py-sm-1 {
  1758. padding-top: 0.25rem !important; }
  1759. .pxer-app .pr-sm-1,
  1760. .pxer-app .px-sm-1 {
  1761. padding-right: 0.25rem !important; }
  1762. .pxer-app .pb-sm-1,
  1763. .pxer-app .py-sm-1 {
  1764. padding-bottom: 0.25rem !important; }
  1765. .pxer-app .pl-sm-1,
  1766. .pxer-app .px-sm-1 {
  1767. padding-left: 0.25rem !important; }
  1768. .pxer-app .p-sm-2 {
  1769. padding: 0.5rem !important; }
  1770. .pxer-app .pt-sm-2,
  1771. .pxer-app .py-sm-2 {
  1772. padding-top: 0.5rem !important; }
  1773. .pxer-app .pr-sm-2,
  1774. .pxer-app .px-sm-2 {
  1775. padding-right: 0.5rem !important; }
  1776. .pxer-app .pb-sm-2,
  1777. .pxer-app .py-sm-2 {
  1778. padding-bottom: 0.5rem !important; }
  1779. .pxer-app .pl-sm-2,
  1780. .pxer-app .px-sm-2 {
  1781. padding-left: 0.5rem !important; }
  1782. .pxer-app .p-sm-3 {
  1783. padding: 1rem !important; }
  1784. .pxer-app .pt-sm-3,
  1785. .pxer-app .py-sm-3 {
  1786. padding-top: 1rem !important; }
  1787. .pxer-app .pr-sm-3,
  1788. .pxer-app .px-sm-3 {
  1789. padding-right: 1rem !important; }
  1790. .pxer-app .pb-sm-3,
  1791. .pxer-app .py-sm-3 {
  1792. padding-bottom: 1rem !important; }
  1793. .pxer-app .pl-sm-3,
  1794. .pxer-app .px-sm-3 {
  1795. padding-left: 1rem !important; }
  1796. .pxer-app .p-sm-4 {
  1797. padding: 1.5rem !important; }
  1798. .pxer-app .pt-sm-4,
  1799. .pxer-app .py-sm-4 {
  1800. padding-top: 1.5rem !important; }
  1801. .pxer-app .pr-sm-4,
  1802. .pxer-app .px-sm-4 {
  1803. padding-right: 1.5rem !important; }
  1804. .pxer-app .pb-sm-4,
  1805. .pxer-app .py-sm-4 {
  1806. padding-bottom: 1.5rem !important; }
  1807. .pxer-app .pl-sm-4,
  1808. .pxer-app .px-sm-4 {
  1809. padding-left: 1.5rem !important; }
  1810. .pxer-app .p-sm-5 {
  1811. padding: 3rem !important; }
  1812. .pxer-app .pt-sm-5,
  1813. .pxer-app .py-sm-5 {
  1814. padding-top: 3rem !important; }
  1815. .pxer-app .pr-sm-5,
  1816. .pxer-app .px-sm-5 {
  1817. padding-right: 3rem !important; }
  1818. .pxer-app .pb-sm-5,
  1819. .pxer-app .py-sm-5 {
  1820. padding-bottom: 3rem !important; }
  1821. .pxer-app .pl-sm-5,
  1822. .pxer-app .px-sm-5 {
  1823. padding-left: 3rem !important; }
  1824. .pxer-app .m-sm-n1 {
  1825. margin: -0.25rem !important; }
  1826. .pxer-app .mt-sm-n1,
  1827. .pxer-app .my-sm-n1 {
  1828. margin-top: -0.25rem !important; }
  1829. .pxer-app .mr-sm-n1,
  1830. .pxer-app .mx-sm-n1 {
  1831. margin-right: -0.25rem !important; }
  1832. .pxer-app .mb-sm-n1,
  1833. .pxer-app .my-sm-n1 {
  1834. margin-bottom: -0.25rem !important; }
  1835. .pxer-app .ml-sm-n1,
  1836. .pxer-app .mx-sm-n1 {
  1837. margin-left: -0.25rem !important; }
  1838. .pxer-app .m-sm-n2 {
  1839. margin: -0.5rem !important; }
  1840. .pxer-app .mt-sm-n2,
  1841. .pxer-app .my-sm-n2 {
  1842. margin-top: -0.5rem !important; }
  1843. .pxer-app .mr-sm-n2,
  1844. .pxer-app .mx-sm-n2 {
  1845. margin-right: -0.5rem !important; }
  1846. .pxer-app .mb-sm-n2,
  1847. .pxer-app .my-sm-n2 {
  1848. margin-bottom: -0.5rem !important; }
  1849. .pxer-app .ml-sm-n2,
  1850. .pxer-app .mx-sm-n2 {
  1851. margin-left: -0.5rem !important; }
  1852. .pxer-app .m-sm-n3 {
  1853. margin: -1rem !important; }
  1854. .pxer-app .mt-sm-n3,
  1855. .pxer-app .my-sm-n3 {
  1856. margin-top: -1rem !important; }
  1857. .pxer-app .mr-sm-n3,
  1858. .pxer-app .mx-sm-n3 {
  1859. margin-right: -1rem !important; }
  1860. .pxer-app .mb-sm-n3,
  1861. .pxer-app .my-sm-n3 {
  1862. margin-bottom: -1rem !important; }
  1863. .pxer-app .ml-sm-n3,
  1864. .pxer-app .mx-sm-n3 {
  1865. margin-left: -1rem !important; }
  1866. .pxer-app .m-sm-n4 {
  1867. margin: -1.5rem !important; }
  1868. .pxer-app .mt-sm-n4,
  1869. .pxer-app .my-sm-n4 {
  1870. margin-top: -1.5rem !important; }
  1871. .pxer-app .mr-sm-n4,
  1872. .pxer-app .mx-sm-n4 {
  1873. margin-right: -1.5rem !important; }
  1874. .pxer-app .mb-sm-n4,
  1875. .pxer-app .my-sm-n4 {
  1876. margin-bottom: -1.5rem !important; }
  1877. .pxer-app .ml-sm-n4,
  1878. .pxer-app .mx-sm-n4 {
  1879. margin-left: -1.5rem !important; }
  1880. .pxer-app .m-sm-n5 {
  1881. margin: -3rem !important; }
  1882. .pxer-app .mt-sm-n5,
  1883. .pxer-app .my-sm-n5 {
  1884. margin-top: -3rem !important; }
  1885. .pxer-app .mr-sm-n5,
  1886. .pxer-app .mx-sm-n5 {
  1887. margin-right: -3rem !important; }
  1888. .pxer-app .mb-sm-n5,
  1889. .pxer-app .my-sm-n5 {
  1890. margin-bottom: -3rem !important; }
  1891. .pxer-app .ml-sm-n5,
  1892. .pxer-app .mx-sm-n5 {
  1893. margin-left: -3rem !important; }
  1894. .pxer-app .m-sm-auto {
  1895. margin: auto !important; }
  1896. .pxer-app .mt-sm-auto,
  1897. .pxer-app .my-sm-auto {
  1898. margin-top: auto !important; }
  1899. .pxer-app .mr-sm-auto,
  1900. .pxer-app .mx-sm-auto {
  1901. margin-right: auto !important; }
  1902. .pxer-app .mb-sm-auto,
  1903. .pxer-app .my-sm-auto {
  1904. margin-bottom: auto !important; }
  1905. .pxer-app .ml-sm-auto,
  1906. .pxer-app .mx-sm-auto {
  1907. margin-left: auto !important; } }
  1908. @media (min-width: 768px) {
  1909. .pxer-app .m-md-0 {
  1910. margin: 0 !important; }
  1911. .pxer-app .mt-md-0,
  1912. .pxer-app .my-md-0 {
  1913. margin-top: 0 !important; }
  1914. .pxer-app .mr-md-0,
  1915. .pxer-app .mx-md-0 {
  1916. margin-right: 0 !important; }
  1917. .pxer-app .mb-md-0,
  1918. .pxer-app .my-md-0 {
  1919. margin-bottom: 0 !important; }
  1920. .pxer-app .ml-md-0,
  1921. .pxer-app .mx-md-0 {
  1922. margin-left: 0 !important; }
  1923. .pxer-app .m-md-1 {
  1924. margin: 0.25rem !important; }
  1925. .pxer-app .mt-md-1,
  1926. .pxer-app .my-md-1 {
  1927. margin-top: 0.25rem !important; }
  1928. .pxer-app .mr-md-1,
  1929. .pxer-app .mx-md-1 {
  1930. margin-right: 0.25rem !important; }
  1931. .pxer-app .mb-md-1,
  1932. .pxer-app .my-md-1 {
  1933. margin-bottom: 0.25rem !important; }
  1934. .pxer-app .ml-md-1,
  1935. .pxer-app .mx-md-1 {
  1936. margin-left: 0.25rem !important; }
  1937. .pxer-app .m-md-2 {
  1938. margin: 0.5rem !important; }
  1939. .pxer-app .mt-md-2,
  1940. .pxer-app .my-md-2 {
  1941. margin-top: 0.5rem !important; }
  1942. .pxer-app .mr-md-2,
  1943. .pxer-app .mx-md-2 {
  1944. margin-right: 0.5rem !important; }
  1945. .pxer-app .mb-md-2,
  1946. .pxer-app .my-md-2 {
  1947. margin-bottom: 0.5rem !important; }
  1948. .pxer-app .ml-md-2,
  1949. .pxer-app .mx-md-2 {
  1950. margin-left: 0.5rem !important; }
  1951. .pxer-app .m-md-3 {
  1952. margin: 1rem !important; }
  1953. .pxer-app .mt-md-3,
  1954. .pxer-app .my-md-3 {
  1955. margin-top: 1rem !important; }
  1956. .pxer-app .mr-md-3,
  1957. .pxer-app .mx-md-3 {
  1958. margin-right: 1rem !important; }
  1959. .pxer-app .mb-md-3,
  1960. .pxer-app .my-md-3 {
  1961. margin-bottom: 1rem !important; }
  1962. .pxer-app .ml-md-3,
  1963. .pxer-app .mx-md-3 {
  1964. margin-left: 1rem !important; }
  1965. .pxer-app .m-md-4 {
  1966. margin: 1.5rem !important; }
  1967. .pxer-app .mt-md-4,
  1968. .pxer-app .my-md-4 {
  1969. margin-top: 1.5rem !important; }
  1970. .pxer-app .mr-md-4,
  1971. .pxer-app .mx-md-4 {
  1972. margin-right: 1.5rem !important; }
  1973. .pxer-app .mb-md-4,
  1974. .pxer-app .my-md-4 {
  1975. margin-bottom: 1.5rem !important; }
  1976. .pxer-app .ml-md-4,
  1977. .pxer-app .mx-md-4 {
  1978. margin-left: 1.5rem !important; }
  1979. .pxer-app .m-md-5 {
  1980. margin: 3rem !important; }
  1981. .pxer-app .mt-md-5,
  1982. .pxer-app .my-md-5 {
  1983. margin-top: 3rem !important; }
  1984. .pxer-app .mr-md-5,
  1985. .pxer-app .mx-md-5 {
  1986. margin-right: 3rem !important; }
  1987. .pxer-app .mb-md-5,
  1988. .pxer-app .my-md-5 {
  1989. margin-bottom: 3rem !important; }
  1990. .pxer-app .ml-md-5,
  1991. .pxer-app .mx-md-5 {
  1992. margin-left: 3rem !important; }
  1993. .pxer-app .p-md-0 {
  1994. padding: 0 !important; }
  1995. .pxer-app .pt-md-0,
  1996. .pxer-app .py-md-0 {
  1997. padding-top: 0 !important; }
  1998. .pxer-app .pr-md-0,
  1999. .pxer-app .px-md-0 {
  2000. padding-right: 0 !important; }
  2001. .pxer-app .pb-md-0,
  2002. .pxer-app .py-md-0 {
  2003. padding-bottom: 0 !important; }
  2004. .pxer-app .pl-md-0,
  2005. .pxer-app .px-md-0 {
  2006. padding-left: 0 !important; }
  2007. .pxer-app .p-md-1 {
  2008. padding: 0.25rem !important; }
  2009. .pxer-app .pt-md-1,
  2010. .pxer-app .py-md-1 {
  2011. padding-top: 0.25rem !important; }
  2012. .pxer-app .pr-md-1,
  2013. .pxer-app .px-md-1 {
  2014. padding-right: 0.25rem !important; }
  2015. .pxer-app .pb-md-1,
  2016. .pxer-app .py-md-1 {
  2017. padding-bottom: 0.25rem !important; }
  2018. .pxer-app .pl-md-1,
  2019. .pxer-app .px-md-1 {
  2020. padding-left: 0.25rem !important; }
  2021. .pxer-app .p-md-2 {
  2022. padding: 0.5rem !important; }
  2023. .pxer-app .pt-md-2,
  2024. .pxer-app .py-md-2 {
  2025. padding-top: 0.5rem !important; }
  2026. .pxer-app .pr-md-2,
  2027. .pxer-app .px-md-2 {
  2028. padding-right: 0.5rem !important; }
  2029. .pxer-app .pb-md-2,
  2030. .pxer-app .py-md-2 {
  2031. padding-bottom: 0.5rem !important; }
  2032. .pxer-app .pl-md-2,
  2033. .pxer-app .px-md-2 {
  2034. padding-left: 0.5rem !important; }
  2035. .pxer-app .p-md-3 {
  2036. padding: 1rem !important; }
  2037. .pxer-app .pt-md-3,
  2038. .pxer-app .py-md-3 {
  2039. padding-top: 1rem !important; }
  2040. .pxer-app .pr-md-3,
  2041. .pxer-app .px-md-3 {
  2042. padding-right: 1rem !important; }
  2043. .pxer-app .pb-md-3,
  2044. .pxer-app .py-md-3 {
  2045. padding-bottom: 1rem !important; }
  2046. .pxer-app .pl-md-3,
  2047. .pxer-app .px-md-3 {
  2048. padding-left: 1rem !important; }
  2049. .pxer-app .p-md-4 {
  2050. padding: 1.5rem !important; }
  2051. .pxer-app .pt-md-4,
  2052. .pxer-app .py-md-4 {
  2053. padding-top: 1.5rem !important; }
  2054. .pxer-app .pr-md-4,
  2055. .pxer-app .px-md-4 {
  2056. padding-right: 1.5rem !important; }
  2057. .pxer-app .pb-md-4,
  2058. .pxer-app .py-md-4 {
  2059. padding-bottom: 1.5rem !important; }
  2060. .pxer-app .pl-md-4,
  2061. .pxer-app .px-md-4 {
  2062. padding-left: 1.5rem !important; }
  2063. .pxer-app .p-md-5 {
  2064. padding: 3rem !important; }
  2065. .pxer-app .pt-md-5,
  2066. .pxer-app .py-md-5 {
  2067. padding-top: 3rem !important; }
  2068. .pxer-app .pr-md-5,
  2069. .pxer-app .px-md-5 {
  2070. padding-right: 3rem !important; }
  2071. .pxer-app .pb-md-5,
  2072. .pxer-app .py-md-5 {
  2073. padding-bottom: 3rem !important; }
  2074. .pxer-app .pl-md-5,
  2075. .pxer-app .px-md-5 {
  2076. padding-left: 3rem !important; }
  2077. .pxer-app .m-md-n1 {
  2078. margin: -0.25rem !important; }
  2079. .pxer-app .mt-md-n1,
  2080. .pxer-app .my-md-n1 {
  2081. margin-top: -0.25rem !important; }
  2082. .pxer-app .mr-md-n1,
  2083. .pxer-app .mx-md-n1 {
  2084. margin-right: -0.25rem !important; }
  2085. .pxer-app .mb-md-n1,
  2086. .pxer-app .my-md-n1 {
  2087. margin-bottom: -0.25rem !important; }
  2088. .pxer-app .ml-md-n1,
  2089. .pxer-app .mx-md-n1 {
  2090. margin-left: -0.25rem !important; }
  2091. .pxer-app .m-md-n2 {
  2092. margin: -0.5rem !important; }
  2093. .pxer-app .mt-md-n2,
  2094. .pxer-app .my-md-n2 {
  2095. margin-top: -0.5rem !important; }
  2096. .pxer-app .mr-md-n2,
  2097. .pxer-app .mx-md-n2 {
  2098. margin-right: -0.5rem !important; }
  2099. .pxer-app .mb-md-n2,
  2100. .pxer-app .my-md-n2 {
  2101. margin-bottom: -0.5rem !important; }
  2102. .pxer-app .ml-md-n2,
  2103. .pxer-app .mx-md-n2 {
  2104. margin-left: -0.5rem !important; }
  2105. .pxer-app .m-md-n3 {
  2106. margin: -1rem !important; }
  2107. .pxer-app .mt-md-n3,
  2108. .pxer-app .my-md-n3 {
  2109. margin-top: -1rem !important; }
  2110. .pxer-app .mr-md-n3,
  2111. .pxer-app .mx-md-n3 {
  2112. margin-right: -1rem !important; }
  2113. .pxer-app .mb-md-n3,
  2114. .pxer-app .my-md-n3 {
  2115. margin-bottom: -1rem !important; }
  2116. .pxer-app .ml-md-n3,
  2117. .pxer-app .mx-md-n3 {
  2118. margin-left: -1rem !important; }
  2119. .pxer-app .m-md-n4 {
  2120. margin: -1.5rem !important; }
  2121. .pxer-app .mt-md-n4,
  2122. .pxer-app .my-md-n4 {
  2123. margin-top: -1.5rem !important; }
  2124. .pxer-app .mr-md-n4,
  2125. .pxer-app .mx-md-n4 {
  2126. margin-right: -1.5rem !important; }
  2127. .pxer-app .mb-md-n4,
  2128. .pxer-app .my-md-n4 {
  2129. margin-bottom: -1.5rem !important; }
  2130. .pxer-app .ml-md-n4,
  2131. .pxer-app .mx-md-n4 {
  2132. margin-left: -1.5rem !important; }
  2133. .pxer-app .m-md-n5 {
  2134. margin: -3rem !important; }
  2135. .pxer-app .mt-md-n5,
  2136. .pxer-app .my-md-n5 {
  2137. margin-top: -3rem !important; }
  2138. .pxer-app .mr-md-n5,
  2139. .pxer-app .mx-md-n5 {
  2140. margin-right: -3rem !important; }
  2141. .pxer-app .mb-md-n5,
  2142. .pxer-app .my-md-n5 {
  2143. margin-bottom: -3rem !important; }
  2144. .pxer-app .ml-md-n5,
  2145. .pxer-app .mx-md-n5 {
  2146. margin-left: -3rem !important; }
  2147. .pxer-app .m-md-auto {
  2148. margin: auto !important; }
  2149. .pxer-app .mt-md-auto,
  2150. .pxer-app .my-md-auto {
  2151. margin-top: auto !important; }
  2152. .pxer-app .mr-md-auto,
  2153. .pxer-app .mx-md-auto {
  2154. margin-right: auto !important; }
  2155. .pxer-app .mb-md-auto,
  2156. .pxer-app .my-md-auto {
  2157. margin-bottom: auto !important; }
  2158. .pxer-app .ml-md-auto,
  2159. .pxer-app .mx-md-auto {
  2160. margin-left: auto !important; } }
  2161. @media (min-width: 992px) {
  2162. .pxer-app .m-lg-0 {
  2163. margin: 0 !important; }
  2164. .pxer-app .mt-lg-0,
  2165. .pxer-app .my-lg-0 {
  2166. margin-top: 0 !important; }
  2167. .pxer-app .mr-lg-0,
  2168. .pxer-app .mx-lg-0 {
  2169. margin-right: 0 !important; }
  2170. .pxer-app .mb-lg-0,
  2171. .pxer-app .my-lg-0 {
  2172. margin-bottom: 0 !important; }
  2173. .pxer-app .ml-lg-0,
  2174. .pxer-app .mx-lg-0 {
  2175. margin-left: 0 !important; }
  2176. .pxer-app .m-lg-1 {
  2177. margin: 0.25rem !important; }
  2178. .pxer-app .mt-lg-1,
  2179. .pxer-app .my-lg-1 {
  2180. margin-top: 0.25rem !important; }
  2181. .pxer-app .mr-lg-1,
  2182. .pxer-app .mx-lg-1 {
  2183. margin-right: 0.25rem !important; }
  2184. .pxer-app .mb-lg-1,
  2185. .pxer-app .my-lg-1 {
  2186. margin-bottom: 0.25rem !important; }
  2187. .pxer-app .ml-lg-1,
  2188. .pxer-app .mx-lg-1 {
  2189. margin-left: 0.25rem !important; }
  2190. .pxer-app .m-lg-2 {
  2191. margin: 0.5rem !important; }
  2192. .pxer-app .mt-lg-2,
  2193. .pxer-app .my-lg-2 {
  2194. margin-top: 0.5rem !important; }
  2195. .pxer-app .mr-lg-2,
  2196. .pxer-app .mx-lg-2 {
  2197. margin-right: 0.5rem !important; }
  2198. .pxer-app .mb-lg-2,
  2199. .pxer-app .my-lg-2 {
  2200. margin-bottom: 0.5rem !important; }
  2201. .pxer-app .ml-lg-2,
  2202. .pxer-app .mx-lg-2 {
  2203. margin-left: 0.5rem !important; }
  2204. .pxer-app .m-lg-3 {
  2205. margin: 1rem !important; }
  2206. .pxer-app .mt-lg-3,
  2207. .pxer-app .my-lg-3 {
  2208. margin-top: 1rem !important; }
  2209. .pxer-app .mr-lg-3,
  2210. .pxer-app .mx-lg-3 {
  2211. margin-right: 1rem !important; }
  2212. .pxer-app .mb-lg-3,
  2213. .pxer-app .my-lg-3 {
  2214. margin-bottom: 1rem !important; }
  2215. .pxer-app .ml-lg-3,
  2216. .pxer-app .mx-lg-3 {
  2217. margin-left: 1rem !important; }
  2218. .pxer-app .m-lg-4 {
  2219. margin: 1.5rem !important; }
  2220. .pxer-app .mt-lg-4,
  2221. .pxer-app .my-lg-4 {
  2222. margin-top: 1.5rem !important; }
  2223. .pxer-app .mr-lg-4,
  2224. .pxer-app .mx-lg-4 {
  2225. margin-right: 1.5rem !important; }
  2226. .pxer-app .mb-lg-4,
  2227. .pxer-app .my-lg-4 {
  2228. margin-bottom: 1.5rem !important; }
  2229. .pxer-app .ml-lg-4,
  2230. .pxer-app .mx-lg-4 {
  2231. margin-left: 1.5rem !important; }
  2232. .pxer-app .m-lg-5 {
  2233. margin: 3rem !important; }
  2234. .pxer-app .mt-lg-5,
  2235. .pxer-app .my-lg-5 {
  2236. margin-top: 3rem !important; }
  2237. .pxer-app .mr-lg-5,
  2238. .pxer-app .mx-lg-5 {
  2239. margin-right: 3rem !important; }
  2240. .pxer-app .mb-lg-5,
  2241. .pxer-app .my-lg-5 {
  2242. margin-bottom: 3rem !important; }
  2243. .pxer-app .ml-lg-5,
  2244. .pxer-app .mx-lg-5 {
  2245. margin-left: 3rem !important; }
  2246. .pxer-app .p-lg-0 {
  2247. padding: 0 !important; }
  2248. .pxer-app .pt-lg-0,
  2249. .pxer-app .py-lg-0 {
  2250. padding-top: 0 !important; }
  2251. .pxer-app .pr-lg-0,
  2252. .pxer-app .px-lg-0 {
  2253. padding-right: 0 !important; }
  2254. .pxer-app .pb-lg-0,
  2255. .pxer-app .py-lg-0 {
  2256. padding-bottom: 0 !important; }
  2257. .pxer-app .pl-lg-0,
  2258. .pxer-app .px-lg-0 {
  2259. padding-left: 0 !important; }
  2260. .pxer-app .p-lg-1 {
  2261. padding: 0.25rem !important; }
  2262. .pxer-app .pt-lg-1,
  2263. .pxer-app .py-lg-1 {
  2264. padding-top: 0.25rem !important; }
  2265. .pxer-app .pr-lg-1,
  2266. .pxer-app .px-lg-1 {
  2267. padding-right: 0.25rem !important; }
  2268. .pxer-app .pb-lg-1,
  2269. .pxer-app .py-lg-1 {
  2270. padding-bottom: 0.25rem !important; }
  2271. .pxer-app .pl-lg-1,
  2272. .pxer-app .px-lg-1 {
  2273. padding-left: 0.25rem !important; }
  2274. .pxer-app .p-lg-2 {
  2275. padding: 0.5rem !important; }
  2276. .pxer-app .pt-lg-2,
  2277. .pxer-app .py-lg-2 {
  2278. padding-top: 0.5rem !important; }
  2279. .pxer-app .pr-lg-2,
  2280. .pxer-app .px-lg-2 {
  2281. padding-right: 0.5rem !important; }
  2282. .pxer-app .pb-lg-2,
  2283. .pxer-app .py-lg-2 {
  2284. padding-bottom: 0.5rem !important; }
  2285. .pxer-app .pl-lg-2,
  2286. .pxer-app .px-lg-2 {
  2287. padding-left: 0.5rem !important; }
  2288. .pxer-app .p-lg-3 {
  2289. padding: 1rem !important; }
  2290. .pxer-app .pt-lg-3,
  2291. .pxer-app .py-lg-3 {
  2292. padding-top: 1rem !important; }
  2293. .pxer-app .pr-lg-3,
  2294. .pxer-app .px-lg-3 {
  2295. padding-right: 1rem !important; }
  2296. .pxer-app .pb-lg-3,
  2297. .pxer-app .py-lg-3 {
  2298. padding-bottom: 1rem !important; }
  2299. .pxer-app .pl-lg-3,
  2300. .pxer-app .px-lg-3 {
  2301. padding-left: 1rem !important; }
  2302. .pxer-app .p-lg-4 {
  2303. padding: 1.5rem !important; }
  2304. .pxer-app .pt-lg-4,
  2305. .pxer-app .py-lg-4 {
  2306. padding-top: 1.5rem !important; }
  2307. .pxer-app .pr-lg-4,
  2308. .pxer-app .px-lg-4 {
  2309. padding-right: 1.5rem !important; }
  2310. .pxer-app .pb-lg-4,
  2311. .pxer-app .py-lg-4 {
  2312. padding-bottom: 1.5rem !important; }
  2313. .pxer-app .pl-lg-4,
  2314. .pxer-app .px-lg-4 {
  2315. padding-left: 1.5rem !important; }
  2316. .pxer-app .p-lg-5 {
  2317. padding: 3rem !important; }
  2318. .pxer-app .pt-lg-5,
  2319. .pxer-app .py-lg-5 {
  2320. padding-top: 3rem !important; }
  2321. .pxer-app .pr-lg-5,
  2322. .pxer-app .px-lg-5 {
  2323. padding-right: 3rem !important; }
  2324. .pxer-app .pb-lg-5,
  2325. .pxer-app .py-lg-5 {
  2326. padding-bottom: 3rem !important; }
  2327. .pxer-app .pl-lg-5,
  2328. .pxer-app .px-lg-5 {
  2329. padding-left: 3rem !important; }
  2330. .pxer-app .m-lg-n1 {
  2331. margin: -0.25rem !important; }
  2332. .pxer-app .mt-lg-n1,
  2333. .pxer-app .my-lg-n1 {
  2334. margin-top: -0.25rem !important; }
  2335. .pxer-app .mr-lg-n1,
  2336. .pxer-app .mx-lg-n1 {
  2337. margin-right: -0.25rem !important; }
  2338. .pxer-app .mb-lg-n1,
  2339. .pxer-app .my-lg-n1 {
  2340. margin-bottom: -0.25rem !important; }
  2341. .pxer-app .ml-lg-n1,
  2342. .pxer-app .mx-lg-n1 {
  2343. margin-left: -0.25rem !important; }
  2344. .pxer-app .m-lg-n2 {
  2345. margin: -0.5rem !important; }
  2346. .pxer-app .mt-lg-n2,
  2347. .pxer-app .my-lg-n2 {
  2348. margin-top: -0.5rem !important; }
  2349. .pxer-app .mr-lg-n2,
  2350. .pxer-app .mx-lg-n2 {
  2351. margin-right: -0.5rem !important; }
  2352. .pxer-app .mb-lg-n2,
  2353. .pxer-app .my-lg-n2 {
  2354. margin-bottom: -0.5rem !important; }
  2355. .pxer-app .ml-lg-n2,
  2356. .pxer-app .mx-lg-n2 {
  2357. margin-left: -0.5rem !important; }
  2358. .pxer-app .m-lg-n3 {
  2359. margin: -1rem !important; }
  2360. .pxer-app .mt-lg-n3,
  2361. .pxer-app .my-lg-n3 {
  2362. margin-top: -1rem !important; }
  2363. .pxer-app .mr-lg-n3,
  2364. .pxer-app .mx-lg-n3 {
  2365. margin-right: -1rem !important; }
  2366. .pxer-app .mb-lg-n3,
  2367. .pxer-app .my-lg-n3 {
  2368. margin-bottom: -1rem !important; }
  2369. .pxer-app .ml-lg-n3,
  2370. .pxer-app .mx-lg-n3 {
  2371. margin-left: -1rem !important; }
  2372. .pxer-app .m-lg-n4 {
  2373. margin: -1.5rem !important; }
  2374. .pxer-app .mt-lg-n4,
  2375. .pxer-app .my-lg-n4 {
  2376. margin-top: -1.5rem !important; }
  2377. .pxer-app .mr-lg-n4,
  2378. .pxer-app .mx-lg-n4 {
  2379. margin-right: -1.5rem !important; }
  2380. .pxer-app .mb-lg-n4,
  2381. .pxer-app .my-lg-n4 {
  2382. margin-bottom: -1.5rem !important; }
  2383. .pxer-app .ml-lg-n4,
  2384. .pxer-app .mx-lg-n4 {
  2385. margin-left: -1.5rem !important; }
  2386. .pxer-app .m-lg-n5 {
  2387. margin: -3rem !important; }
  2388. .pxer-app .mt-lg-n5,
  2389. .pxer-app .my-lg-n5 {
  2390. margin-top: -3rem !important; }
  2391. .pxer-app .mr-lg-n5,
  2392. .pxer-app .mx-lg-n5 {
  2393. margin-right: -3rem !important; }
  2394. .pxer-app .mb-lg-n5,
  2395. .pxer-app .my-lg-n5 {
  2396. margin-bottom: -3rem !important; }
  2397. .pxer-app .ml-lg-n5,
  2398. .pxer-app .mx-lg-n5 {
  2399. margin-left: -3rem !important; }
  2400. .pxer-app .m-lg-auto {
  2401. margin: auto !important; }
  2402. .pxer-app .mt-lg-auto,
  2403. .pxer-app .my-lg-auto {
  2404. margin-top: auto !important; }
  2405. .pxer-app .mr-lg-auto,
  2406. .pxer-app .mx-lg-auto {
  2407. margin-right: auto !important; }
  2408. .pxer-app .mb-lg-auto,
  2409. .pxer-app .my-lg-auto {
  2410. margin-bottom: auto !important; }
  2411. .pxer-app .ml-lg-auto,
  2412. .pxer-app .mx-lg-auto {
  2413. margin-left: auto !important; } }
  2414. @media (min-width: 1200px) {
  2415. .pxer-app .m-xl-0 {
  2416. margin: 0 !important; }
  2417. .pxer-app .mt-xl-0,
  2418. .pxer-app .my-xl-0 {
  2419. margin-top: 0 !important; }
  2420. .pxer-app .mr-xl-0,
  2421. .pxer-app .mx-xl-0 {
  2422. margin-right: 0 !important; }
  2423. .pxer-app .mb-xl-0,
  2424. .pxer-app .my-xl-0 {
  2425. margin-bottom: 0 !important; }
  2426. .pxer-app .ml-xl-0,
  2427. .pxer-app .mx-xl-0 {
  2428. margin-left: 0 !important; }
  2429. .pxer-app .m-xl-1 {
  2430. margin: 0.25rem !important; }
  2431. .pxer-app .mt-xl-1,
  2432. .pxer-app .my-xl-1 {
  2433. margin-top: 0.25rem !important; }
  2434. .pxer-app .mr-xl-1,
  2435. .pxer-app .mx-xl-1 {
  2436. margin-right: 0.25rem !important; }
  2437. .pxer-app .mb-xl-1,
  2438. .pxer-app .my-xl-1 {
  2439. margin-bottom: 0.25rem !important; }
  2440. .pxer-app .ml-xl-1,
  2441. .pxer-app .mx-xl-1 {
  2442. margin-left: 0.25rem !important; }
  2443. .pxer-app .m-xl-2 {
  2444. margin: 0.5rem !important; }
  2445. .pxer-app .mt-xl-2,
  2446. .pxer-app .my-xl-2 {
  2447. margin-top: 0.5rem !important; }
  2448. .pxer-app .mr-xl-2,
  2449. .pxer-app .mx-xl-2 {
  2450. margin-right: 0.5rem !important; }
  2451. .pxer-app .mb-xl-2,
  2452. .pxer-app .my-xl-2 {
  2453. margin-bottom: 0.5rem !important; }
  2454. .pxer-app .ml-xl-2,
  2455. .pxer-app .mx-xl-2 {
  2456. margin-left: 0.5rem !important; }
  2457. .pxer-app .m-xl-3 {
  2458. margin: 1rem !important; }
  2459. .pxer-app .mt-xl-3,
  2460. .pxer-app .my-xl-3 {
  2461. margin-top: 1rem !important; }
  2462. .pxer-app .mr-xl-3,
  2463. .pxer-app .mx-xl-3 {
  2464. margin-right: 1rem !important; }
  2465. .pxer-app .mb-xl-3,
  2466. .pxer-app .my-xl-3 {
  2467. margin-bottom: 1rem !important; }
  2468. .pxer-app .ml-xl-3,
  2469. .pxer-app .mx-xl-3 {
  2470. margin-left: 1rem !important; }
  2471. .pxer-app .m-xl-4 {
  2472. margin: 1.5rem !important; }
  2473. .pxer-app .mt-xl-4,
  2474. .pxer-app .my-xl-4 {
  2475. margin-top: 1.5rem !important; }
  2476. .pxer-app .mr-xl-4,
  2477. .pxer-app .mx-xl-4 {
  2478. margin-right: 1.5rem !important; }
  2479. .pxer-app .mb-xl-4,
  2480. .pxer-app .my-xl-4 {
  2481. margin-bottom: 1.5rem !important; }
  2482. .pxer-app .ml-xl-4,
  2483. .pxer-app .mx-xl-4 {
  2484. margin-left: 1.5rem !important; }
  2485. .pxer-app .m-xl-5 {
  2486. margin: 3rem !important; }
  2487. .pxer-app .mt-xl-5,
  2488. .pxer-app .my-xl-5 {
  2489. margin-top: 3rem !important; }
  2490. .pxer-app .mr-xl-5,
  2491. .pxer-app .mx-xl-5 {
  2492. margin-right: 3rem !important; }
  2493. .pxer-app .mb-xl-5,
  2494. .pxer-app .my-xl-5 {
  2495. margin-bottom: 3rem !important; }
  2496. .pxer-app .ml-xl-5,
  2497. .pxer-app .mx-xl-5 {
  2498. margin-left: 3rem !important; }
  2499. .pxer-app .p-xl-0 {
  2500. padding: 0 !important; }
  2501. .pxer-app .pt-xl-0,
  2502. .pxer-app .py-xl-0 {
  2503. padding-top: 0 !important; }
  2504. .pxer-app .pr-xl-0,
  2505. .pxer-app .px-xl-0 {
  2506. padding-right: 0 !important; }
  2507. .pxer-app .pb-xl-0,
  2508. .pxer-app .py-xl-0 {
  2509. padding-bottom: 0 !important; }
  2510. .pxer-app .pl-xl-0,
  2511. .pxer-app .px-xl-0 {
  2512. padding-left: 0 !important; }
  2513. .pxer-app .p-xl-1 {
  2514. padding: 0.25rem !important; }
  2515. .pxer-app .pt-xl-1,
  2516. .pxer-app .py-xl-1 {
  2517. padding-top: 0.25rem !important; }
  2518. .pxer-app .pr-xl-1,
  2519. .pxer-app .px-xl-1 {
  2520. padding-right: 0.25rem !important; }
  2521. .pxer-app .pb-xl-1,
  2522. .pxer-app .py-xl-1 {
  2523. padding-bottom: 0.25rem !important; }
  2524. .pxer-app .pl-xl-1,
  2525. .pxer-app .px-xl-1 {
  2526. padding-left: 0.25rem !important; }
  2527. .pxer-app .p-xl-2 {
  2528. padding: 0.5rem !important; }
  2529. .pxer-app .pt-xl-2,
  2530. .pxer-app .py-xl-2 {
  2531. padding-top: 0.5rem !important; }
  2532. .pxer-app .pr-xl-2,
  2533. .pxer-app .px-xl-2 {
  2534. padding-right: 0.5rem !important; }
  2535. .pxer-app .pb-xl-2,
  2536. .pxer-app .py-xl-2 {
  2537. padding-bottom: 0.5rem !important; }
  2538. .pxer-app .pl-xl-2,
  2539. .pxer-app .px-xl-2 {
  2540. padding-left: 0.5rem !important; }
  2541. .pxer-app .p-xl-3 {
  2542. padding: 1rem !important; }
  2543. .pxer-app .pt-xl-3,
  2544. .pxer-app .py-xl-3 {
  2545. padding-top: 1rem !important; }
  2546. .pxer-app .pr-xl-3,
  2547. .pxer-app .px-xl-3 {
  2548. padding-right: 1rem !important; }
  2549. .pxer-app .pb-xl-3,
  2550. .pxer-app .py-xl-3 {
  2551. padding-bottom: 1rem !important; }
  2552. .pxer-app .pl-xl-3,
  2553. .pxer-app .px-xl-3 {
  2554. padding-left: 1rem !important; }
  2555. .pxer-app .p-xl-4 {
  2556. padding: 1.5rem !important; }
  2557. .pxer-app .pt-xl-4,
  2558. .pxer-app .py-xl-4 {
  2559. padding-top: 1.5rem !important; }
  2560. .pxer-app .pr-xl-4,
  2561. .pxer-app .px-xl-4 {
  2562. padding-right: 1.5rem !important; }
  2563. .pxer-app .pb-xl-4,
  2564. .pxer-app .py-xl-4 {
  2565. padding-bottom: 1.5rem !important; }
  2566. .pxer-app .pl-xl-4,
  2567. .pxer-app .px-xl-4 {
  2568. padding-left: 1.5rem !important; }
  2569. .pxer-app .p-xl-5 {
  2570. padding: 3rem !important; }
  2571. .pxer-app .pt-xl-5,
  2572. .pxer-app .py-xl-5 {
  2573. padding-top: 3rem !important; }
  2574. .pxer-app .pr-xl-5,
  2575. .pxer-app .px-xl-5 {
  2576. padding-right: 3rem !important; }
  2577. .pxer-app .pb-xl-5,
  2578. .pxer-app .py-xl-5 {
  2579. padding-bottom: 3rem !important; }
  2580. .pxer-app .pl-xl-5,
  2581. .pxer-app .px-xl-5 {
  2582. padding-left: 3rem !important; }
  2583. .pxer-app .m-xl-n1 {
  2584. margin: -0.25rem !important; }
  2585. .pxer-app .mt-xl-n1,
  2586. .pxer-app .my-xl-n1 {
  2587. margin-top: -0.25rem !important; }
  2588. .pxer-app .mr-xl-n1,
  2589. .pxer-app .mx-xl-n1 {
  2590. margin-right: -0.25rem !important; }
  2591. .pxer-app .mb-xl-n1,
  2592. .pxer-app .my-xl-n1 {
  2593. margin-bottom: -0.25rem !important; }
  2594. .pxer-app .ml-xl-n1,
  2595. .pxer-app .mx-xl-n1 {
  2596. margin-left: -0.25rem !important; }
  2597. .pxer-app .m-xl-n2 {
  2598. margin: -0.5rem !important; }
  2599. .pxer-app .mt-xl-n2,
  2600. .pxer-app .my-xl-n2 {
  2601. margin-top: -0.5rem !important; }
  2602. .pxer-app .mr-xl-n2,
  2603. .pxer-app .mx-xl-n2 {
  2604. margin-right: -0.5rem !important; }
  2605. .pxer-app .mb-xl-n2,
  2606. .pxer-app .my-xl-n2 {
  2607. margin-bottom: -0.5rem !important; }
  2608. .pxer-app .ml-xl-n2,
  2609. .pxer-app .mx-xl-n2 {
  2610. margin-left: -0.5rem !important; }
  2611. .pxer-app .m-xl-n3 {
  2612. margin: -1rem !important; }
  2613. .pxer-app .mt-xl-n3,
  2614. .pxer-app .my-xl-n3 {
  2615. margin-top: -1rem !important; }
  2616. .pxer-app .mr-xl-n3,
  2617. .pxer-app .mx-xl-n3 {
  2618. margin-right: -1rem !important; }
  2619. .pxer-app .mb-xl-n3,
  2620. .pxer-app .my-xl-n3 {
  2621. margin-bottom: -1rem !important; }
  2622. .pxer-app .ml-xl-n3,
  2623. .pxer-app .mx-xl-n3 {
  2624. margin-left: -1rem !important; }
  2625. .pxer-app .m-xl-n4 {
  2626. margin: -1.5rem !important; }
  2627. .pxer-app .mt-xl-n4,
  2628. .pxer-app .my-xl-n4 {
  2629. margin-top: -1.5rem !important; }
  2630. .pxer-app .mr-xl-n4,
  2631. .pxer-app .mx-xl-n4 {
  2632. margin-right: -1.5rem !important; }
  2633. .pxer-app .mb-xl-n4,
  2634. .pxer-app .my-xl-n4 {
  2635. margin-bottom: -1.5rem !important; }
  2636. .pxer-app .ml-xl-n4,
  2637. .pxer-app .mx-xl-n4 {
  2638. margin-left: -1.5rem !important; }
  2639. .pxer-app .m-xl-n5 {
  2640. margin: -3rem !important; }
  2641. .pxer-app .mt-xl-n5,
  2642. .pxer-app .my-xl-n5 {
  2643. margin-top: -3rem !important; }
  2644. .pxer-app .mr-xl-n5,
  2645. .pxer-app .mx-xl-n5 {
  2646. margin-right: -3rem !important; }
  2647. .pxer-app .mb-xl-n5,
  2648. .pxer-app .my-xl-n5 {
  2649. margin-bottom: -3rem !important; }
  2650. .pxer-app .ml-xl-n5,
  2651. .pxer-app .mx-xl-n5 {
  2652. margin-left: -3rem !important; }
  2653. .pxer-app .m-xl-auto {
  2654. margin: auto !important; }
  2655. .pxer-app .mt-xl-auto,
  2656. .pxer-app .my-xl-auto {
  2657. margin-top: auto !important; }
  2658. .pxer-app .mr-xl-auto,
  2659. .pxer-app .mx-xl-auto {
  2660. margin-right: auto !important; }
  2661. .pxer-app .mb-xl-auto,
  2662. .pxer-app .my-xl-auto {
  2663. margin-bottom: auto !important; }
  2664. .pxer-app .ml-xl-auto,
  2665. .pxer-app .mx-xl-auto {
  2666. margin-left: auto !important; } }
  2667. .pxer-app *,
  2668. .pxer-app *::before,
  2669. .pxer-app *::after {
  2670. box-sizing: border-box; }
  2671. .pxer-app html {
  2672. font-family: sans-serif;
  2673. line-height: 1.15;
  2674. -webkit-text-size-adjust: 100%;
  2675. -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
  2676. .pxer-app article, .pxer-app aside, .pxer-app figcaption, .pxer-app figure, .pxer-app footer, .pxer-app header, .pxer-app hgroup, .pxer-app main, .pxer-app nav, .pxer-app section {
  2677. display: block; }
  2678. .pxer-app body {
  2679. margin: 0;
  2680. font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  2681. font-size: 1rem;
  2682. font-weight: 400;
  2683. line-height: 1.5;
  2684. color: #212529;
  2685. text-align: left;
  2686. background-color: #fff; }
  2687. .pxer-app [tabindex="-1"]:focus {
  2688. outline: 0 !important; }
  2689. .pxer-app hr {
  2690. box-sizing: content-box;
  2691. height: 0;
  2692. overflow: visible; }
  2693. .pxer-app h1, .pxer-app h2, .pxer-app h3, .pxer-app h4, .pxer-app h5, .pxer-app h6 {
  2694. margin-top: 0;
  2695. margin-bottom: 0.5rem; }
  2696. .pxer-app p {
  2697. margin-top: 0;
  2698. margin-bottom: 1rem; }
  2699. .pxer-app abbr[title],
  2700. .pxer-app abbr[data-original-title] {
  2701. text-decoration: underline;
  2702. text-decoration: underline dotted;
  2703. cursor: help;
  2704. border-bottom: 0;
  2705. text-decoration-skip-ink: none; }
  2706. .pxer-app address {
  2707. margin-bottom: 1rem;
  2708. font-style: normal;
  2709. line-height: inherit; }
  2710. .pxer-app ol,
  2711. .pxer-app ul,
  2712. .pxer-app dl {
  2713. margin-top: 0;
  2714. margin-bottom: 1rem; }
  2715. .pxer-app ol ol,
  2716. .pxer-app ul ul,
  2717. .pxer-app ol ul,
  2718. .pxer-app ul ol {
  2719. margin-bottom: 0; }
  2720. .pxer-app dt {
  2721. font-weight: 700; }
  2722. .pxer-app dd {
  2723. margin-bottom: .5rem;
  2724. margin-left: 0; }
  2725. .pxer-app blockquote {
  2726. margin: 0 0 1rem; }
  2727. .pxer-app b,
  2728. .pxer-app strong {
  2729. font-weight: bolder; }
  2730. .pxer-app small {
  2731. font-size: 80%; }
  2732. .pxer-app sub,
  2733. .pxer-app sup {
  2734. position: relative;
  2735. font-size: 75%;
  2736. line-height: 0;
  2737. vertical-align: baseline; }
  2738. .pxer-app sub {
  2739. bottom: -.25em; }
  2740. .pxer-app sup {
  2741. top: -.5em; }
  2742. .pxer-app a {
  2743. color: #007bff;
  2744. text-decoration: none;
  2745. background-color: transparent; }
  2746. .pxer-app a:hover {
  2747. color: #0056b3;
  2748. text-decoration: underline; }
  2749. .pxer-app a:not([href]):not([tabindex]) {
  2750. color: inherit;
  2751. text-decoration: none; }
  2752. .pxer-app a:not([href]):not([tabindex]):hover, .pxer-app a:not([href]):not([tabindex]):focus {
  2753. color: inherit;
  2754. text-decoration: none; }
  2755. .pxer-app a:not([href]):not([tabindex]):focus {
  2756. outline: 0; }
  2757. .pxer-app pre,
  2758. .pxer-app code,
  2759. .pxer-app kbd,
  2760. .pxer-app samp {
  2761. font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  2762. font-size: 1em; }
  2763. .pxer-app pre {
  2764. margin-top: 0;
  2765. margin-bottom: 1rem;
  2766. overflow: auto; }
  2767. .pxer-app figure {
  2768. margin: 0 0 1rem; }
  2769. .pxer-app img {
  2770. vertical-align: middle;
  2771. border-style: none; }
  2772. .pxer-app svg {
  2773. overflow: hidden;
  2774. vertical-align: middle; }
  2775. .pxer-app table {
  2776. border-collapse: collapse; }
  2777. .pxer-app caption {
  2778. padding-top: 0.75rem;
  2779. padding-bottom: 0.75rem;
  2780. color: #6c757d;
  2781. text-align: left;
  2782. caption-side: bottom; }
  2783. .pxer-app th {
  2784. text-align: inherit; }
  2785. .pxer-app label {
  2786. display: inline-block;
  2787. margin-bottom: 0.5rem; }
  2788. .pxer-app button {
  2789. border-radius: 0; }
  2790. .pxer-app button:focus {
  2791. outline: 1px dotted;
  2792. outline: 5px auto -webkit-focus-ring-color; }
  2793. .pxer-app input,
  2794. .pxer-app button,
  2795. .pxer-app select,
  2796. .pxer-app optgroup,
  2797. .pxer-app textarea {
  2798. margin: 0;
  2799. font-family: inherit;
  2800. font-size: inherit;
  2801. line-height: inherit; }
  2802. .pxer-app button,
  2803. .pxer-app input {
  2804. overflow: visible; }
  2805. .pxer-app button,
  2806. .pxer-app select {
  2807. text-transform: none; }
  2808. .pxer-app select {
  2809. word-wrap: normal; }
  2810. .pxer-app button,
  2811. .pxer-app [type="button"],
  2812. .pxer-app [type="reset"],
  2813. .pxer-app [type="submit"] {
  2814. -webkit-appearance: button; }
  2815. .pxer-app button:not(:disabled),
  2816. .pxer-app [type="button"]:not(:disabled),
  2817. .pxer-app [type="reset"]:not(:disabled),
  2818. .pxer-app [type="submit"]:not(:disabled) {
  2819. cursor: pointer; }
  2820. .pxer-app button::-moz-focus-inner,
  2821. .pxer-app [type="button"]::-moz-focus-inner,
  2822. .pxer-app [type="reset"]::-moz-focus-inner,
  2823. .pxer-app [type="submit"]::-moz-focus-inner {
  2824. padding: 0;
  2825. border-style: none; }
  2826. .pxer-app input[type="radio"],
  2827. .pxer-app input[type="checkbox"] {
  2828. box-sizing: border-box;
  2829. padding: 0; }
  2830. .pxer-app input[type="date"],
  2831. .pxer-app input[type="time"],
  2832. .pxer-app input[type="datetime-local"],
  2833. .pxer-app input[type="month"] {
  2834. -webkit-appearance: listbox; }
  2835. .pxer-app textarea {
  2836. overflow: auto;
  2837. resize: vertical; }
  2838. .pxer-app fieldset {
  2839. min-width: 0;
  2840. padding: 0;
  2841. margin: 0;
  2842. border: 0; }
  2843. .pxer-app legend {
  2844. display: block;
  2845. width: 100%;
  2846. max-width: 100%;
  2847. padding: 0;
  2848. margin-bottom: .5rem;
  2849. font-size: 1.5rem;
  2850. line-height: inherit;
  2851. color: inherit;
  2852. white-space: normal; }
  2853. .pxer-app progress {
  2854. vertical-align: baseline; }
  2855. .pxer-app [type="number"]::-webkit-inner-spin-button,
  2856. .pxer-app [type="number"]::-webkit-outer-spin-button {
  2857. height: auto; }
  2858. .pxer-app [type="search"] {
  2859. outline-offset: -2px;
  2860. -webkit-appearance: none; }
  2861. .pxer-app [type="search"]::-webkit-search-decoration {
  2862. -webkit-appearance: none; }
  2863. .pxer-app ::-webkit-file-upload-button {
  2864. font: inherit;
  2865. -webkit-appearance: button; }
  2866. .pxer-app output {
  2867. display: inline-block; }
  2868. .pxer-app summary {
  2869. display: list-item;
  2870. cursor: pointer; }
  2871. .pxer-app template {
  2872. display: none; }
  2873. .pxer-app [hidden] {
  2874. display: none !important; }
  2875. .pxer-app .table {
  2876. width: 100%;
  2877. margin-bottom: 1rem;
  2878. color: #212529; }
  2879. .pxer-app .table th,
  2880. .pxer-app .table td {
  2881. padding: 0.75rem;
  2882. vertical-align: top;
  2883. border-top: 1px solid #dee2e6; }
  2884. .pxer-app .table thead th {
  2885. vertical-align: bottom;
  2886. border-bottom: 2px solid #dee2e6; }
  2887. .pxer-app .table tbody + tbody {
  2888. border-top: 2px solid #dee2e6; }
  2889. .pxer-app .table-sm th,
  2890. .pxer-app .table-sm td {
  2891. padding: 0.3rem; }
  2892. .pxer-app .table-bordered {
  2893. border: 1px solid #dee2e6; }
  2894. .pxer-app .table-bordered th,
  2895. .pxer-app .table-bordered td {
  2896. border: 1px solid #dee2e6; }
  2897. .pxer-app .table-bordered thead th,
  2898. .pxer-app .table-bordered thead td {
  2899. border-bottom-width: 2px; }
  2900. .pxer-app .table-borderless th,
  2901. .pxer-app .table-borderless td,
  2902. .pxer-app .table-borderless thead th,
  2903. .pxer-app .table-borderless tbody + tbody {
  2904. border: 0; }
  2905. .pxer-app .table-striped tbody tr:nth-of-type(odd) {
  2906. background-color: rgba(0, 0, 0, 0.05); }
  2907. .pxer-app .table-hover tbody tr:hover {
  2908. color: #212529;
  2909. background-color: rgba(0, 0, 0, 0.075); }
  2910. .pxer-app .table-primary,
  2911. .pxer-app .table-primary > th,
  2912. .pxer-app .table-primary > td {
  2913. background-color: #b8daff; }
  2914. .pxer-app .table-primary th,
  2915. .pxer-app .table-primary td,
  2916. .pxer-app .table-primary thead th,
  2917. .pxer-app .table-primary tbody + tbody {
  2918. border-color: #7abaff; }
  2919. .pxer-app .table-hover .table-primary:hover {
  2920. background-color: #9fcdff; }
  2921. .pxer-app .table-hover .table-primary:hover > td,
  2922. .pxer-app .table-hover .table-primary:hover > th {
  2923. background-color: #9fcdff; }
  2924. .pxer-app .table-secondary,
  2925. .pxer-app .table-secondary > th,
  2926. .pxer-app .table-secondary > td {
  2927. background-color: #d6d8db; }
  2928. .pxer-app .table-secondary th,
  2929. .pxer-app .table-secondary td,
  2930. .pxer-app .table-secondary thead th,
  2931. .pxer-app .table-secondary tbody + tbody {
  2932. border-color: #b3b7bb; }
  2933. .pxer-app .table-hover .table-secondary:hover {
  2934. background-color: #c8cbcf; }
  2935. .pxer-app .table-hover .table-secondary:hover > td,
  2936. .pxer-app .table-hover .table-secondary:hover > th {
  2937. background-color: #c8cbcf; }
  2938. .pxer-app .table-success,
  2939. .pxer-app .table-success > th,
  2940. .pxer-app .table-success > td {
  2941. background-color: #c3e6cb; }
  2942. .pxer-app .table-success th,
  2943. .pxer-app .table-success td,
  2944. .pxer-app .table-success thead th,
  2945. .pxer-app .table-success tbody + tbody {
  2946. border-color: #8fd19e; }
  2947. .pxer-app .table-hover .table-success:hover {
  2948. background-color: #b1dfbb; }
  2949. .pxer-app .table-hover .table-success:hover > td,
  2950. .pxer-app .table-hover .table-success:hover > th {
  2951. background-color: #b1dfbb; }
  2952. .pxer-app .table-info,
  2953. .pxer-app .table-info > th,
  2954. .pxer-app .table-info > td {
  2955. background-color: #bee5eb; }
  2956. .pxer-app .table-info th,
  2957. .pxer-app .table-info td,
  2958. .pxer-app .table-info thead th,
  2959. .pxer-app .table-info tbody + tbody {
  2960. border-color: #86cfda; }
  2961. .pxer-app .table-hover .table-info:hover {
  2962. background-color: #abdde5; }
  2963. .pxer-app .table-hover .table-info:hover > td,
  2964. .pxer-app .table-hover .table-info:hover > th {
  2965. background-color: #abdde5; }
  2966. .pxer-app .table-warning,
  2967. .pxer-app .table-warning > th,
  2968. .pxer-app .table-warning > td {
  2969. background-color: #ffeeba; }
  2970. .pxer-app .table-warning th,
  2971. .pxer-app .table-warning td,
  2972. .pxer-app .table-warning thead th,
  2973. .pxer-app .table-warning tbody + tbody {
  2974. border-color: #ffdf7e; }
  2975. .pxer-app .table-hover .table-warning:hover {
  2976. background-color: #ffe8a1; }
  2977. .pxer-app .table-hover .table-warning:hover > td,
  2978. .pxer-app .table-hover .table-warning:hover > th {
  2979. background-color: #ffe8a1; }
  2980. .pxer-app .table-danger,
  2981. .pxer-app .table-danger > th,
  2982. .pxer-app .table-danger > td {
  2983. background-color: #f5c6cb; }
  2984. .pxer-app .table-danger th,
  2985. .pxer-app .table-danger td,
  2986. .pxer-app .table-danger thead th,
  2987. .pxer-app .table-danger tbody + tbody {
  2988. border-color: #ed969e; }
  2989. .pxer-app .table-hover .table-danger:hover {
  2990. background-color: #f1b0b7; }
  2991. .pxer-app .table-hover .table-danger:hover > td,
  2992. .pxer-app .table-hover .table-danger:hover > th {
  2993. background-color: #f1b0b7; }
  2994. .pxer-app .table-light,
  2995. .pxer-app .table-light > th,
  2996. .pxer-app .table-light > td {
  2997. background-color: #fdfdfe; }
  2998. .pxer-app .table-light th,
  2999. .pxer-app .table-light td,
  3000. .pxer-app .table-light thead th,
  3001. .pxer-app .table-light tbody + tbody {
  3002. border-color: #fbfcfc; }
  3003. .pxer-app .table-hover .table-light:hover {
  3004. background-color: #ececf6; }
  3005. .pxer-app .table-hover .table-light:hover > td,
  3006. .pxer-app .table-hover .table-light:hover > th {
  3007. background-color: #ececf6; }
  3008. .pxer-app .table-dark,
  3009. .pxer-app .table-dark > th,
  3010. .pxer-app .table-dark > td {
  3011. background-color: #c6c8ca; }
  3012. .pxer-app .table-dark th,
  3013. .pxer-app .table-dark td,
  3014. .pxer-app .table-dark thead th,
  3015. .pxer-app .table-dark tbody + tbody {
  3016. border-color: #95999c; }
  3017. .pxer-app .table-hover .table-dark:hover {
  3018. background-color: #b9bbbe; }
  3019. .pxer-app .table-hover .table-dark:hover > td,
  3020. .pxer-app .table-hover .table-dark:hover > th {
  3021. background-color: #b9bbbe; }
  3022. .pxer-app .table-active,
  3023. .pxer-app .table-active > th,
  3024. .pxer-app .table-active > td {
  3025. background-color: rgba(0, 0, 0, 0.075); }
  3026. .pxer-app .table-hover .table-active:hover {
  3027. background-color: rgba(0, 0, 0, 0.075); }
  3028. .pxer-app .table-hover .table-active:hover > td,
  3029. .pxer-app .table-hover .table-active:hover > th {
  3030. background-color: rgba(0, 0, 0, 0.075); }
  3031. .pxer-app .table .thead-dark th {
  3032. color: #fff;
  3033. background-color: #343a40;
  3034. border-color: #454d55; }
  3035. .pxer-app .table .thead-light th {
  3036. color: #495057;
  3037. background-color: #e9ecef;
  3038. border-color: #dee2e6; }
  3039. .pxer-app .table-dark {
  3040. color: #fff;
  3041. background-color: #343a40; }
  3042. .pxer-app .table-dark th,
  3043. .pxer-app .table-dark td,
  3044. .pxer-app .table-dark thead th {
  3045. border-color: #454d55; }
  3046. .pxer-app .table-dark.table-bordered {
  3047. border: 0; }
  3048. .pxer-app .table-dark.table-striped tbody tr:nth-of-type(odd) {
  3049. background-color: rgba(255, 255, 255, 0.05); }
  3050. .pxer-app .table-dark.table-hover tbody tr:hover {
  3051. color: #fff;
  3052. background-color: rgba(255, 255, 255, 0.075); }
  3053. @media (max-width: 575.98px) {
  3054. .pxer-app .table-responsive-sm {
  3055. display: block;
  3056. width: 100%;
  3057. overflow-x: auto;
  3058. -webkit-overflow-scrolling: touch; }
  3059. .pxer-app .table-responsive-sm > .table-bordered {
  3060. border: 0; } }
  3061. @media (max-width: 767.98px) {
  3062. .pxer-app .table-responsive-md {
  3063. display: block;
  3064. width: 100%;
  3065. overflow-x: auto;
  3066. -webkit-overflow-scrolling: touch; }
  3067. .pxer-app .table-responsive-md > .table-bordered {
  3068. border: 0; } }
  3069. @media (max-width: 991.98px) {
  3070. .pxer-app .table-responsive-lg {
  3071. display: block;
  3072. width: 100%;
  3073. overflow-x: auto;
  3074. -webkit-overflow-scrolling: touch; }
  3075. .pxer-app .table-responsive-lg > .table-bordered {
  3076. border: 0; } }
  3077. @media (max-width: 1199.98px) {
  3078. .pxer-app .table-responsive-xl {
  3079. display: block;
  3080. width: 100%;
  3081. overflow-x: auto;
  3082. -webkit-overflow-scrolling: touch; }
  3083. .pxer-app .table-responsive-xl > .table-bordered {
  3084. border: 0; } }
  3085. .pxer-app .table-responsive {
  3086. display: block;
  3087. width: 100%;
  3088. overflow-x: auto;
  3089. -webkit-overflow-scrolling: touch; }
  3090. .pxer-app .table-responsive > .table-bordered {
  3091. border: 0; }
  3092. .pxer-app .form-control {
  3093. display: block;
  3094. width: 100%;
  3095. height: calc(1.5em + 0.75rem + 2px);
  3096. padding: 0.375rem 0.75rem;
  3097. font-size: 1rem;
  3098. font-weight: 400;
  3099. line-height: 1.5;
  3100. color: #495057;
  3101. background-color: #fff;
  3102. background-clip: padding-box;
  3103. border: 1px solid #ced4da;
  3104. border-radius: 0.25rem;
  3105. transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
  3106. @media (prefers-reduced-motion: reduce) {
  3107. .pxer-app .form-control {
  3108. transition: none; } }
  3109. .pxer-app .form-control::-ms-expand {
  3110. background-color: transparent;
  3111. border: 0; }
  3112. .pxer-app .form-control:focus {
  3113. color: #495057;
  3114. background-color: #fff;
  3115. border-color: #80bdff;
  3116. outline: 0;
  3117. box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); }
  3118. .pxer-app .form-control::placeholder {
  3119. color: #6c757d;
  3120. opacity: 1; }
  3121. .pxer-app .form-control:disabled, .pxer-app .form-control[readonly] {
  3122. background-color: #e9ecef;
  3123. opacity: 1; }
  3124. .pxer-app select.form-control:focus::-ms-value {
  3125. color: #495057;
  3126. background-color: #fff; }
  3127. .pxer-app .form-control-file,
  3128. .pxer-app .form-control-range {
  3129. display: block;
  3130. width: 100%; }
  3131. .pxer-app .col-form-label {
  3132. padding-top: calc(0.375rem + 1px);
  3133. padding-bottom: calc(0.375rem + 1px);
  3134. margin-bottom: 0;
  3135. font-size: inherit;
  3136. line-height: 1.5; }
  3137. .pxer-app .col-form-label-lg {
  3138. padding-top: calc(0.5rem + 1px);
  3139. padding-bottom: calc(0.5rem + 1px);
  3140. font-size: 1.25rem;
  3141. line-height: 1.5; }
  3142. .pxer-app .col-form-label-sm {
  3143. padding-top: calc(0.25rem + 1px);
  3144. padding-bottom: calc(0.25rem + 1px);
  3145. font-size: 0.875rem;
  3146. line-height: 1.5; }
  3147. .pxer-app .form-control-plaintext {
  3148. display: block;
  3149. width: 100%;
  3150. padding-top: 0.375rem;
  3151. padding-bottom: 0.375rem;
  3152. margin-bottom: 0;
  3153. line-height: 1.5;
  3154. color: #212529;
  3155. background-color: transparent;
  3156. border: solid transparent;
  3157. border-width: 1px 0; }
  3158. .pxer-app .form-control-plaintext.form-control-sm, .pxer-app input.form-control-plaintext.form-control, .pxer-app select.form-control-plaintext.form-control, .pxer-app .form-control-plaintext.form-control-lg {
  3159. padding-right: 0;
  3160. padding-left: 0; }
  3161. .pxer-app .form-control-sm, .pxer-app input.form-control, .pxer-app select.form-control {
  3162. height: calc(1.5em + 0.5rem + 2px);
  3163. padding: 0.25rem 0.5rem;
  3164. font-size: 0.875rem;
  3165. line-height: 1.5;
  3166. border-radius: 0.2rem; }
  3167. .pxer-app .form-control-lg {
  3168. height: calc(1.5em + 1rem + 2px);
  3169. padding: 0.5rem 1rem;
  3170. font-size: 1.25rem;
  3171. line-height: 1.5;
  3172. border-radius: 0.3rem; }
  3173. .pxer-app select.form-control[size], .pxer-app select.form-control[multiple] {
  3174. height: auto; }
  3175. .pxer-app textarea.form-control {
  3176. height: auto; }
  3177. .pxer-app .form-group {
  3178. margin-bottom: 1rem; }
  3179. .pxer-app .form-text {
  3180. display: block;
  3181. margin-top: 0.25rem; }
  3182. .pxer-app .form-row {
  3183. display: flex;
  3184. flex-wrap: wrap;
  3185. margin-right: -5px;
  3186. margin-left: -5px; }
  3187. .pxer-app .form-row > .col,
  3188. .pxer-app .form-row > [class*="col-"] {
  3189. padding-right: 5px;
  3190. padding-left: 5px; }
  3191. .pxer-app .form-check {
  3192. position: relative;
  3193. display: block;
  3194. padding-left: 1.25rem; }
  3195. .pxer-app .form-check-input {
  3196. position: absolute;
  3197. margin-top: 0.3rem;
  3198. margin-left: -1.25rem; }
  3199. .pxer-app .form-check-input:disabled ~ .form-check-label {
  3200. color: #6c757d; }
  3201. .pxer-app .form-check-label {
  3202. margin-bottom: 0; }
  3203. .pxer-app .form-check-inline {
  3204. display: inline-flex;
  3205. align-items: center;
  3206. padding-left: 0;
  3207. margin-right: 0.75rem; }
  3208. .pxer-app .form-check-inline .form-check-input {
  3209. position: static;
  3210. margin-top: 0;
  3211. margin-right: 0.3125rem;
  3212. margin-left: 0; }
  3213. .pxer-app .valid-feedback {
  3214. display: none;
  3215. width: 100%;
  3216. margin-top: 0.25rem;
  3217. font-size: 80%;
  3218. color: #28a745; }
  3219. .pxer-app .valid-tooltip {
  3220. position: absolute;
  3221. top: 100%;
  3222. z-index: 5;
  3223. display: none;
  3224. max-width: 100%;
  3225. padding: 0.25rem 0.5rem;
  3226. margin-top: .1rem;
  3227. font-size: 0.875rem;
  3228. line-height: 1.5;
  3229. color: #fff;
  3230. background-color: rgba(40, 167, 69, 0.9);
  3231. border-radius: 0.25rem; }
  3232. .was-validated .pxer-app .form-control:valid, .pxer-app .form-control.is-valid {
  3233. border-color: #28a745;
  3234. padding-right: calc(1.5em + 0.75rem);
  3235. background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
  3236. background-repeat: no-repeat;
  3237. background-position: center right calc(0.375em + 0.1875rem);
  3238. background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
  3239. .was-validated .pxer-app .form-control:valid:focus, .pxer-app .form-control.is-valid:focus {
  3240. border-color: #28a745;
  3241. box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
  3242. .was-validated .pxer-app .form-control:valid ~ .valid-feedback,
  3243. .was-validated .pxer-app .form-control:valid ~ .valid-tooltip, .pxer-app .form-control.is-valid ~ .valid-feedback,
  3244. .pxer-app .form-control.is-valid ~ .valid-tooltip {
  3245. display: block; }
  3246. .was-validated .pxer-app textarea.form-control:valid, .pxer-app textarea.form-control.is-valid {
  3247. padding-right: calc(1.5em + 0.75rem);
  3248. background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }
  3249. .was-validated .pxer-app .custom-select:valid, .pxer-app .custom-select.is-valid {
  3250. border-color: #28a745;
  3251. padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
  3252. background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
  3253. .was-validated .pxer-app .custom-select:valid:focus, .pxer-app .custom-select.is-valid:focus {
  3254. border-color: #28a745;
  3255. box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
  3256. .was-validated .pxer-app .custom-select:valid ~ .valid-feedback,
  3257. .was-validated .pxer-app .custom-select:valid ~ .valid-tooltip, .pxer-app .custom-select.is-valid ~ .valid-feedback,
  3258. .pxer-app .custom-select.is-valid ~ .valid-tooltip {
  3259. display: block; }
  3260. .was-validated .pxer-app .form-control-file:valid ~ .valid-feedback,
  3261. .was-validated .pxer-app .form-control-file:valid ~ .valid-tooltip, .pxer-app .form-control-file.is-valid ~ .valid-feedback,
  3262. .pxer-app .form-control-file.is-valid ~ .valid-tooltip {
  3263. display: block; }
  3264. .was-validated .pxer-app .form-check-input:valid ~ .form-check-label, .pxer-app .form-check-input.is-valid ~ .form-check-label {
  3265. color: #28a745; }
  3266. .was-validated .pxer-app .form-check-input:valid ~ .valid-feedback,
  3267. .was-validated .pxer-app .form-check-input:valid ~ .valid-tooltip, .pxer-app .form-check-input.is-valid ~ .valid-feedback,
  3268. .pxer-app .form-check-input.is-valid ~ .valid-tooltip {
  3269. display: block; }
  3270. .was-validated .pxer-app .custom-control-input:valid ~ .custom-control-label, .pxer-app .custom-control-input.is-valid ~ .custom-control-label {
  3271. color: #28a745; }
  3272. .was-validated .pxer-app .custom-control-input:valid ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid ~ .custom-control-label::before {
  3273. border-color: #28a745; }
  3274. .was-validated .pxer-app .custom-control-input:valid ~ .valid-feedback,
  3275. .was-validated .pxer-app .custom-control-input:valid ~ .valid-tooltip, .pxer-app .custom-control-input.is-valid ~ .valid-feedback,
  3276. .pxer-app .custom-control-input.is-valid ~ .valid-tooltip {
  3277. display: block; }
  3278. .was-validated .pxer-app .custom-control-input:valid:checked ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid:checked ~ .custom-control-label::before {
  3279. border-color: #34ce57;
  3280. background-color: #34ce57; }
  3281. .was-validated .pxer-app .custom-control-input:valid:focus ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid:focus ~ .custom-control-label::before {
  3282. box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
  3283. .was-validated .pxer-app .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .pxer-app .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
  3284. border-color: #28a745; }
  3285. .was-validated .pxer-app .custom-file-input:valid ~ .custom-file-label, .pxer-app .custom-file-input.is-valid ~ .custom-file-label {
  3286. border-color: #28a745; }
  3287. .was-validated .pxer-app .custom-file-input:valid ~ .valid-feedback,
  3288. .was-validated .pxer-app .custom-file-input:valid ~ .valid-tooltip, .pxer-app .custom-file-input.is-valid ~ .valid-feedback,
  3289. .pxer-app .custom-file-input.is-valid ~ .valid-tooltip {
  3290. display: block; }
  3291. .was-validated .pxer-app .custom-file-input:valid:focus ~ .custom-file-label, .pxer-app .custom-file-input.is-valid:focus ~ .custom-file-label {
  3292. border-color: #28a745;
  3293. box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); }
  3294. .pxer-app .invalid-feedback {
  3295. display: none;
  3296. width: 100%;
  3297. margin-top: 0.25rem;
  3298. font-size: 80%;
  3299. color: #dc3545; }
  3300. .pxer-app .invalid-tooltip {
  3301. position: absolute;
  3302. top: 100%;
  3303. z-index: 5;
  3304. display: none;
  3305. max-width: 100%;
  3306. padding: 0.25rem 0.5rem;
  3307. margin-top: .1rem;
  3308. font-size: 0.875rem;
  3309. line-height: 1.5;
  3310. color: #fff;
  3311. background-color: rgba(220, 53, 69, 0.9);
  3312. border-radius: 0.25rem; }
  3313. .was-validated .pxer-app .form-control:invalid, .pxer-app .form-control.is-invalid {
  3314. border-color: #dc3545;
  3315. padding-right: calc(1.5em + 0.75rem);
  3316. background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");
  3317. background-repeat: no-repeat;
  3318. background-position: center right calc(0.375em + 0.1875rem);
  3319. background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
  3320. .was-validated .pxer-app .form-control:invalid:focus, .pxer-app .form-control.is-invalid:focus {
  3321. border-color: #dc3545;
  3322. box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
  3323. .was-validated .pxer-app .form-control:invalid ~ .invalid-feedback,
  3324. .was-validated .pxer-app .form-control:invalid ~ .invalid-tooltip, .pxer-app .form-control.is-invalid ~ .invalid-feedback,
  3325. .pxer-app .form-control.is-invalid ~ .invalid-tooltip {
  3326. display: block; }
  3327. .was-validated .pxer-app textarea.form-control:invalid, .pxer-app textarea.form-control.is-invalid {
  3328. padding-right: calc(1.5em + 0.75rem);
  3329. background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); }
  3330. .was-validated .pxer-app .custom-select:invalid, .pxer-app .custom-select.is-invalid {
  3331. border-color: #dc3545;
  3332. padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
  3333. background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); }
  3334. .was-validated .pxer-app .custom-select:invalid:focus, .pxer-app .custom-select.is-invalid:focus {
  3335. border-color: #dc3545;
  3336. box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
  3337. .was-validated .pxer-app .custom-select:invalid ~ .invalid-feedback,
  3338. .was-validated .pxer-app .custom-select:invalid ~ .invalid-tooltip, .pxer-app .custom-select.is-invalid ~ .invalid-feedback,
  3339. .pxer-app .custom-select.is-invalid ~ .invalid-tooltip {
  3340. display: block; }
  3341. .was-validated .pxer-app .form-control-file:invalid ~ .invalid-feedback,
  3342. .was-validated .pxer-app .form-control-file:invalid ~ .invalid-tooltip, .pxer-app .form-control-file.is-invalid ~ .invalid-feedback,
  3343. .pxer-app .form-control-file.is-invalid ~ .invalid-tooltip {
  3344. display: block; }
  3345. .was-validated .pxer-app .form-check-input:invalid ~ .form-check-label, .pxer-app .form-check-input.is-invalid ~ .form-check-label {
  3346. color: #dc3545; }
  3347. .was-validated .pxer-app .form-check-input:invalid ~ .invalid-feedback,
  3348. .was-validated .pxer-app .form-check-input:invalid ~ .invalid-tooltip, .pxer-app .form-check-input.is-invalid ~ .invalid-feedback,
  3349. .pxer-app .form-check-input.is-invalid ~ .invalid-tooltip {
  3350. display: block; }
  3351. .was-validated .pxer-app .custom-control-input:invalid ~ .custom-control-label, .pxer-app .custom-control-input.is-invalid ~ .custom-control-label {
  3352. color: #dc3545; }
  3353. .was-validated .pxer-app .custom-control-input:invalid ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid ~ .custom-control-label::before {
  3354. border-color: #dc3545; }
  3355. .was-validated .pxer-app .custom-control-input:invalid ~ .invalid-feedback,
  3356. .was-validated .pxer-app .custom-control-input:invalid ~ .invalid-tooltip, .pxer-app .custom-control-input.is-invalid ~ .invalid-feedback,
  3357. .pxer-app .custom-control-input.is-invalid ~ .invalid-tooltip {
  3358. display: block; }
  3359. .was-validated .pxer-app .custom-control-input:invalid:checked ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
  3360. border-color: #e4606d;
  3361. background-color: #e4606d; }
  3362. .was-validated .pxer-app .custom-control-input:invalid:focus ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid:focus ~ .custom-control-label::before {
  3363. box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
  3364. .was-validated .pxer-app .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .pxer-app .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
  3365. border-color: #dc3545; }
  3366. .was-validated .pxer-app .custom-file-input:invalid ~ .custom-file-label, .pxer-app .custom-file-input.is-invalid ~ .custom-file-label {
  3367. border-color: #dc3545; }
  3368. .was-validated .pxer-app .custom-file-input:invalid ~ .invalid-feedback,
  3369. .was-validated .pxer-app .custom-file-input:invalid ~ .invalid-tooltip, .pxer-app .custom-file-input.is-invalid ~ .invalid-feedback,
  3370. .pxer-app .custom-file-input.is-invalid ~ .invalid-tooltip {
  3371. display: block; }
  3372. .was-validated .pxer-app .custom-file-input:invalid:focus ~ .custom-file-label, .pxer-app .custom-file-input.is-invalid:focus ~ .custom-file-label {
  3373. border-color: #dc3545;
  3374. box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }
  3375. .pxer-app .form-inline {
  3376. display: flex;
  3377. flex-flow: row wrap;
  3378. align-items: center; }
  3379. .pxer-app .form-inline .form-check {
  3380. width: 100%; }
  3381. @media (min-width: 576px) {
  3382. .pxer-app .form-inline label {
  3383. display: flex;
  3384. align-items: center;
  3385. justify-content: center;
  3386. margin-bottom: 0; }
  3387. .pxer-app .form-inline .form-group {
  3388. display: flex;
  3389. flex: 0 0 auto;
  3390. flex-flow: row wrap;
  3391. align-items: center;
  3392. margin-bottom: 0; }
  3393. .pxer-app .form-inline .form-control {
  3394. display: inline-block;
  3395. width: auto;
  3396. vertical-align: middle; }
  3397. .pxer-app .form-inline .form-control-plaintext {
  3398. display: inline-block; }
  3399. .pxer-app .form-inline .input-group,
  3400. .pxer-app .form-inline .custom-select {
  3401. width: auto; }
  3402. .pxer-app .form-inline .form-check {
  3403. display: flex;
  3404. align-items: center;
  3405. justify-content: center;
  3406. width: auto;
  3407. padding-left: 0; }
  3408. .pxer-app .form-inline .form-check-input {
  3409. position: relative;
  3410. flex-shrink: 0;
  3411. margin-top: 0;
  3412. margin-right: 0.25rem;
  3413. margin-left: 0; }
  3414. .pxer-app .form-inline .custom-control {
  3415. align-items: center;
  3416. justify-content: center; }
  3417. .pxer-app .form-inline .custom-control-label {
  3418. margin-bottom: 0; } }
  3419. .pxer-app .btn {
  3420. display: inline-block;
  3421. font-weight: 400;
  3422. color: #212529;
  3423. text-align: center;
  3424. vertical-align: middle;
  3425. user-select: none;
  3426. background-color: transparent;
  3427. border: 1px solid transparent;
  3428. padding: 0.375rem 0.75rem;
  3429. font-size: 1rem;
  3430. line-height: 1.5;
  3431. border-radius: 0.25rem;
  3432. transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
  3433. @media (prefers-reduced-motion: reduce) {
  3434. .pxer-app .btn {
  3435. transition: none; } }
  3436. .pxer-app .btn:hover {
  3437. color: #212529;
  3438. text-decoration: none; }
  3439. .pxer-app .btn:focus, .pxer-app .btn.focus {
  3440. outline: 0;
  3441. box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); }
  3442. .pxer-app .btn.disabled, .pxer-app .btn:disabled {
  3443. opacity: 0.65; }
  3444. .pxer-app a.btn.disabled,
  3445. .pxer-app fieldset:disabled a.btn {
  3446. pointer-events: none; }
  3447. .pxer-app .btn-primary {
  3448. color: #fff;
  3449. background-color: #007bff;
  3450. border-color: #007bff; }
  3451. .pxer-app .btn-primary:hover {
  3452. color: #fff;
  3453. background-color: #0069d9;
  3454. border-color: #0062cc; }
  3455. .pxer-app .btn-primary:focus, .pxer-app .btn-primary.focus {
  3456. box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); }
  3457. .pxer-app .btn-primary.disabled, .pxer-app .btn-primary:disabled {
  3458. color: #fff;
  3459. background-color: #007bff;
  3460. border-color: #007bff; }
  3461. .pxer-app .btn-primary:not(:disabled):not(.disabled):active, .pxer-app .btn-primary:not(:disabled):not(.disabled).active,
  3462. .show > .pxer-app .btn-primary.dropdown-toggle {
  3463. color: #fff;
  3464. background-color: #0062cc;
  3465. border-color: #005cbf; }
  3466. .pxer-app .btn-primary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-primary:not(:disabled):not(.disabled).active:focus,
  3467. .show > .pxer-app .btn-primary.dropdown-toggle:focus {
  3468. box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); }
  3469. .pxer-app .btn-secondary {
  3470. color: #fff;
  3471. background-color: #6c757d;
  3472. border-color: #6c757d; }
  3473. .pxer-app .btn-secondary:hover {
  3474. color: #fff;
  3475. background-color: #5a6268;
  3476. border-color: #545b62; }
  3477. .pxer-app .btn-secondary:focus, .pxer-app .btn-secondary.focus {
  3478. box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); }
  3479. .pxer-app .btn-secondary.disabled, .pxer-app .btn-secondary:disabled {
  3480. color: #fff;
  3481. background-color: #6c757d;
  3482. border-color: #6c757d; }
  3483. .pxer-app .btn-secondary:not(:disabled):not(.disabled):active, .pxer-app .btn-secondary:not(:disabled):not(.disabled).active,
  3484. .show > .pxer-app .btn-secondary.dropdown-toggle {
  3485. color: #fff;
  3486. background-color: #545b62;
  3487. border-color: #4e555b; }
  3488. .pxer-app .btn-secondary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-secondary:not(:disabled):not(.disabled).active:focus,
  3489. .show > .pxer-app .btn-secondary.dropdown-toggle:focus {
  3490. box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); }
  3491. .pxer-app .btn-success {
  3492. color: #fff;
  3493. background-color: #28a745;
  3494. border-color: #28a745; }
  3495. .pxer-app .btn-success:hover {
  3496. color: #fff;
  3497. background-color: #218838;
  3498. border-color: #1e7e34; }
  3499. .pxer-app .btn-success:focus, .pxer-app .btn-success.focus {
  3500. box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); }
  3501. .pxer-app .btn-success.disabled, .pxer-app .btn-success:disabled {
  3502. color: #fff;
  3503. background-color: #28a745;
  3504. border-color: #28a745; }
  3505. .pxer-app .btn-success:not(:disabled):not(.disabled):active, .pxer-app .btn-success:not(:disabled):not(.disabled).active,
  3506. .show > .pxer-app .btn-success.dropdown-toggle {
  3507. color: #fff;
  3508. background-color: #1e7e34;
  3509. border-color: #1c7430; }
  3510. .pxer-app .btn-success:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-success:not(:disabled):not(.disabled).active:focus,
  3511. .show > .pxer-app .btn-success.dropdown-toggle:focus {
  3512. box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); }
  3513. .pxer-app .btn-info {
  3514. color: #fff;
  3515. background-color: #17a2b8;
  3516. border-color: #17a2b8; }
  3517. .pxer-app .btn-info:hover {
  3518. color: #fff;
  3519. background-color: #138496;
  3520. border-color: #117a8b; }
  3521. .pxer-app .btn-info:focus, .pxer-app .btn-info.focus {
  3522. box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); }
  3523. .pxer-app .btn-info.disabled, .pxer-app .btn-info:disabled {
  3524. color: #fff;
  3525. background-color: #17a2b8;
  3526. border-color: #17a2b8; }
  3527. .pxer-app .btn-info:not(:disabled):not(.disabled):active, .pxer-app .btn-info:not(:disabled):not(.disabled).active,
  3528. .show > .pxer-app .btn-info.dropdown-toggle {
  3529. color: #fff;
  3530. background-color: #117a8b;
  3531. border-color: #10707f; }
  3532. .pxer-app .btn-info:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-info:not(:disabled):not(.disabled).active:focus,
  3533. .show > .pxer-app .btn-info.dropdown-toggle:focus {
  3534. box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); }
  3535. .pxer-app .btn-warning {
  3536. color: #212529;
  3537. background-color: #ffc107;
  3538. border-color: #ffc107; }
  3539. .pxer-app .btn-warning:hover {
  3540. color: #212529;
  3541. background-color: #e0a800;
  3542. border-color: #d39e00; }
  3543. .pxer-app .btn-warning:focus, .pxer-app .btn-warning.focus {
  3544. box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); }
  3545. .pxer-app .btn-warning.disabled, .pxer-app .btn-warning:disabled {
  3546. color: #212529;
  3547. background-color: #ffc107;
  3548. border-color: #ffc107; }
  3549. .pxer-app .btn-warning:not(:disabled):not(.disabled):active, .pxer-app .btn-warning:not(:disabled):not(.disabled).active,
  3550. .show > .pxer-app .btn-warning.dropdown-toggle {
  3551. color: #212529;
  3552. background-color: #d39e00;
  3553. border-color: #c69500; }
  3554. .pxer-app .btn-warning:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-warning:not(:disabled):not(.disabled).active:focus,
  3555. .show > .pxer-app .btn-warning.dropdown-toggle:focus {
  3556. box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); }
  3557. .pxer-app .btn-danger {
  3558. color: #fff;
  3559. background-color: #dc3545;
  3560. border-color: #dc3545; }
  3561. .pxer-app .btn-danger:hover {
  3562. color: #fff;
  3563. background-color: #c82333;
  3564. border-color: #bd2130; }
  3565. .pxer-app .btn-danger:focus, .pxer-app .btn-danger.focus {
  3566. box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); }
  3567. .pxer-app .btn-danger.disabled, .pxer-app .btn-danger:disabled {
  3568. color: #fff;
  3569. background-color: #dc3545;
  3570. border-color: #dc3545; }
  3571. .pxer-app .btn-danger:not(:disabled):not(.disabled):active, .pxer-app .btn-danger:not(:disabled):not(.disabled).active,
  3572. .show > .pxer-app .btn-danger.dropdown-toggle {
  3573. color: #fff;
  3574. background-color: #bd2130;
  3575. border-color: #b21f2d; }
  3576. .pxer-app .btn-danger:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-danger:not(:disabled):not(.disabled).active:focus,
  3577. .show > .pxer-app .btn-danger.dropdown-toggle:focus {
  3578. box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); }
  3579. .pxer-app .btn-light {
  3580. color: #212529;
  3581. background-color: #f8f9fa;
  3582. border-color: #f8f9fa; }
  3583. .pxer-app .btn-light:hover {
  3584. color: #212529;
  3585. background-color: #e2e6ea;
  3586. border-color: #dae0e5; }
  3587. .pxer-app .btn-light:focus, .pxer-app .btn-light.focus {
  3588. box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); }
  3589. .pxer-app .btn-light.disabled, .pxer-app .btn-light:disabled {
  3590. color: #212529;
  3591. background-color: #f8f9fa;
  3592. border-color: #f8f9fa; }
  3593. .pxer-app .btn-light:not(:disabled):not(.disabled):active, .pxer-app .btn-light:not(:disabled):not(.disabled).active,
  3594. .show > .pxer-app .btn-light.dropdown-toggle {
  3595. color: #212529;
  3596. background-color: #dae0e5;
  3597. border-color: #d3d9df; }
  3598. .pxer-app .btn-light:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-light:not(:disabled):not(.disabled).active:focus,
  3599. .show > .pxer-app .btn-light.dropdown-toggle:focus {
  3600. box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); }
  3601. .pxer-app .btn-dark {
  3602. color: #fff;
  3603. background-color: #343a40;
  3604. border-color: #343a40; }
  3605. .pxer-app .btn-dark:hover {
  3606. color: #fff;
  3607. background-color: #23272b;
  3608. border-color: #1d2124; }
  3609. .pxer-app .btn-dark:focus, .pxer-app .btn-dark.focus {
  3610. box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); }
  3611. .pxer-app .btn-dark.disabled, .pxer-app .btn-dark:disabled {
  3612. color: #fff;
  3613. background-color: #343a40;
  3614. border-color: #343a40; }
  3615. .pxer-app .btn-dark:not(:disabled):not(.disabled):active, .pxer-app .btn-dark:not(:disabled):not(.disabled).active,
  3616. .show > .pxer-app .btn-dark.dropdown-toggle {
  3617. color: #fff;
  3618. background-color: #1d2124;
  3619. border-color: #171a1d; }
  3620. .pxer-app .btn-dark:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-dark:not(:disabled):not(.disabled).active:focus,
  3621. .show > .pxer-app .btn-dark.dropdown-toggle:focus {
  3622. box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); }
  3623. .pxer-app .btn-outline-primary {
  3624. color: #007bff;
  3625. border-color: #007bff; }
  3626. .pxer-app .btn-outline-primary:hover {
  3627. color: #fff;
  3628. background-color: #007bff;
  3629. border-color: #007bff; }
  3630. .pxer-app .btn-outline-primary:focus, .pxer-app .btn-outline-primary.focus {
  3631. box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); }
  3632. .pxer-app .btn-outline-primary.disabled, .pxer-app .btn-outline-primary:disabled {
  3633. color: #007bff;
  3634. background-color: transparent; }
  3635. .pxer-app .btn-outline-primary:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-primary:not(:disabled):not(.disabled).active,
  3636. .show > .pxer-app .btn-outline-primary.dropdown-toggle {
  3637. color: #fff;
  3638. background-color: #007bff;
  3639. border-color: #007bff; }
  3640. .pxer-app .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-primary:not(:disabled):not(.disabled).active:focus,
  3641. .show > .pxer-app .btn-outline-primary.dropdown-toggle:focus {
  3642. box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); }
  3643. .pxer-app .btn-outline-secondary {
  3644. color: #6c757d;
  3645. border-color: #6c757d; }
  3646. .pxer-app .btn-outline-secondary:hover {
  3647. color: #fff;
  3648. background-color: #6c757d;
  3649. border-color: #6c757d; }
  3650. .pxer-app .btn-outline-secondary:focus, .pxer-app .btn-outline-secondary.focus {
  3651. box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
  3652. .pxer-app .btn-outline-secondary.disabled, .pxer-app .btn-outline-secondary:disabled {
  3653. color: #6c757d;
  3654. background-color: transparent; }
  3655. .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled).active,
  3656. .show > .pxer-app .btn-outline-secondary.dropdown-toggle {
  3657. color: #fff;
  3658. background-color: #6c757d;
  3659. border-color: #6c757d; }
  3660. .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
  3661. .show > .pxer-app .btn-outline-secondary.dropdown-toggle:focus {
  3662. box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
  3663. .pxer-app .btn-outline-success {
  3664. color: #28a745;
  3665. border-color: #28a745; }
  3666. .pxer-app .btn-outline-success:hover {
  3667. color: #fff;
  3668. background-color: #28a745;
  3669. border-color: #28a745; }
  3670. .pxer-app .btn-outline-success:focus, .pxer-app .btn-outline-success.focus {
  3671. box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
  3672. .pxer-app .btn-outline-success.disabled, .pxer-app .btn-outline-success:disabled {
  3673. color: #28a745;
  3674. background-color: transparent; }
  3675. .pxer-app .btn-outline-success:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-success:not(:disabled):not(.disabled).active,
  3676. .show > .pxer-app .btn-outline-success.dropdown-toggle {
  3677. color: #fff;
  3678. background-color: #28a745;
  3679. border-color: #28a745; }
  3680. .pxer-app .btn-outline-success:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-success:not(:disabled):not(.disabled).active:focus,
  3681. .show > .pxer-app .btn-outline-success.dropdown-toggle:focus {
  3682. box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
  3683. .pxer-app .btn-outline-info {
  3684. color: #17a2b8;
  3685. border-color: #17a2b8; }
  3686. .pxer-app .btn-outline-info:hover {
  3687. color: #fff;
  3688. background-color: #17a2b8;
  3689. border-color: #17a2b8; }
  3690. .pxer-app .btn-outline-info:focus, .pxer-app .btn-outline-info.focus {
  3691. box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
  3692. .pxer-app .btn-outline-info.disabled, .pxer-app .btn-outline-info:disabled {
  3693. color: #17a2b8;
  3694. background-color: transparent; }
  3695. .pxer-app .btn-outline-info:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-info:not(:disabled):not(.disabled).active,
  3696. .show > .pxer-app .btn-outline-info.dropdown-toggle {
  3697. color: #fff;
  3698. background-color: #17a2b8;
  3699. border-color: #17a2b8; }
  3700. .pxer-app .btn-outline-info:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-info:not(:disabled):not(.disabled).active:focus,
  3701. .show > .pxer-app .btn-outline-info.dropdown-toggle:focus {
  3702. box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
  3703. .pxer-app .btn-outline-warning {
  3704. color: #ffc107;
  3705. border-color: #ffc107; }
  3706. .pxer-app .btn-outline-warning:hover {
  3707. color: #212529;
  3708. background-color: #ffc107;
  3709. border-color: #ffc107; }
  3710. .pxer-app .btn-outline-warning:focus, .pxer-app .btn-outline-warning.focus {
  3711. box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
  3712. .pxer-app .btn-outline-warning.disabled, .pxer-app .btn-outline-warning:disabled {
  3713. color: #ffc107;
  3714. background-color: transparent; }
  3715. .pxer-app .btn-outline-warning:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-warning:not(:disabled):not(.disabled).active,
  3716. .show > .pxer-app .btn-outline-warning.dropdown-toggle {
  3717. color: #212529;
  3718. background-color: #ffc107;
  3719. border-color: #ffc107; }
  3720. .pxer-app .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-warning:not(:disabled):not(.disabled).active:focus,
  3721. .show > .pxer-app .btn-outline-warning.dropdown-toggle:focus {
  3722. box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
  3723. .pxer-app .btn-outline-danger {
  3724. color: #dc3545;
  3725. border-color: #dc3545; }
  3726. .pxer-app .btn-outline-danger:hover {
  3727. color: #fff;
  3728. background-color: #dc3545;
  3729. border-color: #dc3545; }
  3730. .pxer-app .btn-outline-danger:focus, .pxer-app .btn-outline-danger.focus {
  3731. box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
  3732. .pxer-app .btn-outline-danger.disabled, .pxer-app .btn-outline-danger:disabled {
  3733. color: #dc3545;
  3734. background-color: transparent; }
  3735. .pxer-app .btn-outline-danger:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-danger:not(:disabled):not(.disabled).active,
  3736. .show > .pxer-app .btn-outline-danger.dropdown-toggle {
  3737. color: #fff;
  3738. background-color: #dc3545;
  3739. border-color: #dc3545; }
  3740. .pxer-app .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-danger:not(:disabled):not(.disabled).active:focus,
  3741. .show > .pxer-app .btn-outline-danger.dropdown-toggle:focus {
  3742. box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
  3743. .pxer-app .btn-outline-light {
  3744. color: #f8f9fa;
  3745. border-color: #f8f9fa; }
  3746. .pxer-app .btn-outline-light:hover {
  3747. color: #212529;
  3748. background-color: #f8f9fa;
  3749. border-color: #f8f9fa; }
  3750. .pxer-app .btn-outline-light:focus, .pxer-app .btn-outline-light.focus {
  3751. box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
  3752. .pxer-app .btn-outline-light.disabled, .pxer-app .btn-outline-light:disabled {
  3753. color: #f8f9fa;
  3754. background-color: transparent; }
  3755. .pxer-app .btn-outline-light:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-light:not(:disabled):not(.disabled).active,
  3756. .show > .pxer-app .btn-outline-light.dropdown-toggle {
  3757. color: #212529;
  3758. background-color: #f8f9fa;
  3759. border-color: #f8f9fa; }
  3760. .pxer-app .btn-outline-light:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-light:not(:disabled):not(.disabled).active:focus,
  3761. .show > .pxer-app .btn-outline-light.dropdown-toggle:focus {
  3762. box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
  3763. .pxer-app .btn-outline-dark {
  3764. color: #343a40;
  3765. border-color: #343a40; }
  3766. .pxer-app .btn-outline-dark:hover {
  3767. color: #fff;
  3768. background-color: #343a40;
  3769. border-color: #343a40; }
  3770. .pxer-app .btn-outline-dark:focus, .pxer-app .btn-outline-dark.focus {
  3771. box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
  3772. .pxer-app .btn-outline-dark.disabled, .pxer-app .btn-outline-dark:disabled {
  3773. color: #343a40;
  3774. background-color: transparent; }
  3775. .pxer-app .btn-outline-dark:not(:disabled):not(.disabled):active, .pxer-app .btn-outline-dark:not(:disabled):not(.disabled).active,
  3776. .show > .pxer-app .btn-outline-dark.dropdown-toggle {
  3777. color: #fff;
  3778. background-color: #343a40;
  3779. border-color: #343a40; }
  3780. .pxer-app .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .pxer-app .btn-outline-dark:not(:disabled):not(.disabled).active:focus,
  3781. .show > .pxer-app .btn-outline-dark.dropdown-toggle:focus {
  3782. box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
  3783. .pxer-app .btn-link {
  3784. font-weight: 400;
  3785. color: #007bff;
  3786. text-decoration: none; }
  3787. .pxer-app .btn-link:hover {
  3788. color: #0056b3;
  3789. text-decoration: underline; }
  3790. .pxer-app .btn-link:focus, .pxer-app .btn-link.focus {
  3791. text-decoration: underline;
  3792. box-shadow: none; }
  3793. .pxer-app .btn-link:disabled, .pxer-app .btn-link.disabled {
  3794. color: #6c757d;
  3795. pointer-events: none; }
  3796. .pxer-app .btn-lg {
  3797. padding: 0.5rem 1rem;
  3798. font-size: 1.25rem;
  3799. line-height: 1.5;
  3800. border-radius: 0.3rem; }
  3801. .pxer-app .btn-sm, .pxer-app .btn {
  3802. padding: 0.25rem 0.5rem;
  3803. font-size: 0.875rem;
  3804. line-height: 1.5;
  3805. border-radius: 0.2rem; }
  3806. .pxer-app .btn-block {
  3807. display: block;
  3808. width: 100%; }
  3809. .pxer-app .btn-block + .btn-block {
  3810. margin-top: 0.5rem; }
  3811. .pxer-app input[type="submit"].btn-block,
  3812. .pxer-app input[type="reset"].btn-block,
  3813. .pxer-app input[type="button"].btn-block {
  3814. width: 100%; }
  3815. .pxer-app .badge {
  3816. display: inline-block;
  3817. padding: 0.25em 0.4em;
  3818. font-size: 75%;
  3819. font-weight: 700;
  3820. line-height: 1;
  3821. text-align: center;
  3822. white-space: nowrap;
  3823. vertical-align: baseline;
  3824. border-radius: 0.25rem;
  3825. transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
  3826. @media (prefers-reduced-motion: reduce) {
  3827. .pxer-app .badge {
  3828. transition: none; } }
  3829. a.pxer-app .badge:hover, a.pxer-app .badge:focus {
  3830. text-decoration: none; }
  3831. .pxer-app .badge:empty {
  3832. display: none; }
  3833. .pxer-app .btn .badge {
  3834. position: relative;
  3835. top: -1px; }
  3836. .pxer-app .badge-pill {
  3837. padding-right: 0.6em;
  3838. padding-left: 0.6em;
  3839. border-radius: 10rem; }
  3840. .pxer-app .badge-primary {
  3841. color: #fff;
  3842. background-color: #007bff; }
  3843. a.pxer-app .badge-primary:hover, a.pxer-app .badge-primary:focus {
  3844. color: #fff;
  3845. background-color: #0062cc; }
  3846. a.pxer-app .badge-primary:focus, a.pxer-app .badge-primary.focus {
  3847. outline: 0;
  3848. box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); }
  3849. .pxer-app .badge-secondary {
  3850. color: #fff;
  3851. background-color: #6c757d; }
  3852. a.pxer-app .badge-secondary:hover, a.pxer-app .badge-secondary:focus {
  3853. color: #fff;
  3854. background-color: #545b62; }
  3855. a.pxer-app .badge-secondary:focus, a.pxer-app .badge-secondary.focus {
  3856. outline: 0;
  3857. box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); }
  3858. .pxer-app .badge-success {
  3859. color: #fff;
  3860. background-color: #28a745; }
  3861. a.pxer-app .badge-success:hover, a.pxer-app .badge-success:focus {
  3862. color: #fff;
  3863. background-color: #1e7e34; }
  3864. a.pxer-app .badge-success:focus, a.pxer-app .badge-success.focus {
  3865. outline: 0;
  3866. box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); }
  3867. .pxer-app .badge-info {
  3868. color: #fff;
  3869. background-color: #17a2b8; }
  3870. a.pxer-app .badge-info:hover, a.pxer-app .badge-info:focus {
  3871. color: #fff;
  3872. background-color: #117a8b; }
  3873. a.pxer-app .badge-info:focus, a.pxer-app .badge-info.focus {
  3874. outline: 0;
  3875. box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); }
  3876. .pxer-app .badge-warning {
  3877. color: #212529;
  3878. background-color: #ffc107; }
  3879. a.pxer-app .badge-warning:hover, a.pxer-app .badge-warning:focus {
  3880. color: #212529;
  3881. background-color: #d39e00; }
  3882. a.pxer-app .badge-warning:focus, a.pxer-app .badge-warning.focus {
  3883. outline: 0;
  3884. box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); }
  3885. .pxer-app .badge-danger {
  3886. color: #fff;
  3887. background-color: #dc3545; }
  3888. a.pxer-app .badge-danger:hover, a.pxer-app .badge-danger:focus {
  3889. color: #fff;
  3890. background-color: #bd2130; }
  3891. a.pxer-app .badge-danger:focus, a.pxer-app .badge-danger.focus {
  3892. outline: 0;
  3893. box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); }
  3894. .pxer-app .badge-light {
  3895. color: #212529;
  3896. background-color: #f8f9fa; }
  3897. a.pxer-app .badge-light:hover, a.pxer-app .badge-light:focus {
  3898. color: #212529;
  3899. background-color: #dae0e5; }
  3900. a.pxer-app .badge-light:focus, a.pxer-app .badge-light.focus {
  3901. outline: 0;
  3902. box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); }
  3903. .pxer-app .badge-dark {
  3904. color: #fff;
  3905. background-color: #343a40; }
  3906. a.pxer-app .badge-dark:hover, a.pxer-app .badge-dark:focus {
  3907. color: #fff;
  3908. background-color: #1d2124; }
  3909. a.pxer-app .badge-dark:focus, a.pxer-app .badge-dark.focus {
  3910. outline: 0;
  3911. box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); }
  3912. .pxer-app .align-baseline {
  3913. vertical-align: baseline !important; }
  3914. .pxer-app .align-top {
  3915. vertical-align: top !important; }
  3916. .pxer-app .align-middle {
  3917. vertical-align: middle !important; }
  3918. .pxer-app .align-bottom {
  3919. vertical-align: bottom !important; }
  3920. .pxer-app .align-text-bottom {
  3921. vertical-align: text-bottom !important; }
  3922. .pxer-app .align-text-top {
  3923. vertical-align: text-top !important; }
  3924. .pxer-app .bg-primary {
  3925. background-color: #007bff !important; }
  3926. .pxer-app a.bg-primary:hover, .pxer-app a.bg-primary:focus,
  3927. .pxer-app button.bg-primary:hover,
  3928. .pxer-app button.bg-primary:focus {
  3929. background-color: #0062cc !important; }
  3930. .pxer-app .bg-secondary {
  3931. background-color: #6c757d !important; }
  3932. .pxer-app a.bg-secondary:hover, .pxer-app a.bg-secondary:focus,
  3933. .pxer-app button.bg-secondary:hover,
  3934. .pxer-app button.bg-secondary:focus {
  3935. background-color: #545b62 !important; }
  3936. .pxer-app .bg-success {
  3937. background-color: #28a745 !important; }
  3938. .pxer-app a.bg-success:hover, .pxer-app a.bg-success:focus,
  3939. .pxer-app button.bg-success:hover,
  3940. .pxer-app button.bg-success:focus {
  3941. background-color: #1e7e34 !important; }
  3942. .pxer-app .bg-info {
  3943. background-color: #17a2b8 !important; }
  3944. .pxer-app a.bg-info:hover, .pxer-app a.bg-info:focus,
  3945. .pxer-app button.bg-info:hover,
  3946. .pxer-app button.bg-info:focus {
  3947. background-color: #117a8b !important; }
  3948. .pxer-app .bg-warning {
  3949. background-color: #ffc107 !important; }
  3950. .pxer-app a.bg-warning:hover, .pxer-app a.bg-warning:focus,
  3951. .pxer-app button.bg-warning:hover,
  3952. .pxer-app button.bg-warning:focus {
  3953. background-color: #d39e00 !important; }
  3954. .pxer-app .bg-danger {
  3955. background-color: #dc3545 !important; }
  3956. .pxer-app a.bg-danger:hover, .pxer-app a.bg-danger:focus,
  3957. .pxer-app button.bg-danger:hover,
  3958. .pxer-app button.bg-danger:focus {
  3959. background-color: #bd2130 !important; }
  3960. .pxer-app .bg-light {
  3961. background-color: #f8f9fa !important; }
  3962. .pxer-app a.bg-light:hover, .pxer-app a.bg-light:focus,
  3963. .pxer-app button.bg-light:hover,
  3964. .pxer-app button.bg-light:focus {
  3965. background-color: #dae0e5 !important; }
  3966. .pxer-app .bg-dark {
  3967. background-color: #343a40 !important; }
  3968. .pxer-app a.bg-dark:hover, .pxer-app a.bg-dark:focus,
  3969. .pxer-app button.bg-dark:hover,
  3970. .pxer-app button.bg-dark:focus {
  3971. background-color: #1d2124 !important; }
  3972. .pxer-app .bg-white {
  3973. background-color: #fff !important; }
  3974. .pxer-app .bg-transparent {
  3975. background-color: transparent !important; }
  3976. .pxer-app .border {
  3977. border: 1px solid #dee2e6 !important; }
  3978. .pxer-app .border-top {
  3979. border-top: 1px solid #dee2e6 !important; }
  3980. .pxer-app .border-right {
  3981. border-right: 1px solid #dee2e6 !important; }
  3982. .pxer-app .border-bottom {
  3983. border-bottom: 1px solid #dee2e6 !important; }
  3984. .pxer-app .border-left {
  3985. border-left: 1px solid #dee2e6 !important; }
  3986. .pxer-app .border-0 {
  3987. border: 0 !important; }
  3988. .pxer-app .border-top-0 {
  3989. border-top: 0 !important; }
  3990. .pxer-app .border-right-0 {
  3991. border-right: 0 !important; }
  3992. .pxer-app .border-bottom-0 {
  3993. border-bottom: 0 !important; }
  3994. .pxer-app .border-left-0 {
  3995. border-left: 0 !important; }
  3996. .pxer-app .border-primary {
  3997. border-color: #007bff !important; }
  3998. .pxer-app .border-secondary {
  3999. border-color: #6c757d !important; }
  4000. .pxer-app .border-success {
  4001. border-color: #28a745 !important; }
  4002. .pxer-app .border-info {
  4003. border-color: #17a2b8 !important; }
  4004. .pxer-app .border-warning {
  4005. border-color: #ffc107 !important; }
  4006. .pxer-app .border-danger {
  4007. border-color: #dc3545 !important; }
  4008. .pxer-app .border-light {
  4009. border-color: #f8f9fa !important; }
  4010. .pxer-app .border-dark {
  4011. border-color: #343a40 !important; }
  4012. .pxer-app .border-white {
  4013. border-color: #fff !important; }
  4014. .pxer-app .rounded-sm {
  4015. border-radius: 0.2rem !important; }
  4016. .pxer-app .rounded {
  4017. border-radius: 0.25rem !important; }
  4018. .pxer-app .rounded-top {
  4019. border-top-left-radius: 0.25rem !important;
  4020. border-top-right-radius: 0.25rem !important; }
  4021. .pxer-app .rounded-right {
  4022. border-top-right-radius: 0.25rem !important;
  4023. border-bottom-right-radius: 0.25rem !important; }
  4024. .pxer-app .rounded-bottom {
  4025. border-bottom-right-radius: 0.25rem !important;
  4026. border-bottom-left-radius: 0.25rem !important; }
  4027. .pxer-app .rounded-left {
  4028. border-top-left-radius: 0.25rem !important;
  4029. border-bottom-left-radius: 0.25rem !important; }
  4030. .pxer-app .rounded-lg {
  4031. border-radius: 0.3rem !important; }
  4032. .pxer-app .rounded-circle {
  4033. border-radius: 50% !important; }
  4034. .pxer-app .rounded-pill {
  4035. border-radius: 50rem !important; }
  4036. .pxer-app .rounded-0 {
  4037. border-radius: 0 !important; }
  4038. .pxer-app .clearfix::after {
  4039. display: block;
  4040. clear: both;
  4041. content: ""; }
  4042. .pxer-app .d-none {
  4043. display: none !important; }
  4044. .pxer-app .d-inline {
  4045. display: inline !important; }
  4046. .pxer-app .d-inline-block {
  4047. display: inline-block !important; }
  4048. .pxer-app .d-block {
  4049. display: block !important; }
  4050. .pxer-app .d-table {
  4051. display: table !important; }
  4052. .pxer-app .d-table-row {
  4053. display: table-row !important; }
  4054. .pxer-app .d-table-cell {
  4055. display: table-cell !important; }
  4056. .pxer-app .d-flex {
  4057. display: flex !important; }
  4058. .pxer-app .d-inline-flex {
  4059. display: inline-flex !important; }
  4060. @media (min-width: 576px) {
  4061. .pxer-app .d-sm-none {
  4062. display: none !important; }
  4063. .pxer-app .d-sm-inline {
  4064. display: inline !important; }
  4065. .pxer-app .d-sm-inline-block {
  4066. display: inline-block !important; }
  4067. .pxer-app .d-sm-block {
  4068. display: block !important; }
  4069. .pxer-app .d-sm-table {
  4070. display: table !important; }
  4071. .pxer-app .d-sm-table-row {
  4072. display: table-row !important; }
  4073. .pxer-app .d-sm-table-cell {
  4074. display: table-cell !important; }
  4075. .pxer-app .d-sm-flex {
  4076. display: flex !important; }
  4077. .pxer-app .d-sm-inline-flex {
  4078. display: inline-flex !important; } }
  4079. @media (min-width: 768px) {
  4080. .pxer-app .d-md-none {
  4081. display: none !important; }
  4082. .pxer-app .d-md-inline {
  4083. display: inline !important; }
  4084. .pxer-app .d-md-inline-block {
  4085. display: inline-block !important; }
  4086. .pxer-app .d-md-block {
  4087. display: block !important; }
  4088. .pxer-app .d-md-table {
  4089. display: table !important; }
  4090. .pxer-app .d-md-table-row {
  4091. display: table-row !important; }
  4092. .pxer-app .d-md-table-cell {
  4093. display: table-cell !important; }
  4094. .pxer-app .d-md-flex {
  4095. display: flex !important; }
  4096. .pxer-app .d-md-inline-flex {
  4097. display: inline-flex !important; } }
  4098. @media (min-width: 992px) {
  4099. .pxer-app .d-lg-none {
  4100. display: none !important; }
  4101. .pxer-app .d-lg-inline {
  4102. display: inline !important; }
  4103. .pxer-app .d-lg-inline-block {
  4104. display: inline-block !important; }
  4105. .pxer-app .d-lg-block {
  4106. display: block !important; }
  4107. .pxer-app .d-lg-table {
  4108. display: table !important; }
  4109. .pxer-app .d-lg-table-row {
  4110. display: table-row !important; }
  4111. .pxer-app .d-lg-table-cell {
  4112. display: table-cell !important; }
  4113. .pxer-app .d-lg-flex {
  4114. display: flex !important; }
  4115. .pxer-app .d-lg-inline-flex {
  4116. display: inline-flex !important; } }
  4117. @media (min-width: 1200px) {
  4118. .pxer-app .d-xl-none {
  4119. display: none !important; }
  4120. .pxer-app .d-xl-inline {
  4121. display: inline !important; }
  4122. .pxer-app .d-xl-inline-block {
  4123. display: inline-block !important; }
  4124. .pxer-app .d-xl-block {
  4125. display: block !important; }
  4126. .pxer-app .d-xl-table {
  4127. display: table !important; }
  4128. .pxer-app .d-xl-table-row {
  4129. display: table-row !important; }
  4130. .pxer-app .d-xl-table-cell {
  4131. display: table-cell !important; }
  4132. .pxer-app .d-xl-flex {
  4133. display: flex !important; }
  4134. .pxer-app .d-xl-inline-flex {
  4135. display: inline-flex !important; } }
  4136. @media print {
  4137. .pxer-app .d-print-none {
  4138. display: none !important; }
  4139. .pxer-app .d-print-inline {
  4140. display: inline !important; }
  4141. .pxer-app .d-print-inline-block {
  4142. display: inline-block !important; }
  4143. .pxer-app .d-print-block {
  4144. display: block !important; }
  4145. .pxer-app .d-print-table {
  4146. display: table !important; }
  4147. .pxer-app .d-print-table-row {
  4148. display: table-row !important; }
  4149. .pxer-app .d-print-table-cell {
  4150. display: table-cell !important; }
  4151. .pxer-app .d-print-flex {
  4152. display: flex !important; }
  4153. .pxer-app .d-print-inline-flex {
  4154. display: inline-flex !important; } }
  4155. .pxer-app .embed-responsive {
  4156. position: relative;
  4157. display: block;
  4158. width: 100%;
  4159. padding: 0;
  4160. overflow: hidden; }
  4161. .pxer-app .embed-responsive::before {
  4162. display: block;
  4163. content: ""; }
  4164. .pxer-app .embed-responsive .embed-responsive-item,
  4165. .pxer-app .embed-responsive iframe,
  4166. .pxer-app .embed-responsive embed,
  4167. .pxer-app .embed-responsive object,
  4168. .pxer-app .embed-responsive video {
  4169. position: absolute;
  4170. top: 0;
  4171. bottom: 0;
  4172. left: 0;
  4173. width: 100%;
  4174. height: 100%;
  4175. border: 0; }
  4176. .pxer-app .embed-responsive-21by9::before {
  4177. padding-top: 42.85714%; }
  4178. .pxer-app .embed-responsive-16by9::before {
  4179. padding-top: 56.25%; }
  4180. .pxer-app .embed-responsive-4by3::before {
  4181. padding-top: 75%; }
  4182. .pxer-app .embed-responsive-1by1::before {
  4183. padding-top: 100%; }
  4184. .pxer-app .flex-row {
  4185. flex-direction: row !important; }
  4186. .pxer-app .flex-column {
  4187. flex-direction: column !important; }
  4188. .pxer-app .flex-row-reverse {
  4189. flex-direction: row-reverse !important; }
  4190. .pxer-app .flex-column-reverse {
  4191. flex-direction: column-reverse !important; }
  4192. .pxer-app .flex-wrap {
  4193. flex-wrap: wrap !important; }
  4194. .pxer-app .flex-nowrap {
  4195. flex-wrap: nowrap !important; }
  4196. .pxer-app .flex-wrap-reverse {
  4197. flex-wrap: wrap-reverse !important; }
  4198. .pxer-app .flex-fill {
  4199. flex: 1 1 auto !important; }
  4200. .pxer-app .flex-grow-0 {
  4201. flex-grow: 0 !important; }
  4202. .pxer-app .flex-grow-1 {
  4203. flex-grow: 1 !important; }
  4204. .pxer-app .flex-shrink-0 {
  4205. flex-shrink: 0 !important; }
  4206. .pxer-app .flex-shrink-1 {
  4207. flex-shrink: 1 !important; }
  4208. .pxer-app .justify-content-start {
  4209. justify-content: flex-start !important; }
  4210. .pxer-app .justify-content-end {
  4211. justify-content: flex-end !important; }
  4212. .pxer-app .justify-content-center {
  4213. justify-content: center !important; }
  4214. .pxer-app .justify-content-between {
  4215. justify-content: space-between !important; }
  4216. .pxer-app .justify-content-around {
  4217. justify-content: space-around !important; }
  4218. .pxer-app .align-items-start {
  4219. align-items: flex-start !important; }
  4220. .pxer-app .align-items-end {
  4221. align-items: flex-end !important; }
  4222. .pxer-app .align-items-center {
  4223. align-items: center !important; }
  4224. .pxer-app .align-items-baseline {
  4225. align-items: baseline !important; }
  4226. .pxer-app .align-items-stretch {
  4227. align-items: stretch !important; }
  4228. .pxer-app .align-content-start {
  4229. align-content: flex-start !important; }
  4230. .pxer-app .align-content-end {
  4231. align-content: flex-end !important; }
  4232. .pxer-app .align-content-center {
  4233. align-content: center !important; }
  4234. .pxer-app .align-content-between {
  4235. align-content: space-between !important; }
  4236. .pxer-app .align-content-around {
  4237. align-content: space-around !important; }
  4238. .pxer-app .align-content-stretch {
  4239. align-content: stretch !important; }
  4240. .pxer-app .align-self-auto {
  4241. align-self: auto !important; }
  4242. .pxer-app .align-self-start {
  4243. align-self: flex-start !important; }
  4244. .pxer-app .align-self-end {
  4245. align-self: flex-end !important; }
  4246. .pxer-app .align-self-center {
  4247. align-self: center !important; }
  4248. .pxer-app .align-self-baseline {
  4249. align-self: baseline !important; }
  4250. .pxer-app .align-self-stretch {
  4251. align-self: stretch !important; }
  4252. @media (min-width: 576px) {
  4253. .pxer-app .flex-sm-row {
  4254. flex-direction: row !important; }
  4255. .pxer-app .flex-sm-column {
  4256. flex-direction: column !important; }
  4257. .pxer-app .flex-sm-row-reverse {
  4258. flex-direction: row-reverse !important; }
  4259. .pxer-app .flex-sm-column-reverse {
  4260. flex-direction: column-reverse !important; }
  4261. .pxer-app .flex-sm-wrap {
  4262. flex-wrap: wrap !important; }
  4263. .pxer-app .flex-sm-nowrap {
  4264. flex-wrap: nowrap !important; }
  4265. .pxer-app .flex-sm-wrap-reverse {
  4266. flex-wrap: wrap-reverse !important; }
  4267. .pxer-app .flex-sm-fill {
  4268. flex: 1 1 auto !important; }
  4269. .pxer-app .flex-sm-grow-0 {
  4270. flex-grow: 0 !important; }
  4271. .pxer-app .flex-sm-grow-1 {
  4272. flex-grow: 1 !important; }
  4273. .pxer-app .flex-sm-shrink-0 {
  4274. flex-shrink: 0 !important; }
  4275. .pxer-app .flex-sm-shrink-1 {
  4276. flex-shrink: 1 !important; }
  4277. .pxer-app .justify-content-sm-start {
  4278. justify-content: flex-start !important; }
  4279. .pxer-app .justify-content-sm-end {
  4280. justify-content: flex-end !important; }
  4281. .pxer-app .justify-content-sm-center {
  4282. justify-content: center !important; }
  4283. .pxer-app .justify-content-sm-between {
  4284. justify-content: space-between !important; }
  4285. .pxer-app .justify-content-sm-around {
  4286. justify-content: space-around !important; }
  4287. .pxer-app .align-items-sm-start {
  4288. align-items: flex-start !important; }
  4289. .pxer-app .align-items-sm-end {
  4290. align-items: flex-end !important; }
  4291. .pxer-app .align-items-sm-center {
  4292. align-items: center !important; }
  4293. .pxer-app .align-items-sm-baseline {
  4294. align-items: baseline !important; }
  4295. .pxer-app .align-items-sm-stretch {
  4296. align-items: stretch !important; }
  4297. .pxer-app .align-content-sm-start {
  4298. align-content: flex-start !important; }
  4299. .pxer-app .align-content-sm-end {
  4300. align-content: flex-end !important; }
  4301. .pxer-app .align-content-sm-center {
  4302. align-content: center !important; }
  4303. .pxer-app .align-content-sm-between {
  4304. align-content: space-between !important; }
  4305. .pxer-app .align-content-sm-around {
  4306. align-content: space-around !important; }
  4307. .pxer-app .align-content-sm-stretch {
  4308. align-content: stretch !important; }
  4309. .pxer-app .align-self-sm-auto {
  4310. align-self: auto !important; }
  4311. .pxer-app .align-self-sm-start {
  4312. align-self: flex-start !important; }
  4313. .pxer-app .align-self-sm-end {
  4314. align-self: flex-end !important; }
  4315. .pxer-app .align-self-sm-center {
  4316. align-self: center !important; }
  4317. .pxer-app .align-self-sm-baseline {
  4318. align-self: baseline !important; }
  4319. .pxer-app .align-self-sm-stretch {
  4320. align-self: stretch !important; } }
  4321. @media (min-width: 768px) {
  4322. .pxer-app .flex-md-row {
  4323. flex-direction: row !important; }
  4324. .pxer-app .flex-md-column {
  4325. flex-direction: column !important; }
  4326. .pxer-app .flex-md-row-reverse {
  4327. flex-direction: row-reverse !important; }
  4328. .pxer-app .flex-md-column-reverse {
  4329. flex-direction: column-reverse !important; }
  4330. .pxer-app .flex-md-wrap {
  4331. flex-wrap: wrap !important; }
  4332. .pxer-app .flex-md-nowrap {
  4333. flex-wrap: nowrap !important; }
  4334. .pxer-app .flex-md-wrap-reverse {
  4335. flex-wrap: wrap-reverse !important; }
  4336. .pxer-app .flex-md-fill {
  4337. flex: 1 1 auto !important; }
  4338. .pxer-app .flex-md-grow-0 {
  4339. flex-grow: 0 !important; }
  4340. .pxer-app .flex-md-grow-1 {
  4341. flex-grow: 1 !important; }
  4342. .pxer-app .flex-md-shrink-0 {
  4343. flex-shrink: 0 !important; }
  4344. .pxer-app .flex-md-shrink-1 {
  4345. flex-shrink: 1 !important; }
  4346. .pxer-app .justify-content-md-start {
  4347. justify-content: flex-start !important; }
  4348. .pxer-app .justify-content-md-end {
  4349. justify-content: flex-end !important; }
  4350. .pxer-app .justify-content-md-center {
  4351. justify-content: center !important; }
  4352. .pxer-app .justify-content-md-between {
  4353. justify-content: space-between !important; }
  4354. .pxer-app .justify-content-md-around {
  4355. justify-content: space-around !important; }
  4356. .pxer-app .align-items-md-start {
  4357. align-items: flex-start !important; }
  4358. .pxer-app .align-items-md-end {
  4359. align-items: flex-end !important; }
  4360. .pxer-app .align-items-md-center {
  4361. align-items: center !important; }
  4362. .pxer-app .align-items-md-baseline {
  4363. align-items: baseline !important; }
  4364. .pxer-app .align-items-md-stretch {
  4365. align-items: stretch !important; }
  4366. .pxer-app .align-content-md-start {
  4367. align-content: flex-start !important; }
  4368. .pxer-app .align-content-md-end {
  4369. align-content: flex-end !important; }
  4370. .pxer-app .align-content-md-center {
  4371. align-content: center !important; }
  4372. .pxer-app .align-content-md-between {
  4373. align-content: space-between !important; }
  4374. .pxer-app .align-content-md-around {
  4375. align-content: space-around !important; }
  4376. .pxer-app .align-content-md-stretch {
  4377. align-content: stretch !important; }
  4378. .pxer-app .align-self-md-auto {
  4379. align-self: auto !important; }
  4380. .pxer-app .align-self-md-start {
  4381. align-self: flex-start !important; }
  4382. .pxer-app .align-self-md-end {
  4383. align-self: flex-end !important; }
  4384. .pxer-app .align-self-md-center {
  4385. align-self: center !important; }
  4386. .pxer-app .align-self-md-baseline {
  4387. align-self: baseline !important; }
  4388. .pxer-app .align-self-md-stretch {
  4389. align-self: stretch !important; } }
  4390. @media (min-width: 992px) {
  4391. .pxer-app .flex-lg-row {
  4392. flex-direction: row !important; }
  4393. .pxer-app .flex-lg-column {
  4394. flex-direction: column !important; }
  4395. .pxer-app .flex-lg-row-reverse {
  4396. flex-direction: row-reverse !important; }
  4397. .pxer-app .flex-lg-column-reverse {
  4398. flex-direction: column-reverse !important; }
  4399. .pxer-app .flex-lg-wrap {
  4400. flex-wrap: wrap !important; }
  4401. .pxer-app .flex-lg-nowrap {
  4402. flex-wrap: nowrap !important; }
  4403. .pxer-app .flex-lg-wrap-reverse {
  4404. flex-wrap: wrap-reverse !important; }
  4405. .pxer-app .flex-lg-fill {
  4406. flex: 1 1 auto !important; }
  4407. .pxer-app .flex-lg-grow-0 {
  4408. flex-grow: 0 !important; }
  4409. .pxer-app .flex-lg-grow-1 {
  4410. flex-grow: 1 !important; }
  4411. .pxer-app .flex-lg-shrink-0 {
  4412. flex-shrink: 0 !important; }
  4413. .pxer-app .flex-lg-shrink-1 {
  4414. flex-shrink: 1 !important; }
  4415. .pxer-app .justify-content-lg-start {
  4416. justify-content: flex-start !important; }
  4417. .pxer-app .justify-content-lg-end {
  4418. justify-content: flex-end !important; }
  4419. .pxer-app .justify-content-lg-center {
  4420. justify-content: center !important; }
  4421. .pxer-app .justify-content-lg-between {
  4422. justify-content: space-between !important; }
  4423. .pxer-app .justify-content-lg-around {
  4424. justify-content: space-around !important; }
  4425. .pxer-app .align-items-lg-start {
  4426. align-items: flex-start !important; }
  4427. .pxer-app .align-items-lg-end {
  4428. align-items: flex-end !important; }
  4429. .pxer-app .align-items-lg-center {
  4430. align-items: center !important; }
  4431. .pxer-app .align-items-lg-baseline {
  4432. align-items: baseline !important; }
  4433. .pxer-app .align-items-lg-stretch {
  4434. align-items: stretch !important; }
  4435. .pxer-app .align-content-lg-start {
  4436. align-content: flex-start !important; }
  4437. .pxer-app .align-content-lg-end {
  4438. align-content: flex-end !important; }
  4439. .pxer-app .align-content-lg-center {
  4440. align-content: center !important; }
  4441. .pxer-app .align-content-lg-between {
  4442. align-content: space-between !important; }
  4443. .pxer-app .align-content-lg-around {
  4444. align-content: space-around !important; }
  4445. .pxer-app .align-content-lg-stretch {
  4446. align-content: stretch !important; }
  4447. .pxer-app .align-self-lg-auto {
  4448. align-self: auto !important; }
  4449. .pxer-app .align-self-lg-start {
  4450. align-self: flex-start !important; }
  4451. .pxer-app .align-self-lg-end {
  4452. align-self: flex-end !important; }
  4453. .pxer-app .align-self-lg-center {
  4454. align-self: center !important; }
  4455. .pxer-app .align-self-lg-baseline {
  4456. align-self: baseline !important; }
  4457. .pxer-app .align-self-lg-stretch {
  4458. align-self: stretch !important; } }
  4459. @media (min-width: 1200px) {
  4460. .pxer-app .flex-xl-row {
  4461. flex-direction: row !important; }
  4462. .pxer-app .flex-xl-column {
  4463. flex-direction: column !important; }
  4464. .pxer-app .flex-xl-row-reverse {
  4465. flex-direction: row-reverse !important; }
  4466. .pxer-app .flex-xl-column-reverse {
  4467. flex-direction: column-reverse !important; }
  4468. .pxer-app .flex-xl-wrap {
  4469. flex-wrap: wrap !important; }
  4470. .pxer-app .flex-xl-nowrap {
  4471. flex-wrap: nowrap !important; }
  4472. .pxer-app .flex-xl-wrap-reverse {
  4473. flex-wrap: wrap-reverse !important; }
  4474. .pxer-app .flex-xl-fill {
  4475. flex: 1 1 auto !important; }
  4476. .pxer-app .flex-xl-grow-0 {
  4477. flex-grow: 0 !important; }
  4478. .pxer-app .flex-xl-grow-1 {
  4479. flex-grow: 1 !important; }
  4480. .pxer-app .flex-xl-shrink-0 {
  4481. flex-shrink: 0 !important; }
  4482. .pxer-app .flex-xl-shrink-1 {
  4483. flex-shrink: 1 !important; }
  4484. .pxer-app .justify-content-xl-start {
  4485. justify-content: flex-start !important; }
  4486. .pxer-app .justify-content-xl-end {
  4487. justify-content: flex-end !important; }
  4488. .pxer-app .justify-content-xl-center {
  4489. justify-content: center !important; }
  4490. .pxer-app .justify-content-xl-between {
  4491. justify-content: space-between !important; }
  4492. .pxer-app .justify-content-xl-around {
  4493. justify-content: space-around !important; }
  4494. .pxer-app .align-items-xl-start {
  4495. align-items: flex-start !important; }
  4496. .pxer-app .align-items-xl-end {
  4497. align-items: flex-end !important; }
  4498. .pxer-app .align-items-xl-center {
  4499. align-items: center !important; }
  4500. .pxer-app .align-items-xl-baseline {
  4501. align-items: baseline !important; }
  4502. .pxer-app .align-items-xl-stretch {
  4503. align-items: stretch !important; }
  4504. .pxer-app .align-content-xl-start {
  4505. align-content: flex-start !important; }
  4506. .pxer-app .align-content-xl-end {
  4507. align-content: flex-end !important; }
  4508. .pxer-app .align-content-xl-center {
  4509. align-content: center !important; }
  4510. .pxer-app .align-content-xl-between {
  4511. align-content: space-between !important; }
  4512. .pxer-app .align-content-xl-around {
  4513. align-content: space-around !important; }
  4514. .pxer-app .align-content-xl-stretch {
  4515. align-content: stretch !important; }
  4516. .pxer-app .align-self-xl-auto {
  4517. align-self: auto !important; }
  4518. .pxer-app .align-self-xl-start {
  4519. align-self: flex-start !important; }
  4520. .pxer-app .align-self-xl-end {
  4521. align-self: flex-end !important; }
  4522. .pxer-app .align-self-xl-center {
  4523. align-self: center !important; }
  4524. .pxer-app .align-self-xl-baseline {
  4525. align-self: baseline !important; }
  4526. .pxer-app .align-self-xl-stretch {
  4527. align-self: stretch !important; } }
  4528. .pxer-app .float-left {
  4529. float: left !important; }
  4530. .pxer-app .float-right {
  4531. float: right !important; }
  4532. .pxer-app .float-none {
  4533. float: none !important; }
  4534. @media (min-width: 576px) {
  4535. .pxer-app .float-sm-left {
  4536. float: left !important; }
  4537. .pxer-app .float-sm-right {
  4538. float: right !important; }
  4539. .pxer-app .float-sm-none {
  4540. float: none !important; } }
  4541. @media (min-width: 768px) {
  4542. .pxer-app .float-md-left {
  4543. float: left !important; }
  4544. .pxer-app .float-md-right {
  4545. float: right !important; }
  4546. .pxer-app .float-md-none {
  4547. float: none !important; } }
  4548. @media (min-width: 992px) {
  4549. .pxer-app .float-lg-left {
  4550. float: left !important; }
  4551. .pxer-app .float-lg-right {
  4552. float: right !important; }
  4553. .pxer-app .float-lg-none {
  4554. float: none !important; } }
  4555. @media (min-width: 1200px) {
  4556. .pxer-app .float-xl-left {
  4557. float: left !important; }
  4558. .pxer-app .float-xl-right {
  4559. float: right !important; }
  4560. .pxer-app .float-xl-none {
  4561. float: none !important; } }
  4562. .pxer-app .overflow-auto {
  4563. overflow: auto !important; }
  4564. .pxer-app .overflow-hidden {
  4565. overflow: hidden !important; }
  4566. .pxer-app .position-static {
  4567. position: static !important; }
  4568. .pxer-app .position-relative {
  4569. position: relative !important; }
  4570. .pxer-app .position-absolute {
  4571. position: absolute !important; }
  4572. .pxer-app .position-fixed {
  4573. position: fixed !important; }
  4574. .pxer-app .position-sticky {
  4575. position: sticky !important; }
  4576. .pxer-app .fixed-top {
  4577. position: fixed;
  4578. top: 0;
  4579. right: 0;
  4580. left: 0;
  4581. z-index: 1030; }
  4582. .pxer-app .fixed-bottom {
  4583. position: fixed;
  4584. right: 0;
  4585. bottom: 0;
  4586. left: 0;
  4587. z-index: 1030; }
  4588. @supports (position: sticky) {
  4589. .pxer-app .sticky-top {
  4590. position: sticky;
  4591. top: 0;
  4592. z-index: 1020; } }
  4593. .pxer-app .sr-only {
  4594. position: absolute;
  4595. width: 1px;
  4596. height: 1px;
  4597. padding: 0;
  4598. overflow: hidden;
  4599. clip: rect(0, 0, 0, 0);
  4600. white-space: nowrap;
  4601. border: 0; }
  4602. .pxer-app .sr-only-focusable:active, .pxer-app .sr-only-focusable:focus {
  4603. position: static;
  4604. width: auto;
  4605. height: auto;
  4606. overflow: visible;
  4607. clip: auto;
  4608. white-space: normal; }
  4609. .pxer-app .shadow-sm {
  4610. box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; }
  4611. .pxer-app .shadow {
  4612. box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; }
  4613. .pxer-app .shadow-lg {
  4614. box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; }
  4615. .pxer-app .shadow-none {
  4616. box-shadow: none !important; }
  4617. .pxer-app .w-25 {
  4618. width: 25% !important; }
  4619. .pxer-app .w-50 {
  4620. width: 50% !important; }
  4621. .pxer-app .w-75 {
  4622. width: 75% !important; }
  4623. .pxer-app .w-100 {
  4624. width: 100% !important; }
  4625. .pxer-app .w-auto {
  4626. width: auto !important; }
  4627. .pxer-app .h-25 {
  4628. height: 25% !important; }
  4629. .pxer-app .h-50 {
  4630. height: 50% !important; }
  4631. .pxer-app .h-75 {
  4632. height: 75% !important; }
  4633. .pxer-app .h-100 {
  4634. height: 100% !important; }
  4635. .pxer-app .h-auto {
  4636. height: auto !important; }
  4637. .pxer-app .mw-100 {
  4638. max-width: 100% !important; }
  4639. .pxer-app .mh-100 {
  4640. max-height: 100% !important; }
  4641. .pxer-app .min-vw-100 {
  4642. min-width: 100vw !important; }
  4643. .pxer-app .min-vh-100 {
  4644. min-height: 100vh !important; }
  4645. .pxer-app .vw-100 {
  4646. width: 100vw !important; }
  4647. .pxer-app .vh-100 {
  4648. height: 100vh !important; }
  4649. .pxer-app .stretched-link::after {
  4650. position: absolute;
  4651. top: 0;
  4652. right: 0;
  4653. bottom: 0;
  4654. left: 0;
  4655. z-index: 1;
  4656. pointer-events: auto;
  4657. content: "";
  4658. background-color: rgba(0, 0, 0, 0); }
  4659. .pxer-app .m-0 {
  4660. margin: 0 !important; }
  4661. .pxer-app .mt-0,
  4662. .pxer-app .my-0 {
  4663. margin-top: 0 !important; }
  4664. .pxer-app .mr-0,
  4665. .pxer-app .mx-0 {
  4666. margin-right: 0 !important; }
  4667. .pxer-app .mb-0,
  4668. .pxer-app .my-0 {
  4669. margin-bottom: 0 !important; }
  4670. .pxer-app .ml-0,
  4671. .pxer-app .mx-0 {
  4672. margin-left: 0 !important; }
  4673. .pxer-app .m-1 {
  4674. margin: 0.25rem !important; }
  4675. .pxer-app .mt-1,
  4676. .pxer-app .my-1 {
  4677. margin-top: 0.25rem !important; }
  4678. .pxer-app .mr-1,
  4679. .pxer-app .mx-1 {
  4680. margin-right: 0.25rem !important; }
  4681. .pxer-app .mb-1,
  4682. .pxer-app .my-1 {
  4683. margin-bottom: 0.25rem !important; }
  4684. .pxer-app .ml-1,
  4685. .pxer-app .mx-1 {
  4686. margin-left: 0.25rem !important; }
  4687. .pxer-app .m-2 {
  4688. margin: 0.5rem !important; }
  4689. .pxer-app .mt-2,
  4690. .pxer-app .my-2 {
  4691. margin-top: 0.5rem !important; }
  4692. .pxer-app .mr-2,
  4693. .pxer-app .mx-2 {
  4694. margin-right: 0.5rem !important; }
  4695. .pxer-app .mb-2,
  4696. .pxer-app .my-2 {
  4697. margin-bottom: 0.5rem !important; }
  4698. .pxer-app .ml-2,
  4699. .pxer-app .mx-2 {
  4700. margin-left: 0.5rem !important; }
  4701. .pxer-app .m-3 {
  4702. margin: 1rem !important; }
  4703. .pxer-app .mt-3,
  4704. .pxer-app .my-3 {
  4705. margin-top: 1rem !important; }
  4706. .pxer-app .mr-3,
  4707. .pxer-app .mx-3 {
  4708. margin-right: 1rem !important; }
  4709. .pxer-app .mb-3,
  4710. .pxer-app .my-3 {
  4711. margin-bottom: 1rem !important; }
  4712. .pxer-app .ml-3,
  4713. .pxer-app .mx-3 {
  4714. margin-left: 1rem !important; }
  4715. .pxer-app .m-4 {
  4716. margin: 1.5rem !important; }
  4717. .pxer-app .mt-4,
  4718. .pxer-app .my-4 {
  4719. margin-top: 1.5rem !important; }
  4720. .pxer-app .mr-4,
  4721. .pxer-app .mx-4 {
  4722. margin-right: 1.5rem !important; }
  4723. .pxer-app .mb-4,
  4724. .pxer-app .my-4 {
  4725. margin-bottom: 1.5rem !important; }
  4726. .pxer-app .ml-4,
  4727. .pxer-app .mx-4 {
  4728. margin-left: 1.5rem !important; }
  4729. .pxer-app .m-5 {
  4730. margin: 3rem !important; }
  4731. .pxer-app .mt-5,
  4732. .pxer-app .my-5 {
  4733. margin-top: 3rem !important; }
  4734. .pxer-app .mr-5,
  4735. .pxer-app .mx-5 {
  4736. margin-right: 3rem !important; }
  4737. .pxer-app .mb-5,
  4738. .pxer-app .my-5 {
  4739. margin-bottom: 3rem !important; }
  4740. .pxer-app .ml-5,
  4741. .pxer-app .mx-5 {
  4742. margin-left: 3rem !important; }
  4743. .pxer-app .p-0 {
  4744. padding: 0 !important; }
  4745. .pxer-app .pt-0,
  4746. .pxer-app .py-0 {
  4747. padding-top: 0 !important; }
  4748. .pxer-app .pr-0,
  4749. .pxer-app .px-0 {
  4750. padding-right: 0 !important; }
  4751. .pxer-app .pb-0,
  4752. .pxer-app .py-0 {
  4753. padding-bottom: 0 !important; }
  4754. .pxer-app .pl-0,
  4755. .pxer-app .px-0 {
  4756. padding-left: 0 !important; }
  4757. .pxer-app .p-1 {
  4758. padding: 0.25rem !important; }
  4759. .pxer-app .pt-1,
  4760. .pxer-app .py-1 {
  4761. padding-top: 0.25rem !important; }
  4762. .pxer-app .pr-1,
  4763. .pxer-app .px-1 {
  4764. padding-right: 0.25rem !important; }
  4765. .pxer-app .pb-1,
  4766. .pxer-app .py-1 {
  4767. padding-bottom: 0.25rem !important; }
  4768. .pxer-app .pl-1,
  4769. .pxer-app .px-1 {
  4770. padding-left: 0.25rem !important; }
  4771. .pxer-app .p-2 {
  4772. padding: 0.5rem !important; }
  4773. .pxer-app .pt-2,
  4774. .pxer-app .py-2 {
  4775. padding-top: 0.5rem !important; }
  4776. .pxer-app .pr-2,
  4777. .pxer-app .px-2 {
  4778. padding-right: 0.5rem !important; }
  4779. .pxer-app .pb-2,
  4780. .pxer-app .py-2 {
  4781. padding-bottom: 0.5rem !important; }
  4782. .pxer-app .pl-2,
  4783. .pxer-app .px-2 {
  4784. padding-left: 0.5rem !important; }
  4785. .pxer-app .p-3 {
  4786. padding: 1rem !important; }
  4787. .pxer-app .pt-3,
  4788. .pxer-app .py-3 {
  4789. padding-top: 1rem !important; }
  4790. .pxer-app .pr-3,
  4791. .pxer-app .px-3 {
  4792. padding-right: 1rem !important; }
  4793. .pxer-app .pb-3,
  4794. .pxer-app .py-3 {
  4795. padding-bottom: 1rem !important; }
  4796. .pxer-app .pl-3,
  4797. .pxer-app .px-3 {
  4798. padding-left: 1rem !important; }
  4799. .pxer-app .p-4 {
  4800. padding: 1.5rem !important; }
  4801. .pxer-app .pt-4,
  4802. .pxer-app .py-4 {
  4803. padding-top: 1.5rem !important; }
  4804. .pxer-app .pr-4,
  4805. .pxer-app .px-4 {
  4806. padding-right: 1.5rem !important; }
  4807. .pxer-app .pb-4,
  4808. .pxer-app .py-4 {
  4809. padding-bottom: 1.5rem !important; }
  4810. .pxer-app .pl-4,
  4811. .pxer-app .px-4 {
  4812. padding-left: 1.5rem !important; }
  4813. .pxer-app .p-5 {
  4814. padding: 3rem !important; }
  4815. .pxer-app .pt-5,
  4816. .pxer-app .py-5 {
  4817. padding-top: 3rem !important; }
  4818. .pxer-app .pr-5,
  4819. .pxer-app .px-5 {
  4820. padding-right: 3rem !important; }
  4821. .pxer-app .pb-5,
  4822. .pxer-app .py-5 {
  4823. padding-bottom: 3rem !important; }
  4824. .pxer-app .pl-5,
  4825. .pxer-app .px-5 {
  4826. padding-left: 3rem !important; }
  4827. .pxer-app .m-n1 {
  4828. margin: -0.25rem !important; }
  4829. .pxer-app .mt-n1,
  4830. .pxer-app .my-n1 {
  4831. margin-top: -0.25rem !important; }
  4832. .pxer-app .mr-n1,
  4833. .pxer-app .mx-n1 {
  4834. margin-right: -0.25rem !important; }
  4835. .pxer-app .mb-n1,
  4836. .pxer-app .my-n1 {
  4837. margin-bottom: -0.25rem !important; }
  4838. .pxer-app .ml-n1,
  4839. .pxer-app .mx-n1 {
  4840. margin-left: -0.25rem !important; }
  4841. .pxer-app .m-n2 {
  4842. margin: -0.5rem !important; }
  4843. .pxer-app .mt-n2,
  4844. .pxer-app .my-n2 {
  4845. margin-top: -0.5rem !important; }
  4846. .pxer-app .mr-n2,
  4847. .pxer-app .mx-n2 {
  4848. margin-right: -0.5rem !important; }
  4849. .pxer-app .mb-n2,
  4850. .pxer-app .my-n2 {
  4851. margin-bottom: -0.5rem !important; }
  4852. .pxer-app .ml-n2,
  4853. .pxer-app .mx-n2 {
  4854. margin-left: -0.5rem !important; }
  4855. .pxer-app .m-n3 {
  4856. margin: -1rem !important; }
  4857. .pxer-app .mt-n3,
  4858. .pxer-app .my-n3 {
  4859. margin-top: -1rem !important; }
  4860. .pxer-app .mr-n3,
  4861. .pxer-app .mx-n3 {
  4862. margin-right: -1rem !important; }
  4863. .pxer-app .mb-n3,
  4864. .pxer-app .my-n3 {
  4865. margin-bottom: -1rem !important; }
  4866. .pxer-app .ml-n3,
  4867. .pxer-app .mx-n3 {
  4868. margin-left: -1rem !important; }
  4869. .pxer-app .m-n4 {
  4870. margin: -1.5rem !important; }
  4871. .pxer-app .mt-n4,
  4872. .pxer-app .my-n4 {
  4873. margin-top: -1.5rem !important; }
  4874. .pxer-app .mr-n4,
  4875. .pxer-app .mx-n4 {
  4876. margin-right: -1.5rem !important; }
  4877. .pxer-app .mb-n4,
  4878. .pxer-app .my-n4 {
  4879. margin-bottom: -1.5rem !important; }
  4880. .pxer-app .ml-n4,
  4881. .pxer-app .mx-n4 {
  4882. margin-left: -1.5rem !important; }
  4883. .pxer-app .m-n5 {
  4884. margin: -3rem !important; }
  4885. .pxer-app .mt-n5,
  4886. .pxer-app .my-n5 {
  4887. margin-top: -3rem !important; }
  4888. .pxer-app .mr-n5,
  4889. .pxer-app .mx-n5 {
  4890. margin-right: -3rem !important; }
  4891. .pxer-app .mb-n5,
  4892. .pxer-app .my-n5 {
  4893. margin-bottom: -3rem !important; }
  4894. .pxer-app .ml-n5,
  4895. .pxer-app .mx-n5 {
  4896. margin-left: -3rem !important; }
  4897. .pxer-app .m-auto {
  4898. margin: auto !important; }
  4899. .pxer-app .mt-auto,
  4900. .pxer-app .my-auto {
  4901. margin-top: auto !important; }
  4902. .pxer-app .mr-auto,
  4903. .pxer-app .mx-auto {
  4904. margin-right: auto !important; }
  4905. .pxer-app .mb-auto,
  4906. .pxer-app .my-auto {
  4907. margin-bottom: auto !important; }
  4908. .pxer-app .ml-auto,
  4909. .pxer-app .mx-auto {
  4910. margin-left: auto !important; }
  4911. @media (min-width: 576px) {
  4912. .pxer-app .m-sm-0 {
  4913. margin: 0 !important; }
  4914. .pxer-app .mt-sm-0,
  4915. .pxer-app .my-sm-0 {
  4916. margin-top: 0 !important; }
  4917. .pxer-app .mr-sm-0,
  4918. .pxer-app .mx-sm-0 {
  4919. margin-right: 0 !important; }
  4920. .pxer-app .mb-sm-0,
  4921. .pxer-app .my-sm-0 {
  4922. margin-bottom: 0 !important; }
  4923. .pxer-app .ml-sm-0,
  4924. .pxer-app .mx-sm-0 {
  4925. margin-left: 0 !important; }
  4926. .pxer-app .m-sm-1 {
  4927. margin: 0.25rem !important; }
  4928. .pxer-app .mt-sm-1,
  4929. .pxer-app .my-sm-1 {
  4930. margin-top: 0.25rem !important; }
  4931. .pxer-app .mr-sm-1,
  4932. .pxer-app .mx-sm-1 {
  4933. margin-right: 0.25rem !important; }
  4934. .pxer-app .mb-sm-1,
  4935. .pxer-app .my-sm-1 {
  4936. margin-bottom: 0.25rem !important; }
  4937. .pxer-app .ml-sm-1,
  4938. .pxer-app .mx-sm-1 {
  4939. margin-left: 0.25rem !important; }
  4940. .pxer-app .m-sm-2 {
  4941. margin: 0.5rem !important; }
  4942. .pxer-app .mt-sm-2,
  4943. .pxer-app .my-sm-2 {
  4944. margin-top: 0.5rem !important; }
  4945. .pxer-app .mr-sm-2,
  4946. .pxer-app .mx-sm-2 {
  4947. margin-right: 0.5rem !important; }
  4948. .pxer-app .mb-sm-2,
  4949. .pxer-app .my-sm-2 {
  4950. margin-bottom: 0.5rem !important; }
  4951. .pxer-app .ml-sm-2,
  4952. .pxer-app .mx-sm-2 {
  4953. margin-left: 0.5rem !important; }
  4954. .pxer-app .m-sm-3 {
  4955. margin: 1rem !important; }
  4956. .pxer-app .mt-sm-3,
  4957. .pxer-app .my-sm-3 {
  4958. margin-top: 1rem !important; }
  4959. .pxer-app .mr-sm-3,
  4960. .pxer-app .mx-sm-3 {
  4961. margin-right: 1rem !important; }
  4962. .pxer-app .mb-sm-3,
  4963. .pxer-app .my-sm-3 {
  4964. margin-bottom: 1rem !important; }
  4965. .pxer-app .ml-sm-3,
  4966. .pxer-app .mx-sm-3 {
  4967. margin-left: 1rem !important; }
  4968. .pxer-app .m-sm-4 {
  4969. margin: 1.5rem !important; }
  4970. .pxer-app .mt-sm-4,
  4971. .pxer-app .my-sm-4 {
  4972. margin-top: 1.5rem !important; }
  4973. .pxer-app .mr-sm-4,
  4974. .pxer-app .mx-sm-4 {
  4975. margin-right: 1.5rem !important; }
  4976. .pxer-app .mb-sm-4,
  4977. .pxer-app .my-sm-4 {
  4978. margin-bottom: 1.5rem !important; }
  4979. .pxer-app .ml-sm-4,
  4980. .pxer-app .mx-sm-4 {
  4981. margin-left: 1.5rem !important; }
  4982. .pxer-app .m-sm-5 {
  4983. margin: 3rem !important; }
  4984. .pxer-app .mt-sm-5,
  4985. .pxer-app .my-sm-5 {
  4986. margin-top: 3rem !important; }
  4987. .pxer-app .mr-sm-5,
  4988. .pxer-app .mx-sm-5 {
  4989. margin-right: 3rem !important; }
  4990. .pxer-app .mb-sm-5,
  4991. .pxer-app .my-sm-5 {
  4992. margin-bottom: 3rem !important; }
  4993. .pxer-app .ml-sm-5,
  4994. .pxer-app .mx-sm-5 {
  4995. margin-left: 3rem !important; }
  4996. .pxer-app .p-sm-0 {
  4997. padding: 0 !important; }
  4998. .pxer-app .pt-sm-0,
  4999. .pxer-app .py-sm-0 {
  5000. padding-top: 0 !important; }
  5001. .pxer-app .pr-sm-0,
  5002. .pxer-app .px-sm-0 {
  5003. padding-right: 0 !important; }
  5004. .pxer-app .pb-sm-0,
  5005. .pxer-app .py-sm-0 {
  5006. padding-bottom: 0 !important; }
  5007. .pxer-app .pl-sm-0,
  5008. .pxer-app .px-sm-0 {
  5009. padding-left: 0 !important; }
  5010. .pxer-app .p-sm-1 {
  5011. padding: 0.25rem !important; }
  5012. .pxer-app .pt-sm-1,
  5013. .pxer-app .py-sm-1 {
  5014. padding-top: 0.25rem !important; }
  5015. .pxer-app .pr-sm-1,
  5016. .pxer-app .px-sm-1 {
  5017. padding-right: 0.25rem !important; }
  5018. .pxer-app .pb-sm-1,
  5019. .pxer-app .py-sm-1 {
  5020. padding-bottom: 0.25rem !important; }
  5021. .pxer-app .pl-sm-1,
  5022. .pxer-app .px-sm-1 {
  5023. padding-left: 0.25rem !important; }
  5024. .pxer-app .p-sm-2 {
  5025. padding: 0.5rem !important; }
  5026. .pxer-app .pt-sm-2,
  5027. .pxer-app .py-sm-2 {
  5028. padding-top: 0.5rem !important; }
  5029. .pxer-app .pr-sm-2,
  5030. .pxer-app .px-sm-2 {
  5031. padding-right: 0.5rem !important; }
  5032. .pxer-app .pb-sm-2,
  5033. .pxer-app .py-sm-2 {
  5034. padding-bottom: 0.5rem !important; }
  5035. .pxer-app .pl-sm-2,
  5036. .pxer-app .px-sm-2 {
  5037. padding-left: 0.5rem !important; }
  5038. .pxer-app .p-sm-3 {
  5039. padding: 1rem !important; }
  5040. .pxer-app .pt-sm-3,
  5041. .pxer-app .py-sm-3 {
  5042. padding-top: 1rem !important; }
  5043. .pxer-app .pr-sm-3,
  5044. .pxer-app .px-sm-3 {
  5045. padding-right: 1rem !important; }
  5046. .pxer-app .pb-sm-3,
  5047. .pxer-app .py-sm-3 {
  5048. padding-bottom: 1rem !important; }
  5049. .pxer-app .pl-sm-3,
  5050. .pxer-app .px-sm-3 {
  5051. padding-left: 1rem !important; }
  5052. .pxer-app .p-sm-4 {
  5053. padding: 1.5rem !important; }
  5054. .pxer-app .pt-sm-4,
  5055. .pxer-app .py-sm-4 {
  5056. padding-top: 1.5rem !important; }
  5057. .pxer-app .pr-sm-4,
  5058. .pxer-app .px-sm-4 {
  5059. padding-right: 1.5rem !important; }
  5060. .pxer-app .pb-sm-4,
  5061. .pxer-app .py-sm-4 {
  5062. padding-bottom: 1.5rem !important; }
  5063. .pxer-app .pl-sm-4,
  5064. .pxer-app .px-sm-4 {
  5065. padding-left: 1.5rem !important; }
  5066. .pxer-app .p-sm-5 {
  5067. padding: 3rem !important; }
  5068. .pxer-app .pt-sm-5,
  5069. .pxer-app .py-sm-5 {
  5070. padding-top: 3rem !important; }
  5071. .pxer-app .pr-sm-5,
  5072. .pxer-app .px-sm-5 {
  5073. padding-right: 3rem !important; }
  5074. .pxer-app .pb-sm-5,
  5075. .pxer-app .py-sm-5 {
  5076. padding-bottom: 3rem !important; }
  5077. .pxer-app .pl-sm-5,
  5078. .pxer-app .px-sm-5 {
  5079. padding-left: 3rem !important; }
  5080. .pxer-app .m-sm-n1 {
  5081. margin: -0.25rem !important; }
  5082. .pxer-app .mt-sm-n1,
  5083. .pxer-app .my-sm-n1 {
  5084. margin-top: -0.25rem !important; }
  5085. .pxer-app .mr-sm-n1,
  5086. .pxer-app .mx-sm-n1 {
  5087. margin-right: -0.25rem !important; }
  5088. .pxer-app .mb-sm-n1,
  5089. .pxer-app .my-sm-n1 {
  5090. margin-bottom: -0.25rem !important; }
  5091. .pxer-app .ml-sm-n1,
  5092. .pxer-app .mx-sm-n1 {
  5093. margin-left: -0.25rem !important; }
  5094. .pxer-app .m-sm-n2 {
  5095. margin: -0.5rem !important; }
  5096. .pxer-app .mt-sm-n2,
  5097. .pxer-app .my-sm-n2 {
  5098. margin-top: -0.5rem !important; }
  5099. .pxer-app .mr-sm-n2,
  5100. .pxer-app .mx-sm-n2 {
  5101. margin-right: -0.5rem !important; }
  5102. .pxer-app .mb-sm-n2,
  5103. .pxer-app .my-sm-n2 {
  5104. margin-bottom: -0.5rem !important; }
  5105. .pxer-app .ml-sm-n2,
  5106. .pxer-app .mx-sm-n2 {
  5107. margin-left: -0.5rem !important; }
  5108. .pxer-app .m-sm-n3 {
  5109. margin: -1rem !important; }
  5110. .pxer-app .mt-sm-n3,
  5111. .pxer-app .my-sm-n3 {
  5112. margin-top: -1rem !important; }
  5113. .pxer-app .mr-sm-n3,
  5114. .pxer-app .mx-sm-n3 {
  5115. margin-right: -1rem !important; }
  5116. .pxer-app .mb-sm-n3,
  5117. .pxer-app .my-sm-n3 {
  5118. margin-bottom: -1rem !important; }
  5119. .pxer-app .ml-sm-n3,
  5120. .pxer-app .mx-sm-n3 {
  5121. margin-left: -1rem !important; }
  5122. .pxer-app .m-sm-n4 {
  5123. margin: -1.5rem !important; }
  5124. .pxer-app .mt-sm-n4,
  5125. .pxer-app .my-sm-n4 {
  5126. margin-top: -1.5rem !important; }
  5127. .pxer-app .mr-sm-n4,
  5128. .pxer-app .mx-sm-n4 {
  5129. margin-right: -1.5rem !important; }
  5130. .pxer-app .mb-sm-n4,
  5131. .pxer-app .my-sm-n4 {
  5132. margin-bottom: -1.5rem !important; }
  5133. .pxer-app .ml-sm-n4,
  5134. .pxer-app .mx-sm-n4 {
  5135. margin-left: -1.5rem !important; }
  5136. .pxer-app .m-sm-n5 {
  5137. margin: -3rem !important; }
  5138. .pxer-app .mt-sm-n5,
  5139. .pxer-app .my-sm-n5 {
  5140. margin-top: -3rem !important; }
  5141. .pxer-app .mr-sm-n5,
  5142. .pxer-app .mx-sm-n5 {
  5143. margin-right: -3rem !important; }
  5144. .pxer-app .mb-sm-n5,
  5145. .pxer-app .my-sm-n5 {
  5146. margin-bottom: -3rem !important; }
  5147. .pxer-app .ml-sm-n5,
  5148. .pxer-app .mx-sm-n5 {
  5149. margin-left: -3rem !important; }
  5150. .pxer-app .m-sm-auto {
  5151. margin: auto !important; }
  5152. .pxer-app .mt-sm-auto,
  5153. .pxer-app .my-sm-auto {
  5154. margin-top: auto !important; }
  5155. .pxer-app .mr-sm-auto,
  5156. .pxer-app .mx-sm-auto {
  5157. margin-right: auto !important; }
  5158. .pxer-app .mb-sm-auto,
  5159. .pxer-app .my-sm-auto {
  5160. margin-bottom: auto !important; }
  5161. .pxer-app .ml-sm-auto,
  5162. .pxer-app .mx-sm-auto {
  5163. margin-left: auto !important; } }
  5164. @media (min-width: 768px) {
  5165. .pxer-app .m-md-0 {
  5166. margin: 0 !important; }
  5167. .pxer-app .mt-md-0,
  5168. .pxer-app .my-md-0 {
  5169. margin-top: 0 !important; }
  5170. .pxer-app .mr-md-0,
  5171. .pxer-app .mx-md-0 {
  5172. margin-right: 0 !important; }
  5173. .pxer-app .mb-md-0,
  5174. .pxer-app .my-md-0 {
  5175. margin-bottom: 0 !important; }
  5176. .pxer-app .ml-md-0,
  5177. .pxer-app .mx-md-0 {
  5178. margin-left: 0 !important; }
  5179. .pxer-app .m-md-1 {
  5180. margin: 0.25rem !important; }
  5181. .pxer-app .mt-md-1,
  5182. .pxer-app .my-md-1 {
  5183. margin-top: 0.25rem !important; }
  5184. .pxer-app .mr-md-1,
  5185. .pxer-app .mx-md-1 {
  5186. margin-right: 0.25rem !important; }
  5187. .pxer-app .mb-md-1,
  5188. .pxer-app .my-md-1 {
  5189. margin-bottom: 0.25rem !important; }
  5190. .pxer-app .ml-md-1,
  5191. .pxer-app .mx-md-1 {
  5192. margin-left: 0.25rem !important; }
  5193. .pxer-app .m-md-2 {
  5194. margin: 0.5rem !important; }
  5195. .pxer-app .mt-md-2,
  5196. .pxer-app .my-md-2 {
  5197. margin-top: 0.5rem !important; }
  5198. .pxer-app .mr-md-2,
  5199. .pxer-app .mx-md-2 {
  5200. margin-right: 0.5rem !important; }
  5201. .pxer-app .mb-md-2,
  5202. .pxer-app .my-md-2 {
  5203. margin-bottom: 0.5rem !important; }
  5204. .pxer-app .ml-md-2,
  5205. .pxer-app .mx-md-2 {
  5206. margin-left: 0.5rem !important; }
  5207. .pxer-app .m-md-3 {
  5208. margin: 1rem !important; }
  5209. .pxer-app .mt-md-3,
  5210. .pxer-app .my-md-3 {
  5211. margin-top: 1rem !important; }
  5212. .pxer-app .mr-md-3,
  5213. .pxer-app .mx-md-3 {
  5214. margin-right: 1rem !important; }
  5215. .pxer-app .mb-md-3,
  5216. .pxer-app .my-md-3 {
  5217. margin-bottom: 1rem !important; }
  5218. .pxer-app .ml-md-3,
  5219. .pxer-app .mx-md-3 {
  5220. margin-left: 1rem !important; }
  5221. .pxer-app .m-md-4 {
  5222. margin: 1.5rem !important; }
  5223. .pxer-app .mt-md-4,
  5224. .pxer-app .my-md-4 {
  5225. margin-top: 1.5rem !important; }
  5226. .pxer-app .mr-md-4,
  5227. .pxer-app .mx-md-4 {
  5228. margin-right: 1.5rem !important; }
  5229. .pxer-app .mb-md-4,
  5230. .pxer-app .my-md-4 {
  5231. margin-bottom: 1.5rem !important; }
  5232. .pxer-app .ml-md-4,
  5233. .pxer-app .mx-md-4 {
  5234. margin-left: 1.5rem !important; }
  5235. .pxer-app .m-md-5 {
  5236. margin: 3rem !important; }
  5237. .pxer-app .mt-md-5,
  5238. .pxer-app .my-md-5 {
  5239. margin-top: 3rem !important; }
  5240. .pxer-app .mr-md-5,
  5241. .pxer-app .mx-md-5 {
  5242. margin-right: 3rem !important; }
  5243. .pxer-app .mb-md-5,
  5244. .pxer-app .my-md-5 {
  5245. margin-bottom: 3rem !important; }
  5246. .pxer-app .ml-md-5,
  5247. .pxer-app .mx-md-5 {
  5248. margin-left: 3rem !important; }
  5249. .pxer-app .p-md-0 {
  5250. padding: 0 !important; }
  5251. .pxer-app .pt-md-0,
  5252. .pxer-app .py-md-0 {
  5253. padding-top: 0 !important; }
  5254. .pxer-app .pr-md-0,
  5255. .pxer-app .px-md-0 {
  5256. padding-right: 0 !important; }
  5257. .pxer-app .pb-md-0,
  5258. .pxer-app .py-md-0 {
  5259. padding-bottom: 0 !important; }
  5260. .pxer-app .pl-md-0,
  5261. .pxer-app .px-md-0 {
  5262. padding-left: 0 !important; }
  5263. .pxer-app .p-md-1 {
  5264. padding: 0.25rem !important; }
  5265. .pxer-app .pt-md-1,
  5266. .pxer-app .py-md-1 {
  5267. padding-top: 0.25rem !important; }
  5268. .pxer-app .pr-md-1,
  5269. .pxer-app .px-md-1 {
  5270. padding-right: 0.25rem !important; }
  5271. .pxer-app .pb-md-1,
  5272. .pxer-app .py-md-1 {
  5273. padding-bottom: 0.25rem !important; }
  5274. .pxer-app .pl-md-1,
  5275. .pxer-app .px-md-1 {
  5276. padding-left: 0.25rem !important; }
  5277. .pxer-app .p-md-2 {
  5278. padding: 0.5rem !important; }
  5279. .pxer-app .pt-md-2,
  5280. .pxer-app .py-md-2 {
  5281. padding-top: 0.5rem !important; }
  5282. .pxer-app .pr-md-2,
  5283. .pxer-app .px-md-2 {
  5284. padding-right: 0.5rem !important; }
  5285. .pxer-app .pb-md-2,
  5286. .pxer-app .py-md-2 {
  5287. padding-bottom: 0.5rem !important; }
  5288. .pxer-app .pl-md-2,
  5289. .pxer-app .px-md-2 {
  5290. padding-left: 0.5rem !important; }
  5291. .pxer-app .p-md-3 {
  5292. padding: 1rem !important; }
  5293. .pxer-app .pt-md-3,
  5294. .pxer-app .py-md-3 {
  5295. padding-top: 1rem !important; }
  5296. .pxer-app .pr-md-3,
  5297. .pxer-app .px-md-3 {
  5298. padding-right: 1rem !important; }
  5299. .pxer-app .pb-md-3,
  5300. .pxer-app .py-md-3 {
  5301. padding-bottom: 1rem !important; }
  5302. .pxer-app .pl-md-3,
  5303. .pxer-app .px-md-3 {
  5304. padding-left: 1rem !important; }
  5305. .pxer-app .p-md-4 {
  5306. padding: 1.5rem !important; }
  5307. .pxer-app .pt-md-4,
  5308. .pxer-app .py-md-4 {
  5309. padding-top: 1.5rem !important; }
  5310. .pxer-app .pr-md-4,
  5311. .pxer-app .px-md-4 {
  5312. padding-right: 1.5rem !important; }
  5313. .pxer-app .pb-md-4,
  5314. .pxer-app .py-md-4 {
  5315. padding-bottom: 1.5rem !important; }
  5316. .pxer-app .pl-md-4,
  5317. .pxer-app .px-md-4 {
  5318. padding-left: 1.5rem !important; }
  5319. .pxer-app .p-md-5 {
  5320. padding: 3rem !important; }
  5321. .pxer-app .pt-md-5,
  5322. .pxer-app .py-md-5 {
  5323. padding-top: 3rem !important; }
  5324. .pxer-app .pr-md-5,
  5325. .pxer-app .px-md-5 {
  5326. padding-right: 3rem !important; }
  5327. .pxer-app .pb-md-5,
  5328. .pxer-app .py-md-5 {
  5329. padding-bottom: 3rem !important; }
  5330. .pxer-app .pl-md-5,
  5331. .pxer-app .px-md-5 {
  5332. padding-left: 3rem !important; }
  5333. .pxer-app .m-md-n1 {
  5334. margin: -0.25rem !important; }
  5335. .pxer-app .mt-md-n1,
  5336. .pxer-app .my-md-n1 {
  5337. margin-top: -0.25rem !important; }
  5338. .pxer-app .mr-md-n1,
  5339. .pxer-app .mx-md-n1 {
  5340. margin-right: -0.25rem !important; }
  5341. .pxer-app .mb-md-n1,
  5342. .pxer-app .my-md-n1 {
  5343. margin-bottom: -0.25rem !important; }
  5344. .pxer-app .ml-md-n1,
  5345. .pxer-app .mx-md-n1 {
  5346. margin-left: -0.25rem !important; }
  5347. .pxer-app .m-md-n2 {
  5348. margin: -0.5rem !important; }
  5349. .pxer-app .mt-md-n2,
  5350. .pxer-app .my-md-n2 {
  5351. margin-top: -0.5rem !important; }
  5352. .pxer-app .mr-md-n2,
  5353. .pxer-app .mx-md-n2 {
  5354. margin-right: -0.5rem !important; }
  5355. .pxer-app .mb-md-n2,
  5356. .pxer-app .my-md-n2 {
  5357. margin-bottom: -0.5rem !important; }
  5358. .pxer-app .ml-md-n2,
  5359. .pxer-app .mx-md-n2 {
  5360. margin-left: -0.5rem !important; }
  5361. .pxer-app .m-md-n3 {
  5362. margin: -1rem !important; }
  5363. .pxer-app .mt-md-n3,
  5364. .pxer-app .my-md-n3 {
  5365. margin-top: -1rem !important; }
  5366. .pxer-app .mr-md-n3,
  5367. .pxer-app .mx-md-n3 {
  5368. margin-right: -1rem !important; }
  5369. .pxer-app .mb-md-n3,
  5370. .pxer-app .my-md-n3 {
  5371. margin-bottom: -1rem !important; }
  5372. .pxer-app .ml-md-n3,
  5373. .pxer-app .mx-md-n3 {
  5374. margin-left: -1rem !important; }
  5375. .pxer-app .m-md-n4 {
  5376. margin: -1.5rem !important; }
  5377. .pxer-app .mt-md-n4,
  5378. .pxer-app .my-md-n4 {
  5379. margin-top: -1.5rem !important; }
  5380. .pxer-app .mr-md-n4,
  5381. .pxer-app .mx-md-n4 {
  5382. margin-right: -1.5rem !important; }
  5383. .pxer-app .mb-md-n4,
  5384. .pxer-app .my-md-n4 {
  5385. margin-bottom: -1.5rem !important; }
  5386. .pxer-app .ml-md-n4,
  5387. .pxer-app .mx-md-n4 {
  5388. margin-left: -1.5rem !important; }
  5389. .pxer-app .m-md-n5 {
  5390. margin: -3rem !important; }
  5391. .pxer-app .mt-md-n5,
  5392. .pxer-app .my-md-n5 {
  5393. margin-top: -3rem !important; }
  5394. .pxer-app .mr-md-n5,
  5395. .pxer-app .mx-md-n5 {
  5396. margin-right: -3rem !important; }
  5397. .pxer-app .mb-md-n5,
  5398. .pxer-app .my-md-n5 {
  5399. margin-bottom: -3rem !important; }
  5400. .pxer-app .ml-md-n5,
  5401. .pxer-app .mx-md-n5 {
  5402. margin-left: -3rem !important; }
  5403. .pxer-app .m-md-auto {
  5404. margin: auto !important; }
  5405. .pxer-app .mt-md-auto,
  5406. .pxer-app .my-md-auto {
  5407. margin-top: auto !important; }
  5408. .pxer-app .mr-md-auto,
  5409. .pxer-app .mx-md-auto {
  5410. margin-right: auto !important; }
  5411. .pxer-app .mb-md-auto,
  5412. .pxer-app .my-md-auto {
  5413. margin-bottom: auto !important; }
  5414. .pxer-app .ml-md-auto,
  5415. .pxer-app .mx-md-auto {
  5416. margin-left: auto !important; } }
  5417. @media (min-width: 992px) {
  5418. .pxer-app .m-lg-0 {
  5419. margin: 0 !important; }
  5420. .pxer-app .mt-lg-0,
  5421. .pxer-app .my-lg-0 {
  5422. margin-top: 0 !important; }
  5423. .pxer-app .mr-lg-0,
  5424. .pxer-app .mx-lg-0 {
  5425. margin-right: 0 !important; }
  5426. .pxer-app .mb-lg-0,
  5427. .pxer-app .my-lg-0 {
  5428. margin-bottom: 0 !important; }
  5429. .pxer-app .ml-lg-0,
  5430. .pxer-app .mx-lg-0 {
  5431. margin-left: 0 !important; }
  5432. .pxer-app .m-lg-1 {
  5433. margin: 0.25rem !important; }
  5434. .pxer-app .mt-lg-1,
  5435. .pxer-app .my-lg-1 {
  5436. margin-top: 0.25rem !important; }
  5437. .pxer-app .mr-lg-1,
  5438. .pxer-app .mx-lg-1 {
  5439. margin-right: 0.25rem !important; }
  5440. .pxer-app .mb-lg-1,
  5441. .pxer-app .my-lg-1 {
  5442. margin-bottom: 0.25rem !important; }
  5443. .pxer-app .ml-lg-1,
  5444. .pxer-app .mx-lg-1 {
  5445. margin-left: 0.25rem !important; }
  5446. .pxer-app .m-lg-2 {
  5447. margin: 0.5rem !important; }
  5448. .pxer-app .mt-lg-2,
  5449. .pxer-app .my-lg-2 {
  5450. margin-top: 0.5rem !important; }
  5451. .pxer-app .mr-lg-2,
  5452. .pxer-app .mx-lg-2 {
  5453. margin-right: 0.5rem !important; }
  5454. .pxer-app .mb-lg-2,
  5455. .pxer-app .my-lg-2 {
  5456. margin-bottom: 0.5rem !important; }
  5457. .pxer-app .ml-lg-2,
  5458. .pxer-app .mx-lg-2 {
  5459. margin-left: 0.5rem !important; }
  5460. .pxer-app .m-lg-3 {
  5461. margin: 1rem !important; }
  5462. .pxer-app .mt-lg-3,
  5463. .pxer-app .my-lg-3 {
  5464. margin-top: 1rem !important; }
  5465. .pxer-app .mr-lg-3,
  5466. .pxer-app .mx-lg-3 {
  5467. margin-right: 1rem !important; }
  5468. .pxer-app .mb-lg-3,
  5469. .pxer-app .my-lg-3 {
  5470. margin-bottom: 1rem !important; }
  5471. .pxer-app .ml-lg-3,
  5472. .pxer-app .mx-lg-3 {
  5473. margin-left: 1rem !important; }
  5474. .pxer-app .m-lg-4 {
  5475. margin: 1.5rem !important; }
  5476. .pxer-app .mt-lg-4,
  5477. .pxer-app .my-lg-4 {
  5478. margin-top: 1.5rem !important; }
  5479. .pxer-app .mr-lg-4,
  5480. .pxer-app .mx-lg-4 {
  5481. margin-right: 1.5rem !important; }
  5482. .pxer-app .mb-lg-4,
  5483. .pxer-app .my-lg-4 {
  5484. margin-bottom: 1.5rem !important; }
  5485. .pxer-app .ml-lg-4,
  5486. .pxer-app .mx-lg-4 {
  5487. margin-left: 1.5rem !important; }
  5488. .pxer-app .m-lg-5 {
  5489. margin: 3rem !important; }
  5490. .pxer-app .mt-lg-5,
  5491. .pxer-app .my-lg-5 {
  5492. margin-top: 3rem !important; }
  5493. .pxer-app .mr-lg-5,
  5494. .pxer-app .mx-lg-5 {
  5495. margin-right: 3rem !important; }
  5496. .pxer-app .mb-lg-5,
  5497. .pxer-app .my-lg-5 {
  5498. margin-bottom: 3rem !important; }
  5499. .pxer-app .ml-lg-5,
  5500. .pxer-app .mx-lg-5 {
  5501. margin-left: 3rem !important; }
  5502. .pxer-app .p-lg-0 {
  5503. padding: 0 !important; }
  5504. .pxer-app .pt-lg-0,
  5505. .pxer-app .py-lg-0 {
  5506. padding-top: 0 !important; }
  5507. .pxer-app .pr-lg-0,
  5508. .pxer-app .px-lg-0 {
  5509. padding-right: 0 !important; }
  5510. .pxer-app .pb-lg-0,
  5511. .pxer-app .py-lg-0 {
  5512. padding-bottom: 0 !important; }
  5513. .pxer-app .pl-lg-0,
  5514. .pxer-app .px-lg-0 {
  5515. padding-left: 0 !important; }
  5516. .pxer-app .p-lg-1 {
  5517. padding: 0.25rem !important; }
  5518. .pxer-app .pt-lg-1,
  5519. .pxer-app .py-lg-1 {
  5520. padding-top: 0.25rem !important; }
  5521. .pxer-app .pr-lg-1,
  5522. .pxer-app .px-lg-1 {
  5523. padding-right: 0.25rem !important; }
  5524. .pxer-app .pb-lg-1,
  5525. .pxer-app .py-lg-1 {
  5526. padding-bottom: 0.25rem !important; }
  5527. .pxer-app .pl-lg-1,
  5528. .pxer-app .px-lg-1 {
  5529. padding-left: 0.25rem !important; }
  5530. .pxer-app .p-lg-2 {
  5531. padding: 0.5rem !important; }
  5532. .pxer-app .pt-lg-2,
  5533. .pxer-app .py-lg-2 {
  5534. padding-top: 0.5rem !important; }
  5535. .pxer-app .pr-lg-2,
  5536. .pxer-app .px-lg-2 {
  5537. padding-right: 0.5rem !important; }
  5538. .pxer-app .pb-lg-2,
  5539. .pxer-app .py-lg-2 {
  5540. padding-bottom: 0.5rem !important; }
  5541. .pxer-app .pl-lg-2,
  5542. .pxer-app .px-lg-2 {
  5543. padding-left: 0.5rem !important; }
  5544. .pxer-app .p-lg-3 {
  5545. padding: 1rem !important; }
  5546. .pxer-app .pt-lg-3,
  5547. .pxer-app .py-lg-3 {
  5548. padding-top: 1rem !important; }
  5549. .pxer-app .pr-lg-3,
  5550. .pxer-app .px-lg-3 {
  5551. padding-right: 1rem !important; }
  5552. .pxer-app .pb-lg-3,
  5553. .pxer-app .py-lg-3 {
  5554. padding-bottom: 1rem !important; }
  5555. .pxer-app .pl-lg-3,
  5556. .pxer-app .px-lg-3 {
  5557. padding-left: 1rem !important; }
  5558. .pxer-app .p-lg-4 {
  5559. padding: 1.5rem !important; }
  5560. .pxer-app .pt-lg-4,
  5561. .pxer-app .py-lg-4 {
  5562. padding-top: 1.5rem !important; }
  5563. .pxer-app .pr-lg-4,
  5564. .pxer-app .px-lg-4 {
  5565. padding-right: 1.5rem !important; }
  5566. .pxer-app .pb-lg-4,
  5567. .pxer-app .py-lg-4 {
  5568. padding-bottom: 1.5rem !important; }
  5569. .pxer-app .pl-lg-4,
  5570. .pxer-app .px-lg-4 {
  5571. padding-left: 1.5rem !important; }
  5572. .pxer-app .p-lg-5 {
  5573. padding: 3rem !important; }
  5574. .pxer-app .pt-lg-5,
  5575. .pxer-app .py-lg-5 {
  5576. padding-top: 3rem !important; }
  5577. .pxer-app .pr-lg-5,
  5578. .pxer-app .px-lg-5 {
  5579. padding-right: 3rem !important; }
  5580. .pxer-app .pb-lg-5,
  5581. .pxer-app .py-lg-5 {
  5582. padding-bottom: 3rem !important; }
  5583. .pxer-app .pl-lg-5,
  5584. .pxer-app .px-lg-5 {
  5585. padding-left: 3rem !important; }
  5586. .pxer-app .m-lg-n1 {
  5587. margin: -0.25rem !important; }
  5588. .pxer-app .mt-lg-n1,
  5589. .pxer-app .my-lg-n1 {
  5590. margin-top: -0.25rem !important; }
  5591. .pxer-app .mr-lg-n1,
  5592. .pxer-app .mx-lg-n1 {
  5593. margin-right: -0.25rem !important; }
  5594. .pxer-app .mb-lg-n1,
  5595. .pxer-app .my-lg-n1 {
  5596. margin-bottom: -0.25rem !important; }
  5597. .pxer-app .ml-lg-n1,
  5598. .pxer-app .mx-lg-n1 {
  5599. margin-left: -0.25rem !important; }
  5600. .pxer-app .m-lg-n2 {
  5601. margin: -0.5rem !important; }
  5602. .pxer-app .mt-lg-n2,
  5603. .pxer-app .my-lg-n2 {
  5604. margin-top: -0.5rem !important; }
  5605. .pxer-app .mr-lg-n2,
  5606. .pxer-app .mx-lg-n2 {
  5607. margin-right: -0.5rem !important; }
  5608. .pxer-app .mb-lg-n2,
  5609. .pxer-app .my-lg-n2 {
  5610. margin-bottom: -0.5rem !important; }
  5611. .pxer-app .ml-lg-n2,
  5612. .pxer-app .mx-lg-n2 {
  5613. margin-left: -0.5rem !important; }
  5614. .pxer-app .m-lg-n3 {
  5615. margin: -1rem !important; }
  5616. .pxer-app .mt-lg-n3,
  5617. .pxer-app .my-lg-n3 {
  5618. margin-top: -1rem !important; }
  5619. .pxer-app .mr-lg-n3,
  5620. .pxer-app .mx-lg-n3 {
  5621. margin-right: -1rem !important; }
  5622. .pxer-app .mb-lg-n3,
  5623. .pxer-app .my-lg-n3 {
  5624. margin-bottom: -1rem !important; }
  5625. .pxer-app .ml-lg-n3,
  5626. .pxer-app .mx-lg-n3 {
  5627. margin-left: -1rem !important; }
  5628. .pxer-app .m-lg-n4 {
  5629. margin: -1.5rem !important; }
  5630. .pxer-app .mt-lg-n4,
  5631. .pxer-app .my-lg-n4 {
  5632. margin-top: -1.5rem !important; }
  5633. .pxer-app .mr-lg-n4,
  5634. .pxer-app .mx-lg-n4 {
  5635. margin-right: -1.5rem !important; }
  5636. .pxer-app .mb-lg-n4,
  5637. .pxer-app .my-lg-n4 {
  5638. margin-bottom: -1.5rem !important; }
  5639. .pxer-app .ml-lg-n4,
  5640. .pxer-app .mx-lg-n4 {
  5641. margin-left: -1.5rem !important; }
  5642. .pxer-app .m-lg-n5 {
  5643. margin: -3rem !important; }
  5644. .pxer-app .mt-lg-n5,
  5645. .pxer-app .my-lg-n5 {
  5646. margin-top: -3rem !important; }
  5647. .pxer-app .mr-lg-n5,
  5648. .pxer-app .mx-lg-n5 {
  5649. margin-right: -3rem !important; }
  5650. .pxer-app .mb-lg-n5,
  5651. .pxer-app .my-lg-n5 {
  5652. margin-bottom: -3rem !important; }
  5653. .pxer-app .ml-lg-n5,
  5654. .pxer-app .mx-lg-n5 {
  5655. margin-left: -3rem !important; }
  5656. .pxer-app .m-lg-auto {
  5657. margin: auto !important; }
  5658. .pxer-app .mt-lg-auto,
  5659. .pxer-app .my-lg-auto {
  5660. margin-top: auto !important; }
  5661. .pxer-app .mr-lg-auto,
  5662. .pxer-app .mx-lg-auto {
  5663. margin-right: auto !important; }
  5664. .pxer-app .mb-lg-auto,
  5665. .pxer-app .my-lg-auto {
  5666. margin-bottom: auto !important; }
  5667. .pxer-app .ml-lg-auto,
  5668. .pxer-app .mx-lg-auto {
  5669. margin-left: auto !important; } }
  5670. @media (min-width: 1200px) {
  5671. .pxer-app .m-xl-0 {
  5672. margin: 0 !important; }
  5673. .pxer-app .mt-xl-0,
  5674. .pxer-app .my-xl-0 {
  5675. margin-top: 0 !important; }
  5676. .pxer-app .mr-xl-0,
  5677. .pxer-app .mx-xl-0 {
  5678. margin-right: 0 !important; }
  5679. .pxer-app .mb-xl-0,
  5680. .pxer-app .my-xl-0 {
  5681. margin-bottom: 0 !important; }
  5682. .pxer-app .ml-xl-0,
  5683. .pxer-app .mx-xl-0 {
  5684. margin-left: 0 !important; }
  5685. .pxer-app .m-xl-1 {
  5686. margin: 0.25rem !important; }
  5687. .pxer-app .mt-xl-1,
  5688. .pxer-app .my-xl-1 {
  5689. margin-top: 0.25rem !important; }
  5690. .pxer-app .mr-xl-1,
  5691. .pxer-app .mx-xl-1 {
  5692. margin-right: 0.25rem !important; }
  5693. .pxer-app .mb-xl-1,
  5694. .pxer-app .my-xl-1 {
  5695. margin-bottom: 0.25rem !important; }
  5696. .pxer-app .ml-xl-1,
  5697. .pxer-app .mx-xl-1 {
  5698. margin-left: 0.25rem !important; }
  5699. .pxer-app .m-xl-2 {
  5700. margin: 0.5rem !important; }
  5701. .pxer-app .mt-xl-2,
  5702. .pxer-app .my-xl-2 {
  5703. margin-top: 0.5rem !important; }
  5704. .pxer-app .mr-xl-2,
  5705. .pxer-app .mx-xl-2 {
  5706. margin-right: 0.5rem !important; }
  5707. .pxer-app .mb-xl-2,
  5708. .pxer-app .my-xl-2 {
  5709. margin-bottom: 0.5rem !important; }
  5710. .pxer-app .ml-xl-2,
  5711. .pxer-app .mx-xl-2 {
  5712. margin-left: 0.5rem !important; }
  5713. .pxer-app .m-xl-3 {
  5714. margin: 1rem !important; }
  5715. .pxer-app .mt-xl-3,
  5716. .pxer-app .my-xl-3 {
  5717. margin-top: 1rem !important; }
  5718. .pxer-app .mr-xl-3,
  5719. .pxer-app .mx-xl-3 {
  5720. margin-right: 1rem !important; }
  5721. .pxer-app .mb-xl-3,
  5722. .pxer-app .my-xl-3 {
  5723. margin-bottom: 1rem !important; }
  5724. .pxer-app .ml-xl-3,
  5725. .pxer-app .mx-xl-3 {
  5726. margin-left: 1rem !important; }
  5727. .pxer-app .m-xl-4 {
  5728. margin: 1.5rem !important; }
  5729. .pxer-app .mt-xl-4,
  5730. .pxer-app .my-xl-4 {
  5731. margin-top: 1.5rem !important; }
  5732. .pxer-app .mr-xl-4,
  5733. .pxer-app .mx-xl-4 {
  5734. margin-right: 1.5rem !important; }
  5735. .pxer-app .mb-xl-4,
  5736. .pxer-app .my-xl-4 {
  5737. margin-bottom: 1.5rem !important; }
  5738. .pxer-app .ml-xl-4,
  5739. .pxer-app .mx-xl-4 {
  5740. margin-left: 1.5rem !important; }
  5741. .pxer-app .m-xl-5 {
  5742. margin: 3rem !important; }
  5743. .pxer-app .mt-xl-5,
  5744. .pxer-app .my-xl-5 {
  5745. margin-top: 3rem !important; }
  5746. .pxer-app .mr-xl-5,
  5747. .pxer-app .mx-xl-5 {
  5748. margin-right: 3rem !important; }
  5749. .pxer-app .mb-xl-5,
  5750. .pxer-app .my-xl-5 {
  5751. margin-bottom: 3rem !important; }
  5752. .pxer-app .ml-xl-5,
  5753. .pxer-app .mx-xl-5 {
  5754. margin-left: 3rem !important; }
  5755. .pxer-app .p-xl-0 {
  5756. padding: 0 !important; }
  5757. .pxer-app .pt-xl-0,
  5758. .pxer-app .py-xl-0 {
  5759. padding-top: 0 !important; }
  5760. .pxer-app .pr-xl-0,
  5761. .pxer-app .px-xl-0 {
  5762. padding-right: 0 !important; }
  5763. .pxer-app .pb-xl-0,
  5764. .pxer-app .py-xl-0 {
  5765. padding-bottom: 0 !important; }
  5766. .pxer-app .pl-xl-0,
  5767. .pxer-app .px-xl-0 {
  5768. padding-left: 0 !important; }
  5769. .pxer-app .p-xl-1 {
  5770. padding: 0.25rem !important; }
  5771. .pxer-app .pt-xl-1,
  5772. .pxer-app .py-xl-1 {
  5773. padding-top: 0.25rem !important; }
  5774. .pxer-app .pr-xl-1,
  5775. .pxer-app .px-xl-1 {
  5776. padding-right: 0.25rem !important; }
  5777. .pxer-app .pb-xl-1,
  5778. .pxer-app .py-xl-1 {
  5779. padding-bottom: 0.25rem !important; }
  5780. .pxer-app .pl-xl-1,
  5781. .pxer-app .px-xl-1 {
  5782. padding-left: 0.25rem !important; }
  5783. .pxer-app .p-xl-2 {
  5784. padding: 0.5rem !important; }
  5785. .pxer-app .pt-xl-2,
  5786. .pxer-app .py-xl-2 {
  5787. padding-top: 0.5rem !important; }
  5788. .pxer-app .pr-xl-2,
  5789. .pxer-app .px-xl-2 {
  5790. padding-right: 0.5rem !important; }
  5791. .pxer-app .pb-xl-2,
  5792. .pxer-app .py-xl-2 {
  5793. padding-bottom: 0.5rem !important; }
  5794. .pxer-app .pl-xl-2,
  5795. .pxer-app .px-xl-2 {
  5796. padding-left: 0.5rem !important; }
  5797. .pxer-app .p-xl-3 {
  5798. padding: 1rem !important; }
  5799. .pxer-app .pt-xl-3,
  5800. .pxer-app .py-xl-3 {
  5801. padding-top: 1rem !important; }
  5802. .pxer-app .pr-xl-3,
  5803. .pxer-app .px-xl-3 {
  5804. padding-right: 1rem !important; }
  5805. .pxer-app .pb-xl-3,
  5806. .pxer-app .py-xl-3 {
  5807. padding-bottom: 1rem !important; }
  5808. .pxer-app .pl-xl-3,
  5809. .pxer-app .px-xl-3 {
  5810. padding-left: 1rem !important; }
  5811. .pxer-app .p-xl-4 {
  5812. padding: 1.5rem !important; }
  5813. .pxer-app .pt-xl-4,
  5814. .pxer-app .py-xl-4 {
  5815. padding-top: 1.5rem !important; }
  5816. .pxer-app .pr-xl-4,
  5817. .pxer-app .px-xl-4 {
  5818. padding-right: 1.5rem !important; }
  5819. .pxer-app .pb-xl-4,
  5820. .pxer-app .py-xl-4 {
  5821. padding-bottom: 1.5rem !important; }
  5822. .pxer-app .pl-xl-4,
  5823. .pxer-app .px-xl-4 {
  5824. padding-left: 1.5rem !important; }
  5825. .pxer-app .p-xl-5 {
  5826. padding: 3rem !important; }
  5827. .pxer-app .pt-xl-5,
  5828. .pxer-app .py-xl-5 {
  5829. padding-top: 3rem !important; }
  5830. .pxer-app .pr-xl-5,
  5831. .pxer-app .px-xl-5 {
  5832. padding-right: 3rem !important; }
  5833. .pxer-app .pb-xl-5,
  5834. .pxer-app .py-xl-5 {
  5835. padding-bottom: 3rem !important; }
  5836. .pxer-app .pl-xl-5,
  5837. .pxer-app .px-xl-5 {
  5838. padding-left: 3rem !important; }
  5839. .pxer-app .m-xl-n1 {
  5840. margin: -0.25rem !important; }
  5841. .pxer-app .mt-xl-n1,
  5842. .pxer-app .my-xl-n1 {
  5843. margin-top: -0.25rem !important; }
  5844. .pxer-app .mr-xl-n1,
  5845. .pxer-app .mx-xl-n1 {
  5846. margin-right: -0.25rem !important; }
  5847. .pxer-app .mb-xl-n1,
  5848. .pxer-app .my-xl-n1 {
  5849. margin-bottom: -0.25rem !important; }
  5850. .pxer-app .ml-xl-n1,
  5851. .pxer-app .mx-xl-n1 {
  5852. margin-left: -0.25rem !important; }
  5853. .pxer-app .m-xl-n2 {
  5854. margin: -0.5rem !important; }
  5855. .pxer-app .mt-xl-n2,
  5856. .pxer-app .my-xl-n2 {
  5857. margin-top: -0.5rem !important; }
  5858. .pxer-app .mr-xl-n2,
  5859. .pxer-app .mx-xl-n2 {
  5860. margin-right: -0.5rem !important; }
  5861. .pxer-app .mb-xl-n2,
  5862. .pxer-app .my-xl-n2 {
  5863. margin-bottom: -0.5rem !important; }
  5864. .pxer-app .ml-xl-n2,
  5865. .pxer-app .mx-xl-n2 {
  5866. margin-left: -0.5rem !important; }
  5867. .pxer-app .m-xl-n3 {
  5868. margin: -1rem !important; }
  5869. .pxer-app .mt-xl-n3,
  5870. .pxer-app .my-xl-n3 {
  5871. margin-top: -1rem !important; }
  5872. .pxer-app .mr-xl-n3,
  5873. .pxer-app .mx-xl-n3 {
  5874. margin-right: -1rem !important; }
  5875. .pxer-app .mb-xl-n3,
  5876. .pxer-app .my-xl-n3 {
  5877. margin-bottom: -1rem !important; }
  5878. .pxer-app .ml-xl-n3,
  5879. .pxer-app .mx-xl-n3 {
  5880. margin-left: -1rem !important; }
  5881. .pxer-app .m-xl-n4 {
  5882. margin: -1.5rem !important; }
  5883. .pxer-app .mt-xl-n4,
  5884. .pxer-app .my-xl-n4 {
  5885. margin-top: -1.5rem !important; }
  5886. .pxer-app .mr-xl-n4,
  5887. .pxer-app .mx-xl-n4 {
  5888. margin-right: -1.5rem !important; }
  5889. .pxer-app .mb-xl-n4,
  5890. .pxer-app .my-xl-n4 {
  5891. margin-bottom: -1.5rem !important; }
  5892. .pxer-app .ml-xl-n4,
  5893. .pxer-app .mx-xl-n4 {
  5894. margin-left: -1.5rem !important; }
  5895. .pxer-app .m-xl-n5 {
  5896. margin: -3rem !important; }
  5897. .pxer-app .mt-xl-n5,
  5898. .pxer-app .my-xl-n5 {
  5899. margin-top: -3rem !important; }
  5900. .pxer-app .mr-xl-n5,
  5901. .pxer-app .mx-xl-n5 {
  5902. margin-right: -3rem !important; }
  5903. .pxer-app .mb-xl-n5,
  5904. .pxer-app .my-xl-n5 {
  5905. margin-bottom: -3rem !important; }
  5906. .pxer-app .ml-xl-n5,
  5907. .pxer-app .mx-xl-n5 {
  5908. margin-left: -3rem !important; }
  5909. .pxer-app .m-xl-auto {
  5910. margin: auto !important; }
  5911. .pxer-app .mt-xl-auto,
  5912. .pxer-app .my-xl-auto {
  5913. margin-top: auto !important; }
  5914. .pxer-app .mr-xl-auto,
  5915. .pxer-app .mx-xl-auto {
  5916. margin-right: auto !important; }
  5917. .pxer-app .mb-xl-auto,
  5918. .pxer-app .my-xl-auto {
  5919. margin-bottom: auto !important; }
  5920. .pxer-app .ml-xl-auto,
  5921. .pxer-app .mx-xl-auto {
  5922. margin-left: auto !important; } }
  5923. .pxer-app .text-monospace {
  5924. font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; }
  5925. .pxer-app .text-justify {
  5926. text-align: justify !important; }
  5927. .pxer-app .text-wrap {
  5928. white-space: normal !important; }
  5929. .pxer-app .text-nowrap {
  5930. white-space: nowrap !important; }
  5931. .pxer-app .text-truncate {
  5932. overflow: hidden;
  5933. text-overflow: ellipsis;
  5934. white-space: nowrap; }
  5935. .pxer-app .text-left {
  5936. text-align: left !important; }
  5937. .pxer-app .text-right {
  5938. text-align: right !important; }
  5939. .pxer-app .text-center {
  5940. text-align: center !important; }
  5941. @media (min-width: 576px) {
  5942. .pxer-app .text-sm-left {
  5943. text-align: left !important; }
  5944. .pxer-app .text-sm-right {
  5945. text-align: right !important; }
  5946. .pxer-app .text-sm-center {
  5947. text-align: center !important; } }
  5948. @media (min-width: 768px) {
  5949. .pxer-app .text-md-left {
  5950. text-align: left !important; }
  5951. .pxer-app .text-md-right {
  5952. text-align: right !important; }
  5953. .pxer-app .text-md-center {
  5954. text-align: center !important; } }
  5955. @media (min-width: 992px) {
  5956. .pxer-app .text-lg-left {
  5957. text-align: left !important; }
  5958. .pxer-app .text-lg-right {
  5959. text-align: right !important; }
  5960. .pxer-app .text-lg-center {
  5961. text-align: center !important; } }
  5962. @media (min-width: 1200px) {
  5963. .pxer-app .text-xl-left {
  5964. text-align: left !important; }
  5965. .pxer-app .text-xl-right {
  5966. text-align: right !important; }
  5967. .pxer-app .text-xl-center {
  5968. text-align: center !important; } }
  5969. .pxer-app .text-lowercase {
  5970. text-transform: lowercase !important; }
  5971. .pxer-app .text-uppercase {
  5972. text-transform: uppercase !important; }
  5973. .pxer-app .text-capitalize {
  5974. text-transform: capitalize !important; }
  5975. .pxer-app .font-weight-light {
  5976. font-weight: 300 !important; }
  5977. .pxer-app .font-weight-lighter {
  5978. font-weight: lighter !important; }
  5979. .pxer-app .font-weight-normal {
  5980. font-weight: 400 !important; }
  5981. .pxer-app .font-weight-bold {
  5982. font-weight: 700 !important; }
  5983. .pxer-app .font-weight-bolder {
  5984. font-weight: bolder !important; }
  5985. .pxer-app .font-italic {
  5986. font-style: italic !important; }
  5987. .pxer-app .text-white {
  5988. color: #fff !important; }
  5989. .pxer-app .text-primary {
  5990. color: #007bff !important; }
  5991. .pxer-app a.text-primary:hover, .pxer-app a.text-primary:focus {
  5992. color: #0056b3 !important; }
  5993. .pxer-app .text-secondary {
  5994. color: #6c757d !important; }
  5995. .pxer-app a.text-secondary:hover, .pxer-app a.text-secondary:focus {
  5996. color: #494f54 !important; }
  5997. .pxer-app .text-success {
  5998. color: #28a745 !important; }
  5999. .pxer-app a.text-success:hover, .pxer-app a.text-success:focus {
  6000. color: #19692c !important; }
  6001. .pxer-app .text-info {
  6002. color: #17a2b8 !important; }
  6003. .pxer-app a.text-info:hover, .pxer-app a.text-info:focus {
  6004. color: #0f6674 !important; }
  6005. .pxer-app .text-warning {
  6006. color: #ffc107 !important; }
  6007. .pxer-app a.text-warning:hover, .pxer-app a.text-warning:focus {
  6008. color: #ba8b00 !important; }
  6009. .pxer-app .text-danger {
  6010. color: #dc3545 !important; }
  6011. .pxer-app a.text-danger:hover, .pxer-app a.text-danger:focus {
  6012. color: #a71d2a !important; }
  6013. .pxer-app .text-light {
  6014. color: #f8f9fa !important; }
  6015. .pxer-app a.text-light:hover, .pxer-app a.text-light:focus {
  6016. color: #cbd3da !important; }
  6017. .pxer-app .text-dark {
  6018. color: #343a40 !important; }
  6019. .pxer-app a.text-dark:hover, .pxer-app a.text-dark:focus {
  6020. color: #121416 !important; }
  6021. .pxer-app .text-body {
  6022. color: #212529 !important; }
  6023. .pxer-app .text-muted {
  6024. color: #6c757d !important; }
  6025. .pxer-app .text-black-50 {
  6026. color: rgba(0, 0, 0, 0.5) !important; }
  6027. .pxer-app .text-white-50 {
  6028. color: rgba(255, 255, 255, 0.5) !important; }
  6029. .pxer-app .text-hide {
  6030. font: 0/0 a;
  6031. color: transparent;
  6032. text-shadow: none;
  6033. background-color: transparent;
  6034. border: 0; }
  6035. .pxer-app .text-decoration-none {
  6036. text-decoration: none !important; }
  6037. .pxer-app .text-break {
  6038. word-break: break-word !important;
  6039. overflow-wrap: break-word !important; }
  6040. .pxer-app .text-reset {
  6041. color: inherit !important; }
  6042. .pxer-app .visible {
  6043. visibility: visible !important; }
  6044. .pxer-app .invisible {
  6045. visibility: hidden !important; }
  6046. .pxer-app .card {
  6047. position: relative;
  6048. display: flex;
  6049. flex-direction: column;
  6050. min-width: 0;
  6051. word-wrap: break-word;
  6052. background-color: #fff;
  6053. background-clip: border-box;
  6054. border: 1px solid rgba(0, 0, 0, 0.125);
  6055. border-radius: 0.25rem; }
  6056. .pxer-app .card > hr {
  6057. margin-right: 0;
  6058. margin-left: 0; }
  6059. .pxer-app .card > .list-group:first-child .list-group-item:first-child {
  6060. border-top-left-radius: 0.25rem;
  6061. border-top-right-radius: 0.25rem; }
  6062. .pxer-app .card > .list-group:last-child .list-group-item:last-child {
  6063. border-bottom-right-radius: 0.25rem;
  6064. border-bottom-left-radius: 0.25rem; }
  6065. .pxer-app .card-body {
  6066. flex: 1 1 auto;
  6067. padding: 1.25rem; }
  6068. .pxer-app .card-title {
  6069. margin-bottom: 0.75rem; }
  6070. .pxer-app .card-subtitle {
  6071. margin-top: -0.375rem;
  6072. margin-bottom: 0; }
  6073. .pxer-app .card-text:last-child {
  6074. margin-bottom: 0; }
  6075. .pxer-app .card-link:hover {
  6076. text-decoration: none; }
  6077. .pxer-app .card-link + .card-link {
  6078. margin-left: 1.25rem; }
  6079. .pxer-app .card-header {
  6080. padding: 0.75rem 1.25rem;
  6081. margin-bottom: 0;
  6082. background-color: rgba(0, 0, 0, 0.03);
  6083. border-bottom: 1px solid rgba(0, 0, 0, 0.125); }
  6084. .pxer-app .card-header:first-child {
  6085. border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; }
  6086. .pxer-app .card-header + .list-group .list-group-item:first-child {
  6087. border-top: 0; }
  6088. .pxer-app .card-footer {
  6089. padding: 0.75rem 1.25rem;
  6090. background-color: rgba(0, 0, 0, 0.03);
  6091. border-top: 1px solid rgba(0, 0, 0, 0.125); }
  6092. .pxer-app .card-footer:last-child {
  6093. border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); }
  6094. .pxer-app .card-header-tabs {
  6095. margin-right: -0.625rem;
  6096. margin-bottom: -0.75rem;
  6097. margin-left: -0.625rem;
  6098. border-bottom: 0; }
  6099. .pxer-app .card-header-pills {
  6100. margin-right: -0.625rem;
  6101. margin-left: -0.625rem; }
  6102. .pxer-app .card-img-overlay {
  6103. position: absolute;
  6104. top: 0;
  6105. right: 0;
  6106. bottom: 0;
  6107. left: 0;
  6108. padding: 1.25rem; }
  6109. .pxer-app .card-img {
  6110. width: 100%;
  6111. border-radius: calc(0.25rem - 1px); }
  6112. .pxer-app .card-img-top {
  6113. width: 100%;
  6114. border-top-left-radius: calc(0.25rem - 1px);
  6115. border-top-right-radius: calc(0.25rem - 1px); }
  6116. .pxer-app .card-img-bottom {
  6117. width: 100%;
  6118. border-bottom-right-radius: calc(0.25rem - 1px);
  6119. border-bottom-left-radius: calc(0.25rem - 1px); }
  6120. .pxer-app .card-deck {
  6121. display: flex;
  6122. flex-direction: column; }
  6123. .pxer-app .card-deck .card {
  6124. margin-bottom: 15px; }
  6125. @media (min-width: 576px) {
  6126. .pxer-app .card-deck {
  6127. flex-flow: row wrap;
  6128. margin-right: -15px;
  6129. margin-left: -15px; }
  6130. .pxer-app .card-deck .card {
  6131. display: flex;
  6132. flex: 1 0 0%;
  6133. flex-direction: column;
  6134. margin-right: 15px;
  6135. margin-bottom: 0;
  6136. margin-left: 15px; } }
  6137. .pxer-app .card-group {
  6138. display: flex;
  6139. flex-direction: column; }
  6140. .pxer-app .card-group > .card {
  6141. margin-bottom: 15px; }
  6142. @media (min-width: 576px) {
  6143. .pxer-app .card-group {
  6144. flex-flow: row wrap; }
  6145. .pxer-app .card-group > .card {
  6146. flex: 1 0 0%;
  6147. margin-bottom: 0; }
  6148. .pxer-app .card-group > .card + .card {
  6149. margin-left: 0;
  6150. border-left: 0; }
  6151. .pxer-app .card-group > .card:not(:last-child) {
  6152. border-top-right-radius: 0;
  6153. border-bottom-right-radius: 0; }
  6154. .pxer-app .card-group > .card:not(:last-child) .card-img-top,
  6155. .pxer-app .card-group > .card:not(:last-child) .card-header {
  6156. border-top-right-radius: 0; }
  6157. .pxer-app .card-group > .card:not(:last-child) .card-img-bottom,
  6158. .pxer-app .card-group > .card:not(:last-child) .card-footer {
  6159. border-bottom-right-radius: 0; }
  6160. .pxer-app .card-group > .card:not(:first-child) {
  6161. border-top-left-radius: 0;
  6162. border-bottom-left-radius: 0; }
  6163. .pxer-app .card-group > .card:not(:first-child) .card-img-top,
  6164. .pxer-app .card-group > .card:not(:first-child) .card-header {
  6165. border-top-left-radius: 0; }
  6166. .pxer-app .card-group > .card:not(:first-child) .card-img-bottom,
  6167. .pxer-app .card-group > .card:not(:first-child) .card-footer {
  6168. border-bottom-left-radius: 0; } }
  6169. .pxer-app .card-columns .card {
  6170. margin-bottom: 0.75rem; }
  6171. @media (min-width: 576px) {
  6172. .pxer-app .card-columns {
  6173. column-count: 3;
  6174. column-gap: 1.25rem;
  6175. orphans: 1;
  6176. widows: 1; }
  6177. .pxer-app .card-columns .card {
  6178. display: inline-block;
  6179. width: 100%; } }
  6180. .pxer-app .accordion > .card {
  6181. overflow: hidden; }
  6182. .pxer-app .accordion > .card:not(:first-of-type) .card-header:first-child {
  6183. border-radius: 0; }
  6184. .pxer-app .accordion > .card:not(:first-of-type):not(:last-of-type) {
  6185. border-bottom: 0;
  6186. border-radius: 0; }
  6187. .pxer-app .accordion > .card:first-of-type {
  6188. border-bottom: 0;
  6189. border-bottom-right-radius: 0;
  6190. border-bottom-left-radius: 0; }
  6191. .pxer-app .accordion > .card:last-of-type {
  6192. border-top-left-radius: 0;
  6193. border-top-right-radius: 0; }
  6194. .pxer-app .accordion > .card .card-header {
  6195. margin-bottom: -1px; }
  6196. .pxer-app > * {
  6197. background-color: #fff;
  6198. border: 1px solid #d6dee5;
  6199. border-radius: 5px;
  6200. margin-top: 10px;
  6201. margin-bottom: 10px;
  6202. min-height: 40px;
  6203. display: flex; }
  6204. .pxer-app .pxer-nav {
  6205. background-color: #fff;
  6206. justify-content: space-between;
  6207. padding: 5px 12px;
  6208. align-items: center; }
  6209. .pxer-app .pxer-nav .pn-header a, .pxer-app .pxer-nav .pn-header a:active, .pxer-app .pxer-nav .pn-header a:hover {
  6210. text-decoration: none;
  6211. color: #258fb8;
  6212. font-family: sans-serif;
  6213. font-size: 24px; }
  6214. .pxer-app .pxer-nav .pn-header a small, .pxer-app .pxer-nav .pn-header a:active small, .pxer-app .pxer-nav .pn-header a:hover small {
  6215. font-size: 0.3em; }
  6216. .pxer-app .pxer-nav .pn-header a:hover {
  6217. color: #24749c; }
  6218. .pxer-app .pxer-nav .pn-buttons {
  6219. display: flex;
  6220. align-items: center; }
  6221. .pxer-app .pxer-nav .pn-buttons .btn {
  6222. margin-left: 10px; }
  6223. .pxer-app .pxer-nav .pn-buttons .pnb-warn-number {
  6224. background-color: #fd7e14;
  6225. font-family: sans-serif;
  6226. width: 20px;
  6227. height: 20px;
  6228. font-size: 14px;
  6229. transform: scale(0.7);
  6230. line-height: 20px;
  6231. color: #fff;
  6232. border-radius: 1000px;
  6233. display: inline-block;
  6234. text-align: center;
  6235. margin-left: -20px;
  6236. position: relative;
  6237. top: -10px;
  6238. left: 8px; }
  6239. .pxer-app .pxer-fail > table thead tr td {
  6240. padding: 3px 12px;
  6241. vertical-align: middle;
  6242. font-size: 16px; }
  6243. .pxer-app .pxer-task-option {
  6244. padding: 5px 0; }
  6245. .pxer-app .pxer-task-option > * {
  6246. margin-left: 12px; }
  6247. .pxer-app .pxer-task-option .ptp-buttons {
  6248. margin-left: auto;
  6249. margin-right: 12px; }
  6250. .pxer-app .pxer-task-option .ptp-buttons button {
  6251. margin-left: 10px; }
  6252. .pxer-app .pxer-print > * {
  6253. flex-grow: 1;
  6254. margin: 12px; }
  6255. .pxer-app .pxer-print .pp-filter, .pxer-app .pxer-print .pp-print {
  6256. margin-top: 1.5em;
  6257. padding: 12px; }
  6258. .pxer-app .pxer-print .pp-print {
  6259. width: 35%; }
  6260. .pxer-app .pxer-print .pp-print .pppf-buttons {
  6261. text-align: right; }
  6262. .pxer-app .pxer-print .pp-print .pppf-buttons .pppfb-msg {
  6263. padding: 5px;
  6264. text-align: left;
  6265. border: 1px solid #e9ecef;
  6266. color: #6c757d;
  6267. border-radius: 1px; }
  6268. .pxer-app .pxer-print .pp-filter {
  6269. width: 55%; }
  6270. .pxer-app .pxer-print .pp-filter .ppf-tag-card .card-body {
  6271. display: flex;
  6272. flex-wrap: wrap;
  6273. justify-content: space-between;
  6274. padding: 5px;
  6275. position: relative;
  6276. overflow: hidden; }
  6277. .pxer-app .pxer-print .pp-filter .ppf-tag-card .ppf-show-all-tag {
  6278. position: absolute;
  6279. bottom: 0;
  6280. width: 100%;
  6281. display: block;
  6282. padding: 20px 0 5px;
  6283. text-align: center;
  6284. cursor: pointer;
  6285. color: #258fb8;
  6286. background: linear-gradient(rgba(255, 255, 255, 0), white 50%); }
  6287. .pxer-app .pxer-print .pp-filter .ppf-tag-card .ppf-tag {
  6288. margin: 5px 2px;
  6289. cursor: pointer; }
  6290. .pxer-app .pxer-print .pp-filter .ppf-tag-card .ppf-tag:last-child {
  6291. margin-right: auto; }
  6292. .pxer-app input.form-control, .pxer-app select.form-control {
  6293. height: 24px;
  6294. padding-top: 1px;
  6295. padding-bottom: 1px;
  6296. line-height: 1em; }
  6297. .pxer-app .pxer-class-fieldset {
  6298. border: 1px solid #ccc;
  6299. position: relative;
  6300. padding-top: 1em;
  6301. margin-top: 1em; }
  6302. .pxer-app .pxer-class-fieldset .pcf-title {
  6303. background-color: #fff;
  6304. display: inline-block;
  6305. position: absolute;
  6306. top: -0.75em;
  6307. left: 0.45em;
  6308. font-size: 16px; }
  6309. .pxer-app .text-right {
  6310. text-align: right; }
  6311.  
  6312. div#wave {
  6313. position: relative;
  6314. margin-left: auto;
  6315. margin-right: auto; }
  6316. div#wave .dot {
  6317. display: inline-block;
  6318. width: 9px;
  6319. height: 9px;
  6320. border-radius: 50%;
  6321. margin-right: 3px;
  6322. background: #303131;
  6323. animation: wave 1.3s linear infinite; }
  6324. div#wave .dot:nth-child(2) {
  6325. animation-delay: -1.1s; }
  6326. div#wave .dot:nth-child(3) {
  6327. animation-delay: -0.9s; }
  6328.  
  6329. @keyframes wave {
  6330. 0%, 60%, 100% {
  6331. transform: initial; }
  6332. 30% {
  6333. transform: translateY(-8px); } }
  6334. `;
  6335.  
  6336. ;
  6337.  
  6338.  
  6339. // public/favicon.ico
  6340. pxer.util.addFile('public/favicon.ico')
  6341. ;
  6342.  
  6343.  
  6344. // https://point.pea3nut.org/sdk/1.0/browser.js
  6345. "use strict";
  6346. var EventSender = /** @class */ (function () {
  6347. function EventSender(remoteUrl, userOptions) {
  6348. this.remoteUrl = remoteUrl;
  6349. this.userOptions = userOptions;
  6350. this.startTime = new Date;
  6351. this.content = {};
  6352. var that = this;
  6353. this.defaultOptions = {
  6354. sdk_version: '1.0',
  6355. get time() { return new Date; },
  6356. get duration() { return new Date().getTime() - that.startTime.getTime(); },
  6357. };
  6358. }
  6359. EventSender.prototype.setContent = function (content) {
  6360. Object.assign(this.content, content);
  6361. };
  6362. EventSender.prototype.send = function (eventFlag, content) {
  6363. var mergedContent = Object.assign({}, this.content, content);
  6364. var body = Object.assign({}, this.defaultOptions, this.userOptions, {
  6365. content: JSON.stringify(mergedContent),
  6366. event_flag: eventFlag,
  6367. });
  6368. this.sendRequest(body);
  6369. };
  6370. EventSender.prototype.sendRequest = function (body) {
  6371. var xhr = new XMLHttpRequest();
  6372. xhr.open('POST', this.remoteUrl);
  6373. xhr.onload = function () {
  6374. if (['2', '3'].includes(xhr.status.toString()[0])) {
  6375. var res = JSON.parse(xhr.responseText);
  6376. if (res.errcode) {
  6377. console.error("Error in point sent! Server response " + xhr.responseText);
  6378. }
  6379. }
  6380. else {
  6381. console.error("Error in point sent! Server response HTTP code " + xhr.status);
  6382. }
  6383. };
  6384. xhr.send(JSON.stringify(body));
  6385. };
  6386. return EventSender;
  6387. }());
  6388. //# sourceMappingURL=browser.js.map
  6389. ;
  6390.  
  6391.  
  6392. // src/app/util.js
  6393. 'use strict';
  6394.  
  6395. pxer.util = pxer.util || {};
  6396.  
  6397. // 全局函数
  6398. pxer.util.blinkTitle =function(addMsg ,spaceMsg){
  6399. var addMsg =addMsg ||'[ OK ] ';
  6400. var spaceMsg =spaceMsg ||'[    ] ';
  6401. var timer =setInterval(()=>{
  6402. if(document.title.indexOf(addMsg) !==-1){
  6403. document.title =document.title.replace(addMsg ,spaceMsg);
  6404. }else if(document.title.indexOf(spaceMsg) !==-1){
  6405. document.title =document.title.replace(spaceMsg ,addMsg);
  6406. }else{
  6407. document.title =addMsg+document.title;
  6408. };
  6409. },500);
  6410. window.addEventListener('mousemove' ,function _self(){
  6411. window.addEventListener('mousemove' ,_self);
  6412. clearInterval(timer);
  6413. document.title =document.title.replace(spaceMsg ,"").replace(addMsg ,"");
  6414. });
  6415. };
  6416. pxer.util.parseURL =function(url=document.URL){
  6417. var arr =url.match(/^(?:(https?):)?\/\/([\w_\d.:\-]+?)((?:\/[^\/?]*)*)\/?(?:\?(.+))?$/);
  6418. var data ={
  6419. protocol:arr[1],
  6420. domain:arr[2],
  6421. path:arr[3],
  6422. query:arr[4],
  6423. };
  6424. if(data.query && data.query.indexOf('=')!==-1){
  6425. data.query ={};
  6426. for(let item of arr[4].split('&')){
  6427. let tmp =item.split('=');
  6428. data.query[tmp[0]]=tmp[1];
  6429. };
  6430. }
  6431. return data;
  6432. };
  6433. pxer.util.createScript =function(url){
  6434. if(!/^(https?:)?\/\//.test(url))url =window['PXER_URL']+url;
  6435. var elt =document.createElement('script');
  6436. elt.charset='utf-8';
  6437. return function(resolve,reject){
  6438. elt.addEventListener('load',resolve);
  6439. elt.addEventListener('load',function(){
  6440. if(window['PXER_MODE']==='dev') console.log('Loaded '+url);
  6441. });
  6442. elt.addEventListener('error',reject);
  6443. elt.src =url;
  6444. document.documentElement.appendChild(elt);
  6445. return elt;
  6446. };
  6447. };
  6448. pxer.util.createResource =function(url){
  6449. if(!/^(https?:)?\/\//.test(url))url =window['PXER_URL']+url;
  6450. let fx =url.match(/\.([^\.]+?)$/)[1];
  6451. let elt =document.createElement('link');
  6452. switch(fx){
  6453. case 'css':
  6454. elt.rel ='stylesheet';
  6455. break;
  6456. case 'ico':
  6457. elt.rel ='shortcut icon';
  6458. elt.type ='image/x-icon';
  6459. break;
  6460. default:
  6461. throw new Error(`unknown filename extension "${fx}"`)
  6462. }
  6463. return function(resolve,reject){
  6464. elt.href =url;
  6465. document.documentElement.appendChild(elt);
  6466. if(window['PXER_MODE']==='dev') console.log('Linked '+url);
  6467. resolve();
  6468. };
  6469. };
  6470. pxer.util.execPromise =function(taskList,call){
  6471. var promise =Promise.resolve();
  6472. if(Array.isArray(taskList)&&Array.isArray(taskList[0])){
  6473. for(let array of taskList){
  6474. promise =promise.then(()=>Promise.all(array.map(item=>new Promise(call(item)))));
  6475. }
  6476. }else if(Array.isArray(taskList)){
  6477. for(let item of taskList){
  6478. promise =promise.then(()=>new Promise(call(item)));
  6479. }
  6480. }else{
  6481. promise =promise.then(()=>new Promise(call(taskList)));
  6482. };
  6483. return promise;
  6484. };
  6485.  
  6486. /**
  6487. * 当前页面类型。可能的值
  6488. * - bookmark_user 自己/其他人关注的用户列表
  6489. * - bookmark_works 自己/其他人收藏的作品
  6490. * - member_info 自己/其他人的主页
  6491. * - works_medium 查看某个作品
  6492. * - works_manga 查看某个多张作品的多张页
  6493. * - works_big 查看某个作品的某张图片的大图
  6494. * - member_works 自己/其他人作品列表页
  6495. * - member_works_new 自己/其他人作品列表页
  6496. * - search 检索页
  6497. * - index 首页
  6498. * - discovery 探索
  6499. * - rank 排行榜
  6500. * - bookmark_new 关注的新作品
  6501. * - unknown 未知
  6502. * @param {Document} doc
  6503. * @return {string} - 页面类型
  6504. * */
  6505. pxer.util.getPageType =function(doc = document){
  6506. const url = doc.URL;
  6507. var URLData = pxer.util.parseURL(url);
  6508.  
  6509. switch (true) {
  6510. case pxer.regexp.urlWorkDetail.test(URLData.path): return 'works_medium';
  6511. }
  6512.  
  6513.  
  6514. var type =null;
  6515. var isnew =!(Boolean(document.querySelector(".count-badge"))||Boolean(document.querySelector(".profile")));
  6516. if(URLData.domain !=='www.pixiv.net')return 'unknown';
  6517.  
  6518. if (pxer.regexp.isBookmarksUrl.test(URLData.path)) {
  6519. type = 'bookmark_works'
  6520. } else if (URLData.path.startsWith('/users/')) {
  6521. type = 'member_works_new'
  6522. } else if (URLData.path.startsWith('/tags/')) {
  6523. type = 'search_tag'
  6524. } else if(URLData.path==='/bookmark.php'){
  6525. if(URLData.query &&URLData.query.type){
  6526. switch(URLData.query.type){
  6527. case 'user':
  6528. type ='bookmark_user';
  6529. break;
  6530. default:
  6531. type ='unknown';
  6532. };
  6533. }else{
  6534. type ='bookmark_works';
  6535. }
  6536. }else if(URLData.path==='/bookmark_new_illust.php'){
  6537. type ='bookmark_new';
  6538. }else if(URLData.path==='/member.php'){
  6539. type =isnew?'member_works_new':"member_info";
  6540. }else if(URLData.path==='/ranking.php'){
  6541. type ='rank';
  6542. }else if(URLData.path==='/member_illust.php'){
  6543. if(URLData.query&&URLData.query.mode){
  6544. switch(URLData.query.mode){
  6545. case 'medium':
  6546. type ='works_medium';
  6547. break;
  6548. case 'manga':
  6549. type ='works_manga';
  6550. break;
  6551. case 'manga_big':
  6552. type ='works_big';
  6553. break;
  6554. default:
  6555. type ='unknown';
  6556. };
  6557. }else{
  6558. type =isnew?'member_works_new':"member_works";
  6559. }
  6560. }else if(URLData.path==='/search.php'){
  6561. // TODO: Not all of search is carried in SPA
  6562. // But new version seems batter?
  6563. type ='search_spa';
  6564. }else if(URLData.path==='/discovery'){
  6565. type ='discovery';
  6566. }else if(URLData.path==='/'){
  6567. type ='index';
  6568. }else{
  6569. type ='unknown';
  6570. }
  6571. return type;
  6572. };
  6573. /**
  6574. * 查询对应页面类型每页作品数量
  6575. * @param {string} type - 作品类型
  6576. * @return {number} - 每页作品数
  6577. */
  6578. pxer.util.getOnePageWorkCount =function(type) {
  6579. switch (type) {
  6580. case "search_spa":return 48
  6581. case "search_tag":return 60
  6582. case "search":return 40
  6583. case "rank":return 50
  6584. case "discovery":return 3000
  6585. case "bookmark_works":return 48
  6586. case "bookmark_new":return 60
  6587. case "member_works_new": return Number.MAX_SAFE_INTEGER
  6588. default:return 20
  6589. };
  6590. }
  6591. pxer.util.getIDfromURL =function(key='id', url=document.URL) {
  6592. const urlInfo = new URL(url, document.URL);
  6593. var query = urlInfo.search;
  6594. var params = new URLSearchParams(query);
  6595.  
  6596. const result = params.get(key);
  6597.  
  6598. if (result) return result;
  6599.  
  6600. // read id from url
  6601. const matchResult = url.match(/\d{4,}/);
  6602.  
  6603. return matchResult ? matchResult[0] : null;
  6604. };
  6605. pxer.util.fetchPixivApi = async function(url) {
  6606. return (
  6607. await (
  6608. await fetch(
  6609. url,
  6610. { credentials: 'include' },
  6611. )
  6612. ).json()
  6613. ).body;
  6614. };
  6615.  
  6616. Object.assign(window, pxer.util);
  6617. ;
  6618.  
  6619.  
  6620. // src/app/regexp.js
  6621. pxer.regexp = pxer.regexp || {};
  6622. pxer.regexp.urlWorkDetail = /\/artworks\/(\d+)/;
  6623. pxer.regexp.parseKeyword = /\/tags\/([^\/]+?)\//;
  6624. pxer.regexp.isBookmarksUrl = /users\/\d+\/bookmarks\/artworks/;
  6625. ;
  6626.  
  6627.  
  6628. // src/app/PxerData.js
  6629. 'use strict';
  6630.  
  6631. /**
  6632. * Pxer任务队列中的任务对象
  6633. * @constructor
  6634. * @abstract
  6635. * */
  6636. class PxerRequest{
  6637. constructor({url ,html}={}){
  6638. this.url=url;
  6639. this.html =html;
  6640. this.completed =false;
  6641. };
  6642. }
  6643. /**
  6644. * 页面任务对象
  6645. * @constructor
  6646. * @extends {PxerRequest}
  6647. * */
  6648. class PxerPageRequest extends PxerRequest{
  6649. constructor(...argn){
  6650. super(...argn);
  6651. this.type = argn[0].type;
  6652. }
  6653. }
  6654. /**
  6655. * 作品任务对象
  6656. * @constructor
  6657. * @extends {PxerRequest}
  6658. * */
  6659. class PxerWorksRequest extends PxerRequest{
  6660. constructor({url=[] ,html={} ,type ,isMultiple ,id}={}){
  6661. super({url ,html});
  6662. this.type =type;//[manga|ugoira|illust]
  6663. this.isMultiple =isMultiple;//[true|false]
  6664. this.id =id;
  6665. }
  6666. }
  6667.  
  6668.  
  6669. /**
  6670. * 作品任务对象
  6671. * @constructor
  6672. * @extends {PxerRequest}
  6673. * */
  6674. class PxerFailInfo{
  6675. constructor({url,type,task}={}){
  6676. this.url =url;
  6677. this.type =type;
  6678. this.task =task;
  6679. }
  6680. }
  6681.  
  6682.  
  6683.  
  6684. /**
  6685. * 抓取到的作品对象
  6686. * @constructor
  6687. * */
  6688. class PxerWorks{
  6689. constructor({id ,type ,date ,domain ,tagList ,viewCount ,ratedCount ,fileFormat}={},strict=true){
  6690. /**作品ID*/
  6691. this.id =id;
  6692. /**
  6693. * 投稿日期,格式:Y/m/d/h/m/s
  6694. * @type {string}
  6695. * */
  6696. this.date =date;
  6697. this.type =type;//[manga|ugoira|illust]
  6698. /**作品存放的域名*/
  6699. this.domain =domain;
  6700. /**
  6701. * 作品标签列表
  6702. * @type {Array}
  6703. * */
  6704. this.tagList =tagList;
  6705. /**作品被浏览的次数*/
  6706. this.viewCount =viewCount;
  6707. /**作品被赞的次数*/
  6708. this.ratedCount =ratedCount;
  6709. /**作品的图片文件扩展名*/
  6710. this.fileFormat =fileFormat;
  6711. }
  6712. }
  6713. /**
  6714. * 抓取到的多张插画/漫画作品对象
  6715. * @extends {PxerWorks}
  6716. * @constructor
  6717. * */
  6718. class PxerMultipleWorks extends PxerWorks{
  6719. constructor(data={}){
  6720. super(data,false);
  6721. /**作品的图片张数*/
  6722. this.isMultiple =true;
  6723. this.multiple =data.multiple;
  6724. }
  6725. };
  6726. /**
  6727. * 抓取到的动图作品对象
  6728. * @extends {PxerWorks}
  6729. * @constructor
  6730. * */
  6731. class PxerUgoiraWorks extends PxerWorks{
  6732. constructor(data={}){
  6733. super(data,false);
  6734. this.type ='ugoira';
  6735. this.fileFormat='zip';
  6736. /**动图动画参数*/
  6737. this.frames =data.frames;
  6738. }
  6739. };
  6740.  
  6741. ;
  6742.  
  6743.  
  6744. // src/app/PxerEvent.js
  6745. 'use strict';
  6746.  
  6747. class PxerEvent{
  6748. constructor(eventList=[] ,shortName =true){
  6749. this._pe_eventList =eventList;
  6750.  
  6751. this._pe_event ={};
  6752. this._pe_oneEvent ={};
  6753.  
  6754.  
  6755. if(!shortName||typeof Proxy==='undefined') return this
  6756. else return new Proxy(this ,{
  6757. get(target ,property){
  6758. if(property in target){
  6759. return target[property];
  6760. }else if(target._pe_eventList.indexOf(property) !==-1){
  6761. return target.dispatch.bind(target ,property);
  6762. }else{
  6763. return target[property];
  6764. };
  6765. },
  6766. });
  6767.  
  6768. };
  6769. on(type, listener){
  6770. if(!PxerEvent.check(this ,type ,listener))return false;
  6771. if(!this._pe_event[type]) this._pe_event[type]=[];
  6772. this._pe_event[type].push(listener);
  6773. return true;
  6774. };
  6775. one(type, listener){
  6776. if(!PxerEvent.check(this ,type ,listener))return false;
  6777. if(!this._pe_oneEvent[type]) this._pe_oneEvent[type]=[];
  6778. this._pe_oneEvent[type].push(listener);
  6779. return true;
  6780. };
  6781. dispatch(type ,...data){
  6782. if(this._pe_eventList.indexOf(type) ===-1) return false;
  6783. if(this._pe_event[type]) this._pe_event[type].forEach(fn=>fn(...data));
  6784. if(this._pe_oneEvent[type]){
  6785. this._pe_oneEvent[type].forEach(fn=>fn(...data));
  6786. delete this._pe_oneEvent[type];
  6787. }
  6788. if(this._pe_event['*']) this._pe_event['*'].forEach(fn=>fn(...data));
  6789. if(this._pe_oneEvent['*']){
  6790. this._pe_oneEvent['*'].forEach(fn=>fn(...data));
  6791. delete this._pe_oneEvent['*'];
  6792. }
  6793. return true;
  6794. };
  6795. off(eventType, listener){
  6796. if(!PxerEvent.checkEvent(this ,eventType)) return false;
  6797. if(listener &&!PxerEvent.checkListener(listener)) return false;
  6798.  
  6799. if(eventType ===true){
  6800. this._pe_event ={};
  6801. this._pe_oneEvent ={};
  6802. return true;
  6803. };
  6804.  
  6805. if(listener===true || listener==='*'){
  6806. delete this._pe_event[eventType];
  6807. delete this._pe_oneEvent[eventType];
  6808. return true;
  6809. };
  6810.  
  6811. let index1 = this._pe_event[type].lastIndexOf(listener);
  6812. if (index1 !== -1) {
  6813. this._pe_event[type].splice(index1, 1);
  6814. };
  6815.  
  6816. let index2 =this._pe_oneEvent[type].lastIndexOf(listener);
  6817. if(index2 !== -1){
  6818. this._pe_oneEvent[type].splice(index2 ,1);
  6819. };
  6820.  
  6821. return true;
  6822.  
  6823. };
  6824. };
  6825.  
  6826. PxerEvent.check =function(pe ,eventType ,listener){
  6827. return PxerEvent.checkEvent(pe ,eventType)&&PxerEvent.checkListener(listener);
  6828. };
  6829. PxerEvent.checkEvent =function(pe ,eventType){
  6830. if(eventType !=='*' &&pe._pe_eventList.indexOf(eventType) ===-1){
  6831. console.warn(`PxerEvent : "${eventType}" is not in eventList[${pe._pe_eventList}]`);
  6832. return false;
  6833. };
  6834. return true;
  6835. };
  6836. PxerEvent.checkListener =function(listener){
  6837. if(!(listener instanceof Function || listener===true || listener==='*')){
  6838. console.warn(`PxerEvent: "${listener}" is not a function`);
  6839. return false;
  6840. };
  6841. return true;
  6842. };
  6843.  
  6844.  
  6845.  
  6846. ;
  6847.  
  6848.  
  6849. // src/view/i18n.js
  6850. pxer.t = function (key) {
  6851. const defaultLang = 'en';
  6852.  
  6853. return (
  6854. pxer.util.get(pxer.i18nMap[pxer.lang], key)
  6855. || pxer.util.get(pxer.i18nMap[defaultLang], key)
  6856. || key
  6857. );
  6858. };
  6859.  
  6860. ;
  6861.  
  6862.  
  6863. // public/i18n/en.json
  6864. pxer.util.set(pxer, 'i18nMap.en', {
  6865. "phrase": {
  6866. "taskInfo": "`There are ${worksNum} works and ${address} picture address.<br />The single works is ${(single/worksNum*100).toFixed(1)}%<br /> and the multiple works ${(multiple/worksNum*100).toFixed(1)}%<br />`",
  6867. "blockOpen": "Pxer:\nThe browser blocked Pup-up window. Please check the hint of browser and allow it.",
  6868. "likeProportion": "Input a number less than 1",
  6869. "pointPage": "There is a page to show url of pictures. <strong>Don't</strong> openning in the browser. You can copy them to the downloader tools for download picture.<br />Have no idea? Look at <a href=\"https://github.com/FoXZilla/Pxer/issues/166\" target=\"_blank\">there</a> for what does the senior .<br />"
  6870. },
  6871. "button": {
  6872. "selectAll": "Select All",
  6873. "retryTheSelected": "Retry Selected",
  6874. "preview": "Preview",
  6875. "print": "Print",
  6876. "showAll": "Show All",
  6877. "crawl": "Get",
  6878. "load": "Load",
  6879. "stop": "Stop",
  6880. "option": "Option",
  6881. "apply": "Apply",
  6882. "successBut": "Trouble"
  6883. },
  6884. "option": {
  6885. "ugoiraMax": "Max ZIP",
  6886. "ugoira600p": "600p ZIP",
  6887. "ugoiraConfig": "config",
  6888. "max": "MAX",
  6889. "cover600p": "Cover Only(600p)",
  6890. "no": "No"
  6891. },
  6892. "label": {
  6893. "pictureId": "ID",
  6894. "reason": "Reason",
  6895. "way": "Way",
  6896. "onlyGetTop": "Only get top:",
  6897. "onlyGetBeforeId": "Only get the picture before id (newer than that):",
  6898. "likeCount": "Like Count",
  6899. "viewCount": "View Count",
  6900. "singleIllust": "Single Illust",
  6901. "multipleIllust": "Multiple Illust",
  6902. "singleManga": "Single Manga",
  6903. "multipleManga": "Multiple Manga",
  6904. "ugoira": "Ugoira",
  6905. "likeProportion": "Like Proportion",
  6906. "whatever": "Whatever",
  6907. "exclude": "Exclude",
  6908. "mustInclude": "Must Include"
  6909. },
  6910. "title": {
  6911. "printOptions": "Print Options",
  6912. "filterByTag": "Filter by tag",
  6913. "filterOptions": "Filter Options"
  6914. },
  6915. "pageType": {
  6916. "member_works": "List of Works",
  6917. "member_works_new": "SPA List of Works",
  6918. "search": "Search",
  6919. "search_spa": "SPA Tag Search",
  6920. "search_tag": "Tag Search",
  6921. "bookmark_works": "List of bookmark",
  6922. "rank": "Rank",
  6923. "bookmark_new": "New Works",
  6924. "discovery": "Discovery",
  6925. "unknown": "Unknown"
  6926. },
  6927. "hello": "yahello"
  6928. })
  6929. ;
  6930.  
  6931.  
  6932. // public/i18n/zh.json
  6933. pxer.util.set(pxer, 'i18nMap.zh', {
  6934. "phrase": {
  6935. "taskInfo": "`共计${worksNum}个作品,${address}个下载地址。<br />单张图片作品占 ${(single/worksNum*100).toFixed(1)}%<br />多张图片作品占 ${(multiple/worksNum*100).toFixed(1)}%<br />`",
  6936. "blockOpen": "Pxer:\n浏览器拦截了弹出窗口,请检查浏览器提示,设置允许此站点的弹出式窗口。",
  6937. "likeProportion": "若输入,则必须为一个小于1的数字",
  6938. "pointPage": "这个页面是抓取到的下载地址,<strong>不要</strong>直接在浏览器打开,你可以将它们复制到第三方下载工具中下载<br />不知道用什么工具?<a href=\"https://github.com/FoXZilla/Pxer/issues/8\" target=\"_blank\">访问这里</a>来看看大家都在用什么工具下载<br />"
  6939. },
  6940. "button": {
  6941. "selectAll": "全选",
  6942. "retryTheSelected": "重试选中",
  6943. "preview": "预览",
  6944. "print": "输出",
  6945. "showAll": "展开全部",
  6946. "crawl": "抓取",
  6947. "load": "载入",
  6948. "stop": "停止",
  6949. "option": "设置",
  6950. "apply": "保存",
  6951. "successBut": "部分成功"
  6952. },
  6953. "option": {
  6954. "ugoiraMax": "最大压缩包",
  6955. "ugoira600p": "600p压缩包",
  6956. "ugoiraConfig": "参数",
  6957. "max": "最大",
  6958. "cover600p": "仅封面(600p)",
  6959. "no": "不输出"
  6960. },
  6961. "label": {
  6962. "pictureId": "图片ID",
  6963. "reason": "失败原因",
  6964. "way": "解决方案",
  6965. "onlyGetTop": "仅抓取前x副:",
  6966. "onlyGetBeforeId": "仅抓取id为x之前的(比x更加新的):",
  6967. "likeCount": "点赞数",
  6968. "viewCount": "浏览数",
  6969. "singleIllust": "单张插画",
  6970. "multipleIllust": "多张插画",
  6971. "singleManga": "单张漫画",
  6972. "multipleManga": "多张漫画",
  6973. "ugoira": "动图",
  6974. "likeProportion": "点赞率",
  6975. "whatever": "无所谓",
  6976. "exclude": "不能包含",
  6977. "mustInclude": "必须包含"
  6978. },
  6979. "title": {
  6980. "printOptions": "输出选项",
  6981. "filterByTag": "按标签过滤",
  6982. "filterOptions": "过滤选项"
  6983. },
  6984. "pageType": {
  6985. "member_works": "作品列表页",
  6986. "member_works_new": "作品列表页_",
  6987. "search": "检索页",
  6988. "search_spa": "SPA检索页",
  6989. "search_tag": "标签搜索页",
  6990. "bookmark_works": "收藏列表页",
  6991. "rank": "排行榜",
  6992. "bookmark_new": "关注的新作品",
  6993. "discovery": "探索",
  6994. "unknown": "未知"
  6995. },
  6996. "hello": "你好"
  6997. })
  6998. ;
  6999.  
  7000.  
  7001. // public/i18n/ja.json
  7002. pxer.util.set(pxer, 'i18nMap.ja', {
  7003. "phrase": {
  7004. "taskInfo": "`小計${worksNum}個作品,${address}個ダウンロードアドレス。<br />シングル画像作品割合 ${(single/worksNum*100).toFixed(1)}%<br />複数画像作品割合 ${(multiple/worksNum*100).toFixed(1)}%<br />`",
  7005. "blockOpen": "Pxer:\nブラウザでポップアップがブロックされています。ブラウザのプロンプトを確認して、このサイトのポップアップブロックを許可する操作を行ってください。",
  7006. "likeProportion": "1 未満の数値を入力してください。",
  7007. "pointPage": "このページはクロールされたダウンロードアドレスです。ブラウザで直接<strong>開かないで下さい</strong>。サードパーティのダウンロードツールにコピーして実行します。<br />適用ツールが分からない場合<a href=\"https://github.com/FoXZilla/Pxer/issues/8\" target=\"_blank\">こちら</a>皆さんはどんなツールが使用していますか<br />"
  7008. },
  7009. "button": {
  7010. "selectAll": "全て選択",
  7011. "retryTheSelected": "選択を再試行",
  7012. "preview": "プレビュー",
  7013. "print": "プリント",
  7014. "showAll": "全て表示",
  7015. "crawl": "クロール",
  7016. "load": "ロード",
  7017. "stop": "ストップ",
  7018. "option": "設定",
  7019. "apply": "適用",
  7020. "successBut": "トラブル"
  7021. },
  7022. "option": {
  7023. "ugoiraMax": "Max ZIP",
  7024. "ugoira600p": "600p ZIP",
  7025. "ugoiraConfig": "config",
  7026. "max": "Max",
  7027. "cover600p": "カバーのみ(600p)",
  7028. "no": "プリント不要"
  7029. },
  7030. "label": {
  7031. "pictureId": "画像ID",
  7032. "reason": "失敗原因",
  7033. "way": "解決方法",
  7034. "onlyGetTop": "Top X 枚のみ:",
  7035. "onlyGetBeforeId": "ID<Xの画像のみ:",
  7036. "likeCount": "いいね!数",
  7037. "viewCount": "ビュー数",
  7038. "singleIllust": "シングルイラスト",
  7039. "multipleIllust": "複数のイラスト",
  7040. "singleManga": "シングル漫画",
  7041. "multipleManga": "複数の漫画",
  7042. "ugoira": "うごイラ",
  7043. "likeProportion": "いいね!割合",
  7044. "whatever": "何でもOK",
  7045. "exclude": "含まない",
  7046. "mustInclude": "含む必要"
  7047. },
  7048. "title": {
  7049. "printOptions": "プリントオプション",
  7050. "filterByTag": "タグでフィルター",
  7051. "filterOptions": "フィルターオプション"
  7052. },
  7053. "pageType": {
  7054. "member_works": "作品リスト",
  7055. "member_works_new": "SPA 作品リスト",
  7056. "search": "検索",
  7057. "search_spa": "SPA タグ検索",
  7058. "search_tag": "タグ検索",
  7059. "bookmark_works": "お気に入りリスト",
  7060. "rank": "ランク",
  7061. "bookmark_new": "お気に入り新作品",
  7062. "discovery": "発見",
  7063. "unknown": "アンノウン"
  7064. },
  7065. "hello": "ようこそ"
  7066. })
  7067. ;
  7068.  
  7069.  
  7070. // src/app/PxerFilter.js
  7071. 'use strict';
  7072.  
  7073. class PxerFilter{
  7074. /**
  7075. * @param {Object} config - 过滤参数
  7076. * @see PxerFilter.filterInfo
  7077. * @see PxerFilter.filterTag
  7078. * */
  7079. constructor(config){
  7080. /**
  7081. * 每次过滤后得到的累计的作品集合
  7082. * @type {PxerWorks[]}
  7083. * */
  7084. this.passWorks =[];
  7085.  
  7086. /**
  7087. * 过滤的配置信息
  7088. * @see PxerFilter.filterInfo
  7089. * @see PxerFilter.filterTag
  7090. * */
  7091. this.config =Object.assign(PxerFilter.defaultConfig(),config);
  7092. };
  7093.  
  7094. /**
  7095. * 对作品进行过滤
  7096. * @param {PxerWorks[]} worksList - 要过滤的作品数组
  7097. * @return {PxerWorks[]} - 过滤后的结果
  7098. * */
  7099. filter(worksList){
  7100. var resultSet =PxerFilter.filterInfo(PxerFilter.filterTag(worksList,this.config) ,this.config);
  7101. this.passWorks.push(...resultSet);
  7102. return resultSet;
  7103. };
  7104. };
  7105.  
  7106. /**
  7107. * 返回PxerFilter的默认配置参数
  7108. * @see PxerFilter.filterInfo
  7109. * @see PxerFilter.filterTag
  7110. * */
  7111. PxerFilter.defaultConfig =function(){
  7112. return{
  7113. "rated" :0,//赞的数量
  7114. "rated_pro" :0,//点赞率
  7115. "view" :0,//浏览数
  7116. "has_tag_every" :[], // 作品中不能含有以下任意一个标签
  7117. "has_tag_some" :[], // 作品中不能同时含有以下所有标签
  7118. "no_tag_any" :[], // 作品中必须含有以下任意一个标签
  7119. "no_tag_every" :[], // 作品中必须同时含有以下所有标签
  7120. };
  7121. };
  7122.  
  7123. /**
  7124. * 根据标签作品信息过滤作品
  7125. * @param {PxerWorks[]} worksList
  7126. * @param {number} rated - 作品不小于的赞的数量
  7127. * @param {number} rated_pro - 作品不小于的点赞率,小于0的数字
  7128. * @param {number} view - 作品不小于的浏览数
  7129. * @return {PxerWorks[]}
  7130. * */
  7131. PxerFilter.filterInfo =function(worksList ,{rated=0,rated_pro=0,view=0}){
  7132. return worksList.filter(function(works){
  7133. return works.ratedCount >= rated
  7134. && works.viewCount >= view
  7135. && (works.ratedCount/works.viewCount) >= rated_pro
  7136. });
  7137. };
  7138.  
  7139. /**
  7140. * 根据标签过滤作品
  7141. * @param {PxerWorks[]} worksList
  7142. * @param {string[]} no_tag_any - 作品中不能含有里面的任意一个标签
  7143. * @param {string[]} no_tag_every - 作品中不能同时含有里面的所有标签
  7144. * @param {string[]} has_tag_some - 作品中必须含有有里面的任意一个标签
  7145. * @param {string[]} has_tag_every - 作品中必须同时含有里面的所有标签
  7146. * @return {PxerWorks[]}
  7147. * */
  7148. PxerFilter.filterTag =function(worksList ,{has_tag_every,has_tag_some,no_tag_any,no_tag_every}){
  7149. var passWorks =worksList;
  7150.  
  7151. if(has_tag_every && has_tag_every.length !==0){
  7152. passWorks =passWorks.filter(function(works){
  7153. return has_tag_every.every(tag=>works.tagList.indexOf(tag)!==-1);
  7154. });
  7155. };
  7156.  
  7157. if(has_tag_some && has_tag_some.length !==0){
  7158. passWorks =passWorks.filter(function(works){
  7159. return has_tag_some.some(tag=>works.tagList.indexOf(tag)!==-1);
  7160. });
  7161. };
  7162.  
  7163. if(no_tag_any && no_tag_any.length !==0){
  7164. passWorks =passWorks.filter(function(works){
  7165. return !no_tag_any.some(tag=>works.tagList.indexOf(tag)!==-1);
  7166. });
  7167. };
  7168.  
  7169. if(no_tag_every && no_tag_every.length !==0){
  7170. passWorks =passWorks.filter(function(works){
  7171. return !no_tag_every.every(tag=>works.tagList.indexOf(tag)!==-1);
  7172. });
  7173. };
  7174.  
  7175. return passWorks;
  7176.  
  7177. };
  7178.  
  7179.  
  7180. ;
  7181.  
  7182.  
  7183. // src/app/PxerHtmlParser.js
  7184. 'use strict';
  7185.  
  7186. class PxerHtmlParser{
  7187. constructor(){
  7188. throw new Error('PxerHtmlParse could not construct');
  7189. };
  7190. };
  7191.  
  7192.  
  7193. /**
  7194. * 解析页码任务对象
  7195. * @param {PxerPageRequest} task - 抓取后的页码任务对象
  7196. * @return {PxerWorksRequest[]|false} - 解析得到的作品任务对象
  7197. * */
  7198. PxerHtmlParser.parsePage = function (task) {
  7199. if (!(task instanceof PxerPageRequest)) {
  7200. window['PXER_ERROR'] = 'PxerHtmlParser.parsePage: task is not PxerPageRequest';
  7201. return false;
  7202. }
  7203. if (!task.url || !task.html) {
  7204. window['PXER_ERROR'] = 'PxerHtmlParser.parsePage: task illegal';
  7205. return false;
  7206. }
  7207.  
  7208. const parseList = function (elt) {
  7209. return JSON.parse(elt.getAttribute('data-items'))
  7210. .filter(i => !i.isAdContainer) // skip AD
  7211. ;
  7212. };
  7213.  
  7214. var taskList = [];
  7215. switch (task.type) {
  7216. case "userprofile_manga":
  7217. case "userprofile_illust":
  7218. case "userprofile_all":
  7219. var response = JSON.parse(task.html).body
  7220. if (task.type!=="userprofile_illust") {
  7221. for (let elt in response.manga) {
  7222. let tsk = new PxerWorksRequest({
  7223. html: {},
  7224. type: null,
  7225. isMultiple: null,
  7226. id: elt,
  7227. })
  7228. tsk.url = PxerHtmlParser.getUrlList(tsk)
  7229. taskList.push(tsk)
  7230. }
  7231. }
  7232.  
  7233. if (task.type!=="userprofile_manga") {
  7234. for (let elt in response.illusts) {
  7235. var tsk = new PxerWorksRequest({
  7236. html: {},
  7237. type: null,
  7238. isMultiple: null,
  7239. id: elt,
  7240. })
  7241. tsk.url = PxerHtmlParser.getUrlList(tsk)
  7242. taskList.push(tsk)
  7243. }
  7244. }
  7245. break;
  7246.  
  7247. case "bookmark_works":
  7248. var response = JSON.parse(task.html).body
  7249. for (let worki in response.works) {
  7250. let work = response.works[worki];
  7251. let tsk = new PxerWorksRequest({
  7252. html: {},
  7253. type: this.parseIllustType(work.illustType),
  7254. isMultiple: work.pageCount>1,
  7255. id: work.id,
  7256. })
  7257. tsk.url = PxerHtmlParser.getUrlList(tsk)
  7258. taskList.push(tsk)
  7259. }
  7260. break;
  7261. case "member_works":
  7262. var dom = PxerHtmlParser.HTMLParser(task.html);
  7263. var elts = dom.body.querySelectorAll('a.work._work');
  7264. for (let elt of elts) {
  7265. var task = new PxerWorksRequest({
  7266. html: {},
  7267. type: function(elt) {
  7268. switch (true) {
  7269. case elt.matches('.ugoku-illust'): return "ugoira";
  7270. case elt.matches('.manga'): return "manga";
  7271. default: return "illust";
  7272. }
  7273. }(elt),
  7274. isMultiple: elt.matches(".multiple"),
  7275. id: elt.getAttribute('href').match(/illust_id=(\d+)/)[1]
  7276. });
  7277.  
  7278. task.url = PxerHtmlParser.getUrlList(task);
  7279.  
  7280. taskList.push(task);
  7281. };
  7282. break;
  7283. case "rank":
  7284. var data = JSON.parse(task.html);
  7285. for (var task of data['contents']) {
  7286.  
  7287. var task = new PxerWorksRequest({
  7288. html: {},
  7289. type: this.parseIllustType(task['illust_type']),
  7290. isMultiple: task['illust_page_count'] > 1,
  7291. id: task['illust_id'].toString(),
  7292. });
  7293. task.url = PxerHtmlParser.getUrlList(task);
  7294.  
  7295. taskList.push(task);
  7296. };
  7297. break;
  7298. case "discovery":
  7299. var data =JSON.parse(task.html);
  7300. for (var id of data.recommendations) {
  7301. var task = new PxerWorksRequest({
  7302. html: {},
  7303. type: null,
  7304. isMultiple: null,
  7305. id : id.toString(),
  7306. });
  7307. task.url = PxerHtmlParser.getUrlList(task);
  7308.  
  7309. taskList.push(task);
  7310. };
  7311. break;
  7312. case "search":
  7313. var dom = PxerHtmlParser.HTMLParser(task.html);
  7314. var searchData = parseList(dom.body.querySelector("input#js-mount-point-search-result-list"));
  7315. for (var searchItem of searchData) {
  7316. var task = new PxerWorksRequest({
  7317. html: {},
  7318. type: this.parseIllustType(searchItem.illustType),
  7319. isMultiple: searchItem.pageCount > 1,
  7320. id: searchItem.illustId
  7321. });
  7322. task.url = PxerHtmlParser.getUrlList(task);
  7323. taskList.push(task);
  7324. };
  7325. break;
  7326. case "bookmark_new":
  7327. var data = JSON.parse(task.html);
  7328. for (var task of data.body.thumbnails.illust) {
  7329.  
  7330. var task = new PxerWorksRequest({
  7331. html : {},
  7332. type : this.parseIllustType(task.illustType),
  7333. isMultiple: task.pageCount > 1,
  7334. id : task.id,
  7335. });
  7336. task.url = PxerHtmlParser.getUrlList(task);
  7337.  
  7338. taskList.push(task);
  7339. };
  7340. break;
  7341. case "search_spa":
  7342. case "search_tag":
  7343. var response = JSON.parse(task.html).body;
  7344. for (let illust of response.illustManga.data) {
  7345. var tsk = new PxerWorksRequest({
  7346. html: {},
  7347. type: null,
  7348. isMultiple: null,
  7349. id: illust.id,
  7350. });
  7351. tsk.url = PxerHtmlParser.getUrlList(tsk)
  7352. taskList.push(tsk)
  7353. }
  7354. break;
  7355. default:
  7356. const msg = `Unknown PageWorks type ${task.type}`;
  7357. pxer.log(msg);
  7358. throw new Error(msg);
  7359. };
  7360.  
  7361. if (taskList.length<1) {
  7362. window['PXER_ERROR'] = 'PxerHtmlParser.parsePage: result empty';
  7363. return false;
  7364. };
  7365.  
  7366. return taskList;
  7367.  
  7368. };
  7369.  
  7370. /**
  7371. * 解析作品任务对象
  7372. * @param {PxerWorksRequest} task - 抓取后的页码任务对象
  7373. * @return {PxerWorks} - 解析得到的作品任务对象
  7374. * */
  7375. PxerHtmlParser.parseWorks =function(task){
  7376. if(!(task instanceof PxerWorksRequest)){
  7377. window['PXER_ERROR'] ='PxerHtmlParser.parseWorks: task is not PxerWorksRequest';
  7378. return false;
  7379. }
  7380. if(!task.url.every(item=>task.html[item])){
  7381. window['PXER_ERROR'] ='PxerHtmlParser.parseWorks: task illegal';
  7382. return false;
  7383. }
  7384.  
  7385. for(let url in task.html){
  7386. let data ={
  7387. dom :PxerHtmlParser.HTMLParser(task.html[url]),
  7388. task: task,
  7389. };
  7390. try{
  7391. var pw= PxerHtmlParser.parseMediumHtml(data);
  7392. }catch(e){
  7393. pxer.log(`Error in parsing task of`, task);
  7394. pxer.log(e);
  7395. window['PXER_ERROR'] =`${task.id}:${e.message}`;
  7396. if(window['PXER_MODE']==='dev')console.error(task ,e);
  7397. return false;
  7398. }
  7399. };
  7400. return pw;
  7401.  
  7402. };
  7403.  
  7404.  
  7405.  
  7406. /**
  7407. * @param {PxerWorksRequest} task
  7408. * @return {Array}
  7409. * */
  7410. PxerHtmlParser.getUrlList =function(task){
  7411.  
  7412. return ["https://www.pixiv.net/member_illust.php?mode=medium&illust_id="+task.id];
  7413.  
  7414. };
  7415.  
  7416.  
  7417. PxerHtmlParser.parseMediumHtml =function({task,dom}){
  7418. var illustData = JSON.parse(task.html[pxer.URLGetter.illustInfoById(task.id)]).body;
  7419.  
  7420. var pw;
  7421. switch (true) {
  7422. case illustData.illustType===2: pw = new PxerUgoiraWorks(); break;
  7423. case illustData.pageCount>1: pw = new PxerMultipleWorks(); break;
  7424. default: pw = new PxerWorks(); break;
  7425. }
  7426.  
  7427. pw.id = task.id;
  7428. pw.type = this.parseIllustType(illustData.illustType);
  7429. pw.tagList = illustData.tags.tags.map(e=>e.tag);
  7430. pw.viewCount = illustData.viewCount;
  7431. pw.ratedCount = illustData.bookmarkCount;
  7432. if (pw instanceof PxerMultipleWorks) {
  7433. pw.multiple = illustData.pageCount;
  7434. }
  7435.  
  7436.  
  7437. if (pw.type ==="ugoira"){
  7438. var xhr = new XMLHttpRequest();
  7439. xhr.open("GET", "https://www.pixiv.net/ajax/illust/"+ task.id + "/ugoira_meta", false);
  7440. xhr.send();
  7441. var meta = JSON.parse(xhr.responseText);
  7442. let src = meta['body']['originalSrc'];
  7443. let URLObj = parseURL(src);
  7444.  
  7445. pw.domain = URLObj.domain;
  7446. pw.date =src.match(PxerHtmlParser.REGEXP['getDate'])[1];
  7447. pw.frames ={
  7448. framedef:meta['body']['frames'],
  7449. height:illustData.height,
  7450. width:illustData.width,
  7451. };
  7452. } else {
  7453. let src = illustData.urls.original;
  7454. let URLObj = parseURL(src);
  7455.  
  7456. pw.domain = URLObj.domain;
  7457. pw.date = src.match(PxerHtmlParser.REGEXP['getDate'])[1];
  7458. pw.fileFormat =src.match(/\.(jpg|gif|png)$/)[1];
  7459. };
  7460. return pw;
  7461. };
  7462.  
  7463. PxerHtmlParser.parseIllustType =function(type){
  7464. switch (type.toString()) {
  7465. case "0":
  7466. case "illust":
  7467. return "illust";
  7468. case "1":
  7469. case "manga":
  7470. return "manga";
  7471. case "2":
  7472. case "ugoira":
  7473. return "ugoira";
  7474. }
  7475. return null;
  7476. }
  7477.  
  7478. PxerHtmlParser.REGEXP ={
  7479. 'getDate':/img\/((?:\d+\/){5}\d+)/,
  7480. 'getInitData':/\{token:.*\}(?=\);)/
  7481. };
  7482.  
  7483. PxerHtmlParser.HTMLParser =function(aHTMLString){
  7484. var dom =document.implementation.createHTMLDocument('');
  7485. dom.documentElement.innerHTML =aHTMLString;
  7486. return dom;
  7487. };
  7488.  
  7489. /**@param {Element} img*/
  7490. PxerHtmlParser.getImageUrl =function(img){
  7491. return img.getAttribute('src')||img.getAttribute('data-src');
  7492. };
  7493.  
  7494. PxerHtmlParser.parseObjectLiteral = function() {
  7495. // Javascript object literal parser
  7496. // Splits an object literal string into a set of top-level key-value pairs
  7497. // (c) Michael Best (https://github.com/mbest)
  7498. // License: MIT (http://www.opensource.org/licenses/mit-license.php)
  7499. // Version 2.1.0
  7500. // https://github.com/mbest/js-object-literal-parse
  7501. // This parser is inspired by json-sans-eval by Mike Samuel (http://code.google.com/p/json-sans-eval/)
  7502.  
  7503. // These two match strings, either with double quotes or single quotes
  7504. var stringDouble = '"(?:[^"\\\\]|\\\\.)*"',
  7505. stringSingle = "'(?:[^'\\\\]|\\\\.)*'",
  7506. // Matches a regular expression (text enclosed by slashes), but will also match sets of divisions
  7507. // as a regular expression (this is handled by the parsing loop below).
  7508. stringRegexp = '/(?:[^/\\\\]|\\\\.)*/\w*',
  7509. // These characters have special meaning to the parser and must not appear in the middle of a
  7510. // token, except as part of a string.
  7511. specials = ',"\'{}()/:[\\]',
  7512. // Match text (at least two characters) that does not contain any of the above special characters,
  7513. // although some of the special characters are allowed to start it (all but the colon and comma).
  7514. // The text can contain spaces, but leading or trailing spaces are skipped.
  7515. everyThingElse = '[^\\s:,/][^' + specials + ']*[^\\s' + specials + ']',
  7516. // Match any non-space character not matched already. This will match colons and commas, since they're
  7517. // not matched by "everyThingElse", but will also match any other single character that wasn't already
  7518. // matched (for example: in "a: 1, b: 2", each of the non-space characters will be matched by oneNotSpace).
  7519. oneNotSpace = '[^\\s]',
  7520.  
  7521. // Create the actual regular expression by or-ing the above strings. The order is important.
  7522. token = RegExp(stringDouble + '|' + stringSingle + '|' + stringRegexp + '|' + everyThingElse + '|' + oneNotSpace, 'g'),
  7523.  
  7524. // Match end of previous token to determine whether a slash is a division or regex.
  7525. divisionLookBehind = /[\])"'A-Za-z0-9_$]+$/,
  7526. keywordRegexLookBehind = {'in':1,'return':1,'typeof':1};
  7527.  
  7528. function trim(string) {
  7529. return string == null ? '' :
  7530. string.trim ?
  7531. string.trim() :
  7532. string.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
  7533. }
  7534.  
  7535. return function(objectLiteralString) {
  7536. // Trim leading and trailing spaces from the string
  7537. var str = trim(objectLiteralString);
  7538.  
  7539. // Trim braces '{' surrounding the whole object literal
  7540. if (str.charCodeAt(0) === 123)
  7541. str = str.slice(1, -1);
  7542.  
  7543. // Split into tokens
  7544. var result = [],
  7545. toks = str.match(token),
  7546. key, values = [], depth = 0;
  7547.  
  7548. if (toks) {
  7549. // Append a comma so that we don't need a separate code block to deal with the last item
  7550. toks.push(',');
  7551.  
  7552. for (var i = 0, tok; tok = toks[i]; ++i) {
  7553. var c = tok.charCodeAt(0);
  7554. // A comma signals the end of a key/value pair if depth is zero
  7555. if (c === 44) { // ","
  7556. if (depth <= 0) {
  7557. if (!key && values.length === 1) {
  7558. key = values.pop();
  7559. }
  7560. result.push([key, values.length ? values.join('') : undefined]);
  7561. key = undefined;
  7562. values = [];
  7563. depth = 0;
  7564. continue;
  7565. }
  7566. // Simply skip the colon that separates the name and value
  7567. } else if (c === 58) { // ":"
  7568. if (!depth && !key && values.length === 1) {
  7569. key = values.pop();
  7570. continue;
  7571. }
  7572. // A set of slashes is initially matched as a regular expression, but could be division
  7573. } else if (c === 47 && i && tok.length > 1) { // "/"
  7574. // Look at the end of the previous token to determine if the slash is actually division
  7575. var match = toks[i-1].match(divisionLookBehind);
  7576. if (match && !keywordRegexLookBehind[match[0]]) {
  7577. // The slash is actually a division punctuator; re-parse the remainder of the string (not including the slash)
  7578. str = str.substr(str.indexOf(tok) + 1);
  7579. toks = str.match(token);
  7580. toks.push(',');
  7581. i = -1;
  7582. // Continue with just the slash
  7583. tok = '/';
  7584. }
  7585. // Increment depth for parentheses, braces, and brackets so that interior commas are ignored
  7586. } else if (c === 40 || c === 123 || c === 91) { // '(', '{', '['
  7587. ++depth;
  7588. } else if (c === 41 || c === 125 || c === 93) { // ')', '}', ']'
  7589. --depth;
  7590. // The key will be the first token; if it's a string, trim the quotes
  7591. } else if (!key && !values.length && (c === 34 || c === 39)) { // '"', "'"
  7592. tok = tok.slice(1, -1);
  7593. }
  7594. values.push(tok);
  7595. }
  7596. }
  7597. return result;
  7598. }
  7599. }()
  7600.  
  7601. PxerHtmlParser.getKeyFromStringObjectLiteral =function(s, key) {
  7602. var resolvedpairs = this.parseObjectLiteral(s);
  7603. for (var pair of resolvedpairs) {
  7604. if (pair[0] ===key) return pair[1];
  7605. }
  7606. return false;
  7607. };
  7608.  
  7609. pxer.URLGetter = {
  7610. illustInfoById(id) {
  7611. return 'https://www.pixiv.net/ajax/illust/' + id;
  7612. },
  7613. search({ url = document.URL, page = 0 } = {}){
  7614. const defaultQueryString = 's_mode=s_tag_full';
  7615. const queryString = url.split('?')[1];
  7616. const query = new URLSearchParams(queryString);
  7617. const tagsMatch = url.match(pxer.regexp.parseKeyword);
  7618.  
  7619. let word = null;
  7620. if (tagsMatch) {
  7621. word = tagsMatch[1];
  7622. } else {
  7623. word = encodeURIComponent(query.get('word'));
  7624. }
  7625.  
  7626. return `https://www.pixiv.net/ajax/search/artworks/${word}?${defaultQueryString}&${queryString}&p=${page + 1}`;
  7627. },
  7628. bookmarkNew({ page = 0 }) {
  7629. return "https://www.pixiv.net/ajax/follow_latest/illust?mode=all&lang=zh&p=" + (page + 1)
  7630. },
  7631. };
  7632.  
  7633. ;
  7634.  
  7635.  
  7636. // src/app/PxerPrinter.js
  7637. class PxerPrinter{
  7638. constructor(config){
  7639.  
  7640. /**
  7641. * 计算得到的下载地址
  7642. * @type {string[]}
  7643. * */
  7644. this.address =[];
  7645. /**计算得到的任务信息*/
  7646. this.taskInfo ='';
  7647. /**剥离的动图参数*/
  7648. this.ugoiraFrames ={};
  7649.  
  7650. /**配置信息*/
  7651. this.config =PxerPrinter.defaultConfig();
  7652. config &&this.setConfig(config);
  7653.  
  7654. };
  7655.  
  7656. /**
  7657. * 设置配置信息
  7658. * @param {string|Object} key - 要设置的key或是一个将被遍历合并的对象
  7659. * @param {string} [value] - 要设置的value
  7660. * */
  7661. setConfig(key ,value){
  7662. if(arguments.length ===1 && typeof key ==='object'){
  7663. let obj =key;
  7664. for(let objKey in obj){
  7665. if(objKey in this.config) this.config[objKey] =obj[objKey];
  7666. else console.warn(`PxerPrinter.setConfig: skip key "${objKey}"`);
  7667. };
  7668. }else{
  7669. if(!(key in this.config)) throw new Error(`PxerPrinter.setConfig: ${key} is not in config`);
  7670. this.config[key]=value;
  7671. }
  7672. return this;
  7673. };
  7674. };
  7675.  
  7676. /**
  7677. * 根据作品列表将下载地址填充到PxerPrinter#address
  7678. * @param {PxerWorks[]} worksList
  7679. * @return {void}
  7680. * */
  7681. PxerPrinter.prototype['fillAddress'] =function(worksList){
  7682. for(let works of worksList){
  7683. let configKey =PxerPrinter.getWorksKey(works);
  7684. if(configKey==='ugoira_zip' &&this.config['ugoira_frames']==='yes'){
  7685. this.ugoiraFrames[works.id] =works.frames
  7686. }
  7687. if(!(configKey in this.config)) throw new Error(`PxerPrinter.fillAddress: ${configKey} in not in config`);
  7688. if(this.config[configKey]==='no') continue;
  7689. this.address.push(...PxerPrinter.countAddress(works,this.config[configKey]));
  7690. }
  7691. };
  7692.  
  7693. /**
  7694. * 根据作品将可读的下载信息填充到PxerPrinter#taskInfo
  7695. * @param {PxerWorks[]} worksList
  7696. * @return {void}
  7697. * */
  7698. PxerPrinter.prototype['fillTaskInfo'] =function(worksList){
  7699. var [manga,ugoira,illust,multiple,single,worksNum,address] =new Array(20).fill(0);
  7700. for(let works of worksList){
  7701. let configKey =PxerPrinter.getWorksKey(works);
  7702. if(this.config[configKey]==='no') continue;
  7703.  
  7704. worksNum++;
  7705.  
  7706. switch(works.type){
  7707. case 'manga':
  7708. manga++;
  7709. break;
  7710. case 'ugoira':
  7711. ugoira++;
  7712. break;
  7713. case 'illust':
  7714. illust++;
  7715. break;
  7716. default:
  7717. console.error(works);
  7718. throw new Error(`PxerPrinter.fillTaskInfo: works.type illegal`);
  7719. break;
  7720. };
  7721.  
  7722. if(works.isMultiple){
  7723. multiple++;
  7724. address +=works.multiple;
  7725. }else{
  7726. address++;
  7727. single++;
  7728. }
  7729. }
  7730.  
  7731.  
  7732. this.taskInfo =eval(pxer.t('phrase.taskInfo'));
  7733. };
  7734. /**
  7735. * 将结果输出
  7736. * 确保下载地址和任务信息已被填充
  7737. * */
  7738. PxerPrinter.prototype['print'] =function(){
  7739.  
  7740. /**判断输出动图参数*/
  7741. if((this.config['ugoira_frames'] ==="yes")&&(Object.keys(this.ugoiraFrames).length !==0)){
  7742. let win =window.open(document.URL ,'_blank');
  7743. if(!win){
  7744. alert(pxer.t('phrase.blockOpen'));
  7745. return;
  7746. };
  7747.  
  7748. var scriptname="";
  7749. switch (navigator.platform) {
  7750. case "Win32":scriptname="bat批处理"; break;
  7751. default:scriptname="bash"; break;
  7752. }
  7753. let str =[
  7754. '<p>/** 这个页面是自动生成的使用FFmpeg自行合成动图的'+scriptname+'脚本,详细使用教程见<a href="http://pxer.pea3nut.org/md/ugoira_concat" target="_blank" >http://pxer.pea3nut.org/md/ugoira_concat</a> */</p>',
  7755. '<textarea style="height:100%; width:100%" readonly>',
  7756. ...this.generateUgoiraScript(this.ugoiraFrames),
  7757. '</textarea>',
  7758. ];
  7759. win.document.write(str.join('\n'));
  7760. };
  7761.  
  7762. {/**输出下载地址*/
  7763. let win = window.open(document.URL ,'_blank');
  7764. if(!win){
  7765. alert(pxer.t('phrase.blockOpen'));
  7766. return;
  7767. };
  7768. let str = [
  7769. `<p>${pxer.t('phrase.pointPage')}</p>`,
  7770. `<p>${this.taskInfo}</p>`,
  7771. '<textarea style="height:100%; width:100%" readonly>' ,
  7772. this.address.join('\n') ,
  7773. '</textarea>' ,
  7774. ];
  7775. win.document.write(str.join('\n'));
  7776. }
  7777.  
  7778.  
  7779. };
  7780.  
  7781. /**
  7782. * 根据作品类型,生成配置信息的key
  7783. * @param {PxerWorks} works
  7784. * @return {string}
  7785. * @see PxerPrinter.defaultConfig
  7786. * */
  7787. PxerPrinter.getWorksKey =function(works){
  7788. var configKey =null;
  7789. if(works.type === 'ugoira'){
  7790. configKey ='ugoira_zip';
  7791. }else{
  7792. configKey =works.type+(
  7793. works.isMultiple
  7794. ?'_multiple'
  7795. :'_single'
  7796. );
  7797. };
  7798. return configKey;
  7799. };
  7800.  
  7801. /**
  7802. * 根据动图参数,生成ffmpeg脚本
  7803. * @param 动图参数
  7804. * @return {String[]} 生成的脚本行
  7805. * @see PxerPrinter.prototype['print']
  7806. */
  7807. PxerPrinter.prototype['generateUgoiraScript'] =function(frames) {
  7808. var lines=[];
  7809. var resstring;
  7810. var ffmpeg;
  7811. var isWindows = ['Win32', 'Win64', 'Windows', 'WinCE'].indexOf(navigator.platform)!==-1;
  7812. switch (this.config.ugoira_zip) {
  7813. case "max": resstring = "1920x1080"; break;
  7814. case "600p": resstring = "600x338"; break;
  7815. }
  7816. var slashstr = "";
  7817. if (isWindows) {
  7818. slashstr="^";
  7819. ffmpeg="ffmpeg";
  7820. lines.push("@echo off");
  7821. lines.push("set /p ext=请输入输出文件扩展名(mp4/gif/...):");
  7822. } else {
  7823. slashstr="\\";
  7824. ffmpeg="$ffmpeg";
  7825. lines.push("#!/bin/bash");
  7826. lines.push("");
  7827. lines.push("{ hash ffmpeg 2>/dev/null && ffmpeg=ffmpeg;} || { [ -x ./ffmpeg ] && ffmpeg=./ffmpeg;} || { echo >&2 \"Failed to locate ffmpeg executable. Aborting.\"; exit 1;}");
  7828. lines.push("read -p '请输入输出文件扩展名(mp4/gif/...):' ext");
  7829. }
  7830. for (let key in frames) {
  7831. var foldername = key + "_ugoira" + resstring;
  7832. var confpath = foldername + "/config.txt";
  7833. var height = frames[key].height;
  7834. var width = frames[key].width;
  7835. if (this.config.ugoira_zip==="600p") {
  7836. var scale = Math.max(height, width)/600;
  7837. height = parseInt(height/scale);
  7838. width = parseInt(width/scale);
  7839. }
  7840. lines.push(isWindows?("del "+ foldername + "\\config.txt >nul 2>nul"):("rm "+ foldername + "/config.txt &> /dev/null"));
  7841. for (let frame of frames[key].framedef) {
  7842. lines.push("echo file "+slashstr+"'" + frame['file']+ slashstr +"' >> "+confpath);
  7843. lines.push("echo duration " + frame['delay']/1000 + " >> "+ confpath);
  7844. }
  7845. lines.push("echo file "+ slashstr + "'" +frames[key].framedef[frames[key].framedef.length-1]['file'] + slashstr + "' >> "+confpath);
  7846. lines.push(isWindows? "if %ext%==gif (":"if [ $ext == \"gif\"]; then");
  7847. lines.push(ffmpeg+" -f concat -i "+confpath+" -vf palettegen "+foldername+"/palette.png");
  7848. lines.push(ffmpeg+" -f concat -i "+confpath+" -i "+foldername+"/palette.png -lavfi paletteuse -framerate 30 -vsync -1 -s "+width+"x"+height+" "+foldername+"/remux." + (isWindows? "%ext%":"$ext"));
  7849. lines.push(isWindows? ") else (":"else");
  7850. lines.push(ffmpeg+" -f concat -i "+confpath+" -framerate 30 -vsync -1 -s "+width+"x"+height+" "+foldername+"/remux." + (isWindows? "%ext%":"$ext"));
  7851. lines.push(isWindows? ")":"fi");
  7852. }
  7853. if (isWindows) {
  7854. lines.push("echo 完成 & pause");
  7855. } else {
  7856. lines.push("read -n 1 -p \"完成,按任意键退出\" m && echo");
  7857. }
  7858. return lines;
  7859. }
  7860.  
  7861. /**返回默认的配置对象*/
  7862. PxerPrinter.defaultConfig =function(){
  7863. return{
  7864. "manga_single" :"max",//[max|600p|no]
  7865. "manga_multiple" :"max",//[max|1200p|cover_600p|no]
  7866. "illust_single" :"max",//[max|600p|no]
  7867. "illust_multiple" :"max",//[max|1200p|cover_600p|no]
  7868. "ugoira_zip" :"no",//[max|600p|no]
  7869. "ugoira_frames" :"no",//[yes|no]
  7870. };
  7871. };
  7872. /**作品页跳过过滤 */
  7873. PxerPrinter.printAllConfig =function(){
  7874. return{
  7875. "manga_single" :"max",//[max|600p|no]
  7876. "manga_multiple" :"max",//[max|1200p|cover_600p|no]
  7877. "illust_single" :"max",//[max|600p|no]
  7878. "illust_multiple" :"max",//[max|1200p|cover_600p|no]
  7879. "ugoira_zip" :"max",//[max|600p|no]
  7880. "ugoira_frames" :"yes",//[yes|no]
  7881. };
  7882. }
  7883.  
  7884.  
  7885.  
  7886.  
  7887.  
  7888.  
  7889. /**
  7890. * 拼装动图原始地址
  7891. * @param {PxerUgoiraWorks} works - 作品
  7892. * @param {string} [type] - 拼装类型 [max|600p]
  7893. * @return {Array}
  7894. * */
  7895. PxerPrinter.getUgoira =function(works ,type='max'){
  7896. const tpl ={
  7897. "max" :"https://#domain#/img-zip-ugoira/img/#date#/#id#_ugoira1920x1080.zip",
  7898. "600p" :"https://#domain#/img-zip-ugoira/img/#date#/#id#_ugoira600x600.zip",
  7899. };
  7900.  
  7901. var address =tpl[type];
  7902. if(!address) throw new Error(`PxerPrint.getUgoira: unknown type "${type}"`);
  7903.  
  7904. for(let key in works){
  7905. address =address.replace(`#${key}#` ,works[key]);
  7906. };
  7907.  
  7908. return [address];
  7909.  
  7910. };
  7911. /**
  7912. * 拼装多副原始地址
  7913. * @param {PxerMultipleWorks} works - 作品
  7914. * @param {string} [type] - 拼装类型 [max|1200p|cover_600p]
  7915. * @return {Array}
  7916. * */
  7917. PxerPrinter.getMultiple =function(works ,type='max'){
  7918. const tpl ={
  7919. "max" :"https://#domain#/img-original/img/#date#/#id#_p#index#.#fileFormat#",
  7920. "1200p" :"https://#domain#/c/1200x1200/img-master/img/#date#/#id#_p#index#_master1200.jpg",
  7921. "cover_600p" :"https://#domain#/c/600x600/img-master/img/#date#/#id#_p0_master1200.jpg",
  7922. };
  7923.  
  7924. var address =tpl[type];
  7925. if(!address) throw new Error(`PxerPrint.getMultiple: unknown type "${type}"`);
  7926.  
  7927. for(let key in works){
  7928. address =address.replace(`#${key}#` ,works[key]);
  7929. };
  7930.  
  7931. //渲染多张
  7932. var addressList =[];
  7933. for(let i=0 ;i<works.multiple ;i++){
  7934. addressList.push(address.replace('#index#' ,i));
  7935. };
  7936.  
  7937. return addressList;
  7938.  
  7939. };
  7940. /**
  7941. * 拼装单副原始地址
  7942. * @param {PxerWorks} works - 作品
  7943. * @param {string=max} [type] - 拼装类型 [max|600p]
  7944. * @return {Array}
  7945. * */
  7946. PxerPrinter.getWorks =function (works ,type='max'){
  7947. const tpl ={
  7948. "max" :"https://#domain#/img-original/img/#date#/#id#_p0.#fileFormat#",
  7949. "600p" :"https://#domain#/c/600x600/img-master/img/#date#/#id#_p0_master1200.jpg",
  7950. };
  7951.  
  7952. var address =tpl[type];
  7953. if(!address) throw new Error(`PxerPrint.getWorks: unknown type "${type}"`);
  7954.  
  7955. for(let key in works){
  7956. address =address.replace(`#${key}#` ,works[key]);
  7957. }
  7958.  
  7959. return [address];
  7960.  
  7961. };
  7962. /**
  7963. * 智能拼装原始地址,对上述的简单封装
  7964. * @param {PxerWorks} [works]
  7965. * @param {...arguments} [argn]
  7966. * @return {Array}
  7967. * */
  7968. PxerPrinter.countAddress =function(works,argn){
  7969. switch(true){
  7970. case works.type === 'ugoira':
  7971. return PxerPrinter.getUgoira(...arguments);
  7972. case works.isMultiple:
  7973. return PxerPrinter.getMultiple(...arguments);
  7974. default:
  7975. return PxerPrinter.getWorks(...arguments);
  7976. };
  7977. };
  7978.  
  7979. ;
  7980.  
  7981.  
  7982. // src/app/PxerThread.js
  7983. class PxerThread extends PxerEvent{
  7984. /**
  7985. * @param id {string} 线程的ID,便于调试
  7986. * @param {Object} config 线程的配置信息
  7987. * */
  7988. constructor({id ,config}={}){
  7989. super(['load','error','fail']);
  7990. /**当前线程的ID*/
  7991. this.id =id;
  7992. /**
  7993. * 当前线程的状态
  7994. * - free
  7995. * - ready
  7996. * - error
  7997. * - fail
  7998. * - running
  7999. * */
  8000. this.state='free';
  8001. /**线程执行的任务*/
  8002. this.task =null;
  8003.  
  8004. /**
  8005. *
  8006. * */
  8007. this.config =config ||{
  8008. /**ajax超时重试时间*/
  8009. timeout:8000,
  8010. /**最多重试次数*/
  8011. retry:5,
  8012. };
  8013.  
  8014. /**运行时参数*/
  8015. this.runtime ={};
  8016.  
  8017. /**使用的xhr对象*/
  8018. this.xhr =null;
  8019.  
  8020. };
  8021. };
  8022.  
  8023. /**
  8024. * 对抓取到的URL和HTML进行校验
  8025. * @param {string} url
  8026. * @param {string} html
  8027. * @return {string|true} 返回字符串表示失败
  8028. * */
  8029. PxerThread.checkRequest =function(url ,html){
  8030. if(!html) return 'empty';
  8031. if(html.indexOf("_no-item _error") !==-1){
  8032. if(html.indexOf("sprites-r-18g-badge") !==-1) return 'r-18g';
  8033. if(html.indexOf("sprites-r-18-badge") !==-1) return 'r-18';
  8034. };
  8035. if(html.indexOf("sprites-mypixiv-badge") !==-1) return 'mypixiv';
  8036. return true;
  8037. };
  8038.  
  8039. /**终止线程的执行*/
  8040. PxerThread.prototype['stop'] =function(){
  8041. this.xhr.abort();
  8042. };
  8043.  
  8044. /**
  8045. * 初始化线程
  8046. * @param {PxerRequest} task
  8047. * */
  8048. PxerThread.prototype['init'] =function(task){
  8049. this.task=task;
  8050.  
  8051. this.runtime ={};
  8052. this.state ='ready';
  8053.  
  8054. // 必要的检查
  8055. if(Number.isNaN(+this.config.timeout)||Number.isNaN(+this.config.retry)){
  8056. throw new Error(`PxerThread#init: ${this.id} config illegal`);
  8057. }
  8058.  
  8059. //判断行为,读取要请求的URL
  8060. if(this.task instanceof PxerWorksRequest){
  8061. this.runtime.urlList =this.task.url.slice();
  8062. this.runtime.urlList.push(pxer.URLGetter.illustInfoById(this.task.id));
  8063. }else if(this.task instanceof PxerPageRequest){
  8064. this.runtime.urlList =[this.task.url];
  8065. }else{
  8066. this.dispatch('error' ,`PxerThread#${this.id}.init: unknown task`);
  8067. return false;
  8068. };
  8069.  
  8070. };
  8071.  
  8072. /**
  8073. * 使用PxerThread#xhr发送请求
  8074. * @param {string} url
  8075. * */
  8076. PxerThread.prototype['sendRequest'] =function(url){
  8077. this.state ='running';
  8078. this.xhr.open('GET' ,url ,true);
  8079. // 单副漫画请求需要更改Referer头信息
  8080. if(
  8081. this.task instanceof PxerWorksRequest
  8082. && this.task.type ==='manga'
  8083. && this.task.isMultiple===false
  8084. && /mode=big/.test(url)
  8085. ){
  8086. var referer =this.task.url.find(item=>item.indexOf('mode=medium')!==-1);
  8087. var origin =document.URL;
  8088. if(!referer){
  8089. this.dispatch('error','PxerThread.sendRequest: cannot find referer');
  8090. };
  8091. history.replaceState({} ,null ,referer);
  8092. this.xhr.send();
  8093. history.replaceState({} ,null ,origin);
  8094. }else{
  8095. this.xhr.send();
  8096. };
  8097. };
  8098. /**运行线程*/
  8099. PxerThread.prototype['run'] =function _self(){
  8100. const URL =this.runtime.urlList.shift();
  8101. if(!URL){
  8102. this.state ='free';
  8103. this.task.completed =true;
  8104. this.dispatch("load" ,this.task);
  8105. return true;
  8106. }
  8107.  
  8108. const XHR =new XMLHttpRequest();
  8109.  
  8110. this.xhr =XHR;
  8111. XHR.timeout =this.config.timeout;
  8112. XHR.responseType ='text';
  8113.  
  8114.  
  8115. var retry=0;
  8116. XHR.addEventListener('timeout',()=>{
  8117. if(++retry > this.config.retry){
  8118. this.state ='fail';
  8119. this.dispatch('fail' ,new PxerFailInfo({
  8120. task :this.task,
  8121. url :URL,
  8122. type :'timeout',
  8123. xhr :XHR,
  8124. }));
  8125. return false;
  8126. }else{
  8127. this.sendRequest(URL);
  8128. }
  8129. });
  8130. XHR.addEventListener("load" ,()=>{
  8131. if(XHR.status.toString()[0]!=='2' &&XHR.status!==304){
  8132. this.state ='fail';
  8133. this.dispatch('fail' ,new PxerFailInfo({
  8134. task :this.task,
  8135. url :URL,
  8136. type :'http:'+XHR.status,
  8137. }));
  8138. return false;
  8139. };
  8140. // 判断是否真的请求成功
  8141. var msg =PxerThread.checkRequest(URL ,XHR.responseText);
  8142. if(msg !==true){
  8143. this.state ='fail';
  8144. this.dispatch('fail' ,{
  8145. task :this.task,
  8146. url :URL,
  8147. type :msg,
  8148. });
  8149. return false;
  8150. };
  8151.  
  8152. // 执行成功回调
  8153. if(this.task instanceof PxerWorksRequest){
  8154. this.task.html[URL] =XHR.responseText;
  8155. }else{
  8156. this.task.html =XHR.responseText;
  8157. };
  8158. _self.call(this);//递归
  8159. return true;
  8160. });
  8161. XHR.addEventListener("error" ,()=>{
  8162. this.state ='error';
  8163. this.dispatch('error' ,{
  8164. task :this.task,
  8165. url :URL,
  8166. });
  8167. });
  8168.  
  8169. this.sendRequest(URL);
  8170.  
  8171. };
  8172.  
  8173.  
  8174. ;
  8175.  
  8176.  
  8177. // src/app/PxerThreadManager.js
  8178. class PxerThreadManager extends PxerEvent{
  8179. /**
  8180. * @param {number} timeout - 超时时间
  8181. * @param {number} retry - 重试次数
  8182. * @param {number} thread - 线程数
  8183. * */
  8184. constructor({timeout=5000,retry=3,thread=8}={}){
  8185. super(['load' ,'error' ,'fail' ,'warn']);
  8186.  
  8187. this.config ={timeout,retry,thread};
  8188.  
  8189. /**
  8190. * 任务列表
  8191. * @type {PxerRequest[]}
  8192. * */
  8193. this.taskList =[];
  8194. /**执行的任务列表的指针,指派了下一条要执行的任务*/
  8195. this.pointer =0;
  8196. /**
  8197. * 存放的线程对象
  8198. * @type {PxerThread[]}
  8199. * */
  8200. this.threads =[];
  8201. /**
  8202. * 每当执行任务开始前调用的中间件
  8203. * @type {Function[]} 返回true继续执行,false终止执行
  8204. * */
  8205. this.middleware =[function(task){
  8206. return !!task;
  8207. }];
  8208.  
  8209. /**运行时用到的变量*/
  8210. this.runtime ={};
  8211.  
  8212. };
  8213. };
  8214.  
  8215. /**
  8216. * 停止线程的执行,实际上假装任务都执行完了
  8217. * 停止后还会触发load事件,需要一段时间
  8218. * */
  8219. PxerThreadManager.prototype['stop'] =function(){
  8220. this.pointer =this.taskList.length+1;
  8221. };
  8222.  
  8223. /**
  8224. * 初始化线程管理器
  8225. * @param {PxerRequest[]} taskList
  8226. * */
  8227. PxerThreadManager.prototype['init'] =function(taskList){
  8228. if(! this.taskList.every(request=>request instanceof PxerRequest)){
  8229. this.dispatch('error' ,'PxerThreadManager.init: taskList is illegal');
  8230. return false;
  8231. }
  8232.  
  8233.  
  8234. // 初始任务与结果
  8235. this.taskList=taskList;
  8236. this.runtime ={};
  8237. this.pointer =0;
  8238.  
  8239. // 建立线程对象
  8240. this.threads =[];
  8241. for(let i=0 ;i<this.config.thread ;i++){
  8242. this.threads.push(new PxerThread({
  8243. id:i,
  8244. config:{
  8245. timeout :this.config.timeout,
  8246. retry :this.config.retry,
  8247. },
  8248. }));
  8249. };
  8250.  
  8251. return this;
  8252. };
  8253. /**
  8254. * 运行线程管理器
  8255. * */
  8256. PxerThreadManager.prototype['run'] =function(){
  8257. if(this.taskList.length ===0){
  8258. this.dispatch('warn','PxerApp#run: taskList.length is 0');
  8259. this.dispatch('load',[]);
  8260. return false;
  8261. };
  8262.  
  8263.  
  8264.  
  8265. for(let thread of this.threads){
  8266.  
  8267. thread.on('load' ,data=>{
  8268. next(this,thread);
  8269. });
  8270. thread.on('fail' ,(pfi)=>{
  8271. this.dispatch('fail',pfi);
  8272. next(this,thread);
  8273. });
  8274. thread.on('error' ,this.dispatch.bind(this ,'error'));
  8275.  
  8276.  
  8277. next(this,thread);
  8278.  
  8279. };
  8280.  
  8281. function next(ptm ,thread){
  8282. if(ptm.middleware.every(fn=>fn(ptm.taskList[ptm.pointer]))){
  8283. thread.init(ptm.taskList[ptm.pointer++]);
  8284. thread.run();
  8285. }else if(ptm.threads.every(thread=>['free','fail','error'].indexOf(thread.state)!==-1)){
  8286. ptm.dispatch('load' ,ptm.taskList);
  8287. };
  8288. }
  8289.  
  8290. };
  8291.  
  8292.  
  8293.  
  8294.  
  8295.  
  8296.  
  8297.  
  8298.  
  8299.  
  8300.  
  8301.  
  8302. ;
  8303.  
  8304.  
  8305. // src/app/PxerApp.js
  8306. 'use strict';
  8307.  
  8308. /**
  8309. * Pxer主程序对象,与所有模块都是强耦合关系
  8310. * 若你想阅读源码,建议不要从这个类开始
  8311. * @class
  8312. * */
  8313. class PxerApp extends PxerEvent{
  8314. constructor(){
  8315. /**
  8316. * 可能被触发的事件
  8317. * - stop 被终止时
  8318. * - error 出错时
  8319. * - executeWroksTask 执行作品抓取时
  8320. * - finishWorksTask 完成作品抓取时
  8321. * - executePageTask 执行页码抓取时
  8322. * - finishPageTask 完成页码抓取时
  8323. * - finishTask 完成所有任务
  8324. * */
  8325. super([
  8326. 'executeWroksTask','executePageTask',
  8327. 'finishWorksTask','finishPageTask',
  8328. 'error','stop',
  8329. ]);
  8330.  
  8331. /**
  8332. * 当前页面类型。可能的值
  8333. * @type {string}
  8334. * */
  8335. this.pageType = getPageType(document);
  8336. /**
  8337. * 页面的作品数量
  8338. * @type {number|null}
  8339. * @see PxerApp.init
  8340. * */
  8341. this.worksNum =null;
  8342.  
  8343.  
  8344. /**
  8345. * 任务队列
  8346. * @type {PxerRequest[]}
  8347. * */
  8348. this.taskList=[];
  8349. /**
  8350. * 失败的任务信息
  8351. * @type {PxerFailInfo[]}
  8352. * */
  8353. this.failList=[];
  8354. /**
  8355. * 抓取到的结果集
  8356. * @type {PxerWorks[]}
  8357. * */
  8358. this.resultSet=[];
  8359. /**
  8360. * 过滤得到的结果集
  8361. * @type {PxerWorks[]}
  8362. * */
  8363. this.filterResult=[];
  8364.  
  8365. /**
  8366. * 任务配置选项,用来指派任务执行过程中的一些逻辑
  8367. * 必须在PxerApp#initPageTask调用前配置
  8368. * */
  8369. this.taskOption={
  8370. /**仅抓取前几副作品*/
  8371. limit :null,
  8372. /**遇到id为x的作品停止后续,不包括本id*/
  8373. stopId :null,
  8374. };
  8375.  
  8376. // 其他对象的配置参数
  8377. this.ptmConfig ={//PxerThreadManager
  8378. timeout:5000,
  8379. retry:3,
  8380. thread:8,
  8381. };
  8382. this.ppConfig =this.pageType.startsWith("works_")? PxerPrinter.printAllConfig() : PxerPrinter.defaultConfig();//PxerPrinter
  8383. this.pfConfig =PxerFilter.defaultConfig();//PxerFilter
  8384.  
  8385. // 使用的PxerThreadManager实例
  8386. this.ptm =null;
  8387.  
  8388. pxer.app = this;
  8389. };
  8390.  
  8391. static canCrawl(doc = document) { return ['search', 'search_spa', 'search_tag', 'works_medium', 'rank', 'bookmark_new', 'discovery', 'bookmark_works', 'member_works_new'].includes(pxer.util.getPageType(doc)); }
  8392.  
  8393. /**
  8394. * 初始化时的耗时任务
  8395. */
  8396. async init(){
  8397. this.worksNum = await PxerApp.getWorksNum(document);
  8398. }
  8399.  
  8400. /**
  8401. * 停止执行当前任务
  8402. * 调用后仍会触发对应的finish*事件
  8403. * */
  8404. stop(){
  8405. this.dispatch('stop');
  8406. this.ptm.stop();
  8407. };
  8408.  
  8409. /**初始化批量任务*/
  8410. initPageTask(){
  8411. if(typeof this.pageType !=='string' || typeof this.worksNum!=='number'){
  8412. this.dispatch('error','PxerApp.initPageTask: pageType or number illegal');
  8413. return false;
  8414. };
  8415.  
  8416. let onePageWorksNumber = getOnePageWorkCount(this.pageType);
  8417.  
  8418. var pageNum =Math.ceil(
  8419. this.taskOption.limit
  8420. ? this.taskOption.limit
  8421. : this.worksNum
  8422. )/onePageWorksNumber;
  8423.  
  8424. if (this.pageType==="discovery") {
  8425. var mode;
  8426. switch (true) {
  8427. case document.URL.match(/mode=(r18|safe|all)/)===null: mode = "all"; break;
  8428. default: mode = document.URL.match(/mode=(r18|safe|all)/)[1]; break;
  8429. }
  8430. var recomCount = (this.taskOption.limit? this.taskOption.limit: this.worksNum);
  8431. this.taskList.push(new PxerPageRequest({
  8432. url : `https://www.pixiv.net/rpc/recommender.php?type=illust&sample_illusts=auto&num_recommendations=${recomCount}&page=discovery&mode=${mode}&tt=${pixiv.context.token}`,
  8433. type:this.pageType,
  8434. }));
  8435. } else if (this.pageType==="member_works_new"){
  8436. var uid = getIDfromURL()
  8437. var type = document.URL.match(/type=(\w+)/)?document.URL.match(/type=(\w+)/)[1]:"all"
  8438. this.taskList.push(new PxerPageRequest({
  8439. url: `https://www.pixiv.net/ajax/user/${uid}/profile/all`,
  8440. type: type?`userprofile_${type}`:"userprofile_all",
  8441. }))
  8442. } else if (this.pageType==="bookmark_works"){
  8443. const queryInfo = new URLSearchParams(location.search);
  8444. for (let offset =0;offset<48*pageNum;offset+=48) {
  8445. let id = getIDfromURL() || getIDfromURL("id", document.querySelector("a.user-name").getAttribute("href")) // old bookmark page
  8446. this.taskList.push(new PxerPageRequest({
  8447. type:this.pageType,
  8448. url: `https://www.pixiv.net/ajax/user/${id}/illusts/bookmarks?tag=&offset=${offset}&limit=48&rest=${queryInfo.get('rest') || 'show'}`
  8449. }))
  8450. }
  8451. } else if (['search_spa', 'search_tag'].includes(this.pageType)){
  8452. for (let page = 0; page < pageNum; page++) {
  8453. this.taskList.push(new PxerPageRequest({
  8454. url: pxer.URLGetter.search({ page }),
  8455. type: this.pageType,
  8456. }));
  8457. }
  8458. } else if (this.pageType === 'bookmark_new'){
  8459. for (let page = 0; page < pageNum; page++) {
  8460. this.taskList.push(new PxerPageRequest({
  8461. url: pxer.URLGetter.bookmarkNew({ page }),
  8462. type: this.pageType,
  8463. }));
  8464. }
  8465. } else {
  8466. var separator =document.URL.includes("?")?"&":"?";
  8467. var extraparam = this.pageType==='rank'? "&format=json" : "";
  8468. for(var i=0 ;i<pageNum ;i++){
  8469. this.taskList.push(new PxerPageRequest({
  8470. type:this.pageType,
  8471. url :document.URL+separator+"p="+(i+1)+extraparam,
  8472. }));
  8473. };
  8474. };
  8475. };
  8476. /**抓取页码*/
  8477. executePageTask(){
  8478. if(this.taskList.length ===0){
  8479. this.dispatch('error','PxerApp.executePageTask: taskList is empty');
  8480. return false;
  8481. };
  8482. if(! this.taskList.every(request=>request instanceof PxerPageRequest)){
  8483. this.dispatch('error' ,'PxerApp.executePageTask: taskList is illegal');
  8484. return false;
  8485. };
  8486.  
  8487. this.dispatch('executePageTask');
  8488.  
  8489. var ptm =this.ptm =new PxerThreadManager(this.ptmConfig);
  8490. ptm.on('error' ,(...argn)=>this.dispatch('error',argn));
  8491. ptm.on('warn' ,(...argn)=>this.dispatch('error',argn));
  8492. ptm.on('load',()=>{
  8493. var parseResult =[];
  8494. for(let result of this.taskList){
  8495. result =PxerHtmlParser.parsePage(result);
  8496. if(!result){
  8497. this.dispatch('error',window['PXER_ERROR']);
  8498. continue;
  8499. }
  8500. parseResult.push(...result);
  8501. };
  8502. this.resultSet =parseResult;
  8503. this.dispatch('finishPageTask' ,parseResult);
  8504. });
  8505. ptm.on('fail',(pfi)=>{
  8506. ptm.pointer--;//失败就不停的尝试
  8507. });
  8508. ptm.init(this.taskList);
  8509. ptm.run();
  8510.  
  8511. };
  8512. /**
  8513. * 抓取作品
  8514. * @param {PxerWorksRequest[]} tasks - 要执行的作品请求数组
  8515. * */
  8516. executeWroksTask(tasks=this.taskList){
  8517. if(tasks.length ===0){
  8518. this.dispatch('error','PxerApp.executeWroksTask: taskList is empty');
  8519. return false;
  8520. };
  8521. if(! tasks.every(request=>request instanceof PxerWorksRequest)){
  8522. this.dispatch('error' ,'PxerApp.executeWroksTask: taskList is illegal');
  8523. return false;
  8524. };
  8525.  
  8526. // 任务按ID降序排列(#133)
  8527. if (['member_info', 'member_works_new', 'member_works'].includes(this.pageType)) {
  8528. tasks.sort((a,b)=>Number(b.id)-Number(a.id));
  8529. }
  8530.  
  8531. this.dispatch('executeWroksTask');
  8532.  
  8533. var ptm =this.ptm =new PxerThreadManager(this.ptmConfig);
  8534. ptm.on('error' ,(...argn)=>this.dispatch('error',argn));
  8535. ptm.on('warn' ,(...argn)=>this.dispatch('error',argn));
  8536. // 根据taskOption添加ptm中间件
  8537. if(this.taskOption.limit){
  8538. ptm.middleware.push((task)=>{
  8539. return ptm.pointer<this.taskOption.limit;
  8540. });
  8541. }
  8542. if(this.taskOption.stopId){
  8543. ptm.middleware.push((task)=>{
  8544. if(task.id==this.taskOption.stopId){
  8545. ptm.stop();
  8546. return false;
  8547. }
  8548. return true;
  8549. });
  8550. }
  8551.  
  8552. ptm.on('load',()=>{
  8553. this.resultSet =[];
  8554. var tl =this.taskList.slice(//限制结果集条数
  8555. 0,
  8556. this.taskOption.limit
  8557. ? this.taskOption.limit
  8558. : undefined
  8559. );
  8560. for(let pwr of tl){
  8561. if(!pwr.completed)continue;//跳过未完成的任务
  8562. let pw =PxerHtmlParser.parseWorks(pwr);
  8563. if(!pw){
  8564. pwr.completed=false;
  8565. ptm.dispatch('fail',new PxerFailInfo({
  8566. type :'parse',
  8567. task :pwr,
  8568. url :pwr.url[0],
  8569. }));
  8570. this.dispatch('error',window['PXER_ERROR']);
  8571. continue;
  8572. }
  8573. this.resultSet.push(pw);
  8574. }
  8575. this.dispatch('finishWorksTask' ,this.resultSet);
  8576. });
  8577. ptm.on('fail' ,pfi=>{
  8578. this.failList.push(pfi);
  8579. });
  8580. ptm.init(tasks);
  8581. ptm.run();
  8582.  
  8583. return true;
  8584.  
  8585. };
  8586. /**对失败的作品进行再抓取*/
  8587. executeFailWroks(list=this.failList){
  8588. // 把重试的任务从失败列表中减去
  8589. this.failList =this.failList.filter(pfi=>list.indexOf(pfi)===-1);
  8590. // 执行抓取
  8591. this.executeWroksTask(list.map(pfi=>pfi.task))
  8592. };
  8593. /**抓取页码完成后,初始化,准备抓取作品*/
  8594. switchPage2Works(len=this.resultSet.length){
  8595. this.taskList =this.resultSet.slice(0 ,len);
  8596. this.resultSet =[];
  8597. };
  8598. /**
  8599. * 获取当前抓取到的可读的任务信息
  8600. * @return {string}
  8601. * */
  8602. getWorksInfo(){
  8603. var pp =new PxerPrinter(this.ppConfig);
  8604. var pf =new PxerFilter(this.pfConfig);
  8605. pp.fillTaskInfo(pf.filter(this.resultSet));
  8606. return pp.taskInfo;
  8607. };
  8608. /**
  8609. * 输出抓取到的作品
  8610. * */
  8611. printWorks(){
  8612. var pp =new PxerPrinter(this.ppConfig);
  8613. var pf =new PxerFilter(this.pfConfig);
  8614. var works =pf.filter(this.resultSet);
  8615. pp.fillTaskInfo(works);
  8616. pp.fillAddress(works);
  8617. pp.print();
  8618. };
  8619. };
  8620.  
  8621. /**直接抓取本页面的作品*/
  8622. PxerApp.prototype['getThis'] =async function(){
  8623. // 生成任务对象
  8624. var id = pxer.util.getIDfromURL("illust_id") || document.URL.match(pxer.regexp.urlWorkDetail)[1];
  8625. var initdata = await pxer.util.fetchPixivApi(pxer.URLGetter.illustInfoById(id));
  8626.  
  8627.  
  8628. var type = initdata.illustType;
  8629. var pageCount = initdata.pageCount;
  8630. var pwr =new PxerWorksRequest({
  8631. isMultiple :pageCount>1,
  8632. id :id,
  8633. });//[manga|ugoira|illust]
  8634. switch (type) {
  8635. case 2: pwr.type ='ugoira'; break;
  8636. case 1: pwr.type ='illust'; break;
  8637. case 0: pwr.type ='manga'; break;
  8638. default:throw new Error("Unknown work type. id:" +id);
  8639. }
  8640. pwr.url =PxerHtmlParser.getUrlList(pwr);
  8641. // 添加执行
  8642. this.taskList = [pwr];
  8643. this.one('finishWorksTask',()=>this.printWorks());
  8644. this.executeWroksTask();
  8645. return true;
  8646. };
  8647.  
  8648. /**
  8649. * 获取当前页面的总作品数
  8650. * @param {Document=document} dom - 页面的document对象
  8651. * @return {number} - 作品数
  8652. * */
  8653. PxerApp.getWorksNum =function(dom=document){
  8654. return new Promise((resolve, reject)=>{
  8655. const pageType = pxer.util.getPageType(dom);
  8656.  
  8657. if (pageType === "rank") {
  8658. let queryurl = dom.URL + "&format=json";
  8659. let xhr = new XMLHttpRequest();
  8660. xhr.open("GET", queryurl);
  8661. xhr.onload = (e) => resolve(JSON.parse(xhr.responseText)['rank_total']);
  8662. xhr.send();
  8663. } else if (pageType === "bookmark_new") {
  8664. // 关注的新作品页数最多100页
  8665. // 因为一般用户关注的用户数作品都足够填满100页,所以从100开始尝试页数
  8666. // 如果没有100页进行一次二分查找
  8667. this.getFollowingBookmarkWorksNum(0, 100).then((res) => resolve(res));
  8668. } else if (pageType === "discovery"){
  8669. resolve(3000);
  8670. } else if (pageType === "bookmark_works"){
  8671. const queryInfo = new URLSearchParams(location.search);
  8672. let id = getIDfromURL("id", dom.URL) || getIDfromURL("id", dom.querySelector("a.user-name").getAttribute("href")) // old bookmark page
  8673. let queryurl = `https://www.pixiv.net/ajax/user/${id}/illusts/bookmarks?tag=&offset=0&limit=48&rest=${queryInfo.get('rest') || 'show'}`;
  8674. let xhr = new XMLHttpRequest();
  8675. xhr.open("GET", queryurl);
  8676. xhr.onload = (e) => {
  8677. resolve(JSON.parse(xhr.responseText).body.total)
  8678. };
  8679. xhr.send();
  8680. } else if (pageType === "member_works_new") {
  8681. let queryurl = `https://www.pixiv.net/ajax/user/${getIDfromURL()}/profile/all`;
  8682. let xhr = new XMLHttpRequest();
  8683. xhr.open("GET", queryurl);
  8684. xhr.onload = (e) => {
  8685. var resp = JSON.parse(xhr.responseText).body;
  8686. var type = dom.URL.match(/type=(manga|illust)/);
  8687. var getKeyCount = function(obj) {
  8688. return Object.keys(obj).length
  8689. }
  8690. if (!type) {
  8691. resolve(getKeyCount(resp.illusts)+getKeyCount(resp.manga))
  8692. } else if (type[1]==="illust") {
  8693. resolve(getKeyCount(resp.illusts))
  8694. } else {
  8695. resolve(getKeyCount(resp.manga))
  8696. }
  8697. };
  8698. xhr.send();
  8699. } else if (['search_spa', 'search_tag'].includes(pageType)) {
  8700. pxer.util.fetchPixivApi(pxer.URLGetter.search()).then(data => {
  8701. resolve(data.illustManga.total);
  8702. });
  8703. } else {
  8704. let elt = dom.querySelector(".count-badge");
  8705. if (!elt) resolve(null);
  8706. resolve(parseInt(elt.innerHTML));
  8707. }
  8708. })
  8709. };
  8710.  
  8711. /**
  8712. * 获取关注的新作品页的总作品数
  8713. * @param {number} startPage - 最小页数
  8714. * @param {number} maxPage - 最大页数
  8715. * @return {number} - 作品数
  8716. */
  8717. PxerApp.getFollowingBookmarkWorksNum = async function(startPage, maxPage){
  8718. const requestForCount = async (page = 0) => {
  8719. const data = await fetch(pxer.URLGetter.bookmarkNew({ page }));
  8720. return (await data.json()).body.page.ids.length;
  8721. };
  8722.  
  8723. // count how many item per page
  8724. const pageSize = await requestForCount();
  8725.  
  8726. // dichotomy search for the last page
  8727. const [lastPage, lastPageSize] = await (async () => {
  8728. const maxPageSize = await requestForCount(maxPage);
  8729. if (maxPageSize > 0) return [maxPage, maxPageSize];
  8730.  
  8731. let currentMinPage = startPage;
  8732. let currentMaxPage = maxPage;
  8733. let currentPage = ~~(maxPage / 2);
  8734. while (true) {
  8735. const currentPageSize = await requestForCount(currentPage);
  8736. if (currentPageSize > 0 && currentPageSize < pageSize) {
  8737. return [currentPage, currentPageSize];
  8738. }
  8739. if (currentPage === startPage || currentPage === maxPage) {
  8740. return [currentPage, pageSize];
  8741. }
  8742. if (currentPageSize === 0) {
  8743. currentMaxPage = currentPage;
  8744. currentPage -= Math.ceil((currentPage - currentMinPage - 1) / 2);
  8745. } else if (currentPageSize === pageSize) {
  8746. currentMinPage = currentPage;
  8747. currentPage += Math.ceil((currentMaxPage - currentPage) / 2);
  8748. }
  8749. }
  8750. })();
  8751.  
  8752.  
  8753. return (lastPage - startPage) * pageSize + lastPageSize;
  8754. }
  8755.  
  8756. ;
  8757.  
  8758.  
  8759. // src/view/analytics.js
  8760. (function () {
  8761. let uid = localStorage.getItem('pxer_uid');
  8762. if (!uid) {
  8763. uid = Number(Math.random().toString().split('.')[1]).toString(36);
  8764. localStorage.setItem('pxer_uid', uid);
  8765. }
  8766.  
  8767. const eventSender = new EventSender('https://point.pea3nut.org/events', {
  8768. uid,
  8769. app_name: 'pxer-app',
  8770. get event_page() { return pxer.util.getPageType(); },
  8771. get referer() { return location.href; },
  8772. });
  8773. eventSender.setContent({
  8774. mode: PXER_MODE,
  8775. url: PXER_URL,
  8776. lang: pxer.lang,
  8777. });
  8778. pxer.sendEvent = eventSender.send.bind(eventSender);
  8779. })();
  8780. ;
  8781.  
  8782.  
  8783. // src/view/AutoSuggestControl.js
  8784. 'use strict';
  8785. /*!
  8786. * Copyright (c) 2013 Profoundis Labs Pvt. Ltd., and individual contributors.
  8787. *
  8788. * All rights reserved.
  8789. */
  8790. /*
  8791. * Redistribution and use in source and binary forms, with or without modification,
  8792. * are permitted provided that the following conditions are met:
  8793. *
  8794. * 1. Redistributions of source code must retain the above copyright notice,
  8795. * this list of conditions and the following disclaimer.
  8796. *
  8797. * 2. Redistributions in binary form must reproduce the above copyright
  8798. * notice, this list of conditions and the following disclaimer in the
  8799. * documentation and/or other materials provided with the distribution.
  8800. *
  8801. * 3. Neither the name of autojs nor the names of its contributors may be used
  8802. * to endorse or promote products derived from this software without
  8803. * specific prior written permission.
  8804. *
  8805. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  8806. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  8807. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  8808. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  8809. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  8810. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  8811. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  8812. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  8813. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  8814. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  8815. *
  8816. * reuses a lot of code from Nicholas C. Zakas textfield autocomplete example found here
  8817. * http://oak.cs.ucla.edu/cs144/projects/javascript/suggest1.html
  8818. *
  8819. */
  8820.  
  8821. /*
  8822. * An autosuggest textbox control.
  8823. * @class
  8824. * @scope public
  8825. */
  8826. class AutoSuggestControl {
  8827. constructor(id_or_element, provider) {
  8828. this.provider = provider;
  8829. /**
  8830. * The textbox to capture, specified by element_id.
  8831. * @scope private
  8832. */
  8833. this.textbox /*:HTMLInputElement*/ = typeof id_or_element == "string" ? document.getElementById(id_or_element) : id_or_element;
  8834.  
  8835. //initialize the control
  8836. this.init();
  8837. }
  8838. }
  8839.  
  8840. /**
  8841. * Autosuggests one or more suggestions for what the user has typed.
  8842. * If no suggestions are passed in, then no autosuggest occurs.
  8843. * @scope private
  8844. * @param aSuggestions An array of suggestion strings.
  8845. */
  8846. AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/) {
  8847.  
  8848. //make sure there's at least one suggestion
  8849.  
  8850. if (aSuggestions.length > 0) {
  8851. this.typeAhead(aSuggestions[0]);
  8852. }
  8853. };
  8854.  
  8855.  
  8856. /**
  8857. * Handles keyup events.
  8858. * @scope private
  8859. * @param oEvent The event object for the keyup event.
  8860. */
  8861. AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
  8862.  
  8863. var iKeyCode = oEvent.keyCode;
  8864. var evtobj = oEvent;
  8865. window.eventobj = evtobj;
  8866. if ((iKeyCode != 16 && iKeyCode < 32) || (iKeyCode >= 33 && iKeyCode <= 46) || (iKeyCode >= 112 && iKeyCode <= 123) || (iKeyCode == 65 && evtobj.ctrlKey) || (iKeyCode == 90 && evtobj.ctrlKey)) {
  8867. //ignore
  8868. if (iKeyCode == 90 && evtobj.ctrlKey) {
  8869. // window.getSelection().deleteFromDocument();
  8870. // TODO: need to find a way to select the rest of the text and delete.
  8871. }
  8872. } else {
  8873. //request suggestions from the suggestion provider
  8874. this.requestSuggestions(this)
  8875. }
  8876. };
  8877.  
  8878. /**
  8879. * Initializes the textarea with event handlers for
  8880. * auto suggest functionality.
  8881. * @scope private
  8882. */
  8883. AutoSuggestControl.prototype.init = function () {
  8884.  
  8885. //save a reference to this object
  8886. var oThis = this;
  8887. //assign the onkeyup event handler
  8888. var lastDate = new Date();
  8889. oThis.textbox.onkeyup = function (oEvent) {
  8890.  
  8891. //check for the proper location of the event object
  8892. if (!oEvent) {
  8893. oEvent = window.event;
  8894. }
  8895. var newDate = new Date();
  8896. if (newDate.getTime() > lastDate.getTime() + 200) {
  8897. oThis.handleKeyUp(oEvent);
  8898. lastDate = newDate;
  8899. }
  8900. };
  8901.  
  8902. };
  8903.  
  8904. /**
  8905. * Selects a range of text in the textarea.
  8906. * @scope public
  8907. * @param iStart The start index (base 0) of the selection.
  8908. * @param iLength The number of characters to select.
  8909. */
  8910. AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
  8911. //use text ranges for Internet Explorer
  8912. if (this.textbox.createTextRange) {
  8913. var oRange = this.textbox.createTextRange();
  8914. oRange.moveStart("character", iStart);
  8915. oRange.moveEnd("character", iLength);
  8916. oRange.select();
  8917.  
  8918. //use setSelectionRange() for Mozilla
  8919. } else if (this.textbox.setSelectionRange) {
  8920. this.textbox.setSelectionRange(iStart, iLength);
  8921. }
  8922.  
  8923. //set focus back to the textbox
  8924. this.textbox.focus();
  8925. };
  8926.  
  8927. /**
  8928. * Inserts a suggestion into the textbox, highlighting the
  8929. * suggested part of the text.
  8930. * @scope private
  8931. * @param sSuggestion The suggestion for the textbox.
  8932. */
  8933. AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
  8934.  
  8935. //check for support of typeahead functionality
  8936. if (this.textbox.createTextRange || this.textbox.setSelectionRange){
  8937. var lastSpace = this.textbox.value.lastIndexOf(" ");
  8938. var lastQuote = this.textbox.value.lastIndexOf("'");
  8939. var lastHypen = this.textbox.value.lastIndexOf("-");
  8940. var lastDoubleQuote = this.textbox.value.lastIndexOf('"');
  8941. var lastEnter = this.textbox.value.lastIndexOf("\n");
  8942. var lastIndex = Math.max(lastSpace, lastEnter, lastQuote, lastHypen, lastDoubleQuote) + 1;
  8943. var contentStripped = this.textbox.value.substring(0, lastIndex);
  8944. var lastWord = this.textbox.value.substring(lastIndex, this.textbox.value.length);
  8945. this.textbox.value = contentStripped + sSuggestion; //.replace(lastWord,"");
  8946. var start = this.textbox.value.length - sSuggestion.replace(lastWord,"").length;
  8947. var end = this.textbox.value.length;
  8948. this.selectRange(start, end);
  8949. }
  8950. };
  8951.  
  8952.  
  8953.  
  8954. /**
  8955. * Request suggestions for the given autosuggest control.
  8956. */
  8957. AutoSuggestControl.prototype.requestSuggestions = function () {
  8958. this.words = this.provider();
  8959. var aSuggestions = [];
  8960. var sTextbox = this.textbox.value;
  8961. var sTextboxSplit = sTextbox.split(/\s+/);
  8962. var sTextboxLast = sTextboxSplit[sTextboxSplit.length-1];
  8963. var sTextboxValue = sTextboxLast;
  8964. if (sTextboxValue.length > 0){
  8965. //search for matching words
  8966. for (var i=0; i < this.words.length; i++) {
  8967. if (this.words[i].indexOf(sTextboxValue.toLowerCase()) == 0) {
  8968. if (this.words[i].indexOf(sTextboxValue) == 0){
  8969. aSuggestions.push(this.words[i]);
  8970. }
  8971. else if (this.words[i].indexOf(sTextboxValue.charAt(0).toLowerCase() + sTextboxValue.slice(1)) == 0) {
  8972. aSuggestions.push(this.words[i].charAt(0).toUpperCase() + this.words[i].slice(1));
  8973. }
  8974. }
  8975. }
  8976. }
  8977.  
  8978. //provide suggestions to the control
  8979. this.autosuggest(aSuggestions);
  8980. };
  8981. ;
  8982.  
  8983.  
  8984. // src/view/vm.js
  8985. pxer.util.afterLoad(function(){
  8986. const el = document.createElement('div');
  8987. const component = {
  8988. template: pxer.uiTemplate,
  8989. watch:{
  8990. currentUrl(){
  8991. this.state = 'standby';
  8992. this.taskInfo = '';
  8993. this.errmsg = '';
  8994. this.pageType = pxer.util.getPageType();
  8995. pxer.sendEvent('pv');
  8996. },
  8997. isRunning(value){
  8998. if(value&&this.runTimeTimer===null){
  8999. this.runTimeTimer = setInterval(()=>this.runTimeTimestamp++ ,1000);
  9000. }else{
  9001. clearInterval(this.runTimeTimer);
  9002. this.runTimeTimer =null;
  9003. }
  9004. },
  9005. tagFilterInfo: {
  9006. deep: true,
  9007. handler: 'onTagFilterInfoChange'
  9008. },
  9009. },
  9010. data(){return {
  9011. pxer: null,
  9012. showAll:false,
  9013. state:'standby',//[standby|init|ready|page|works|finish|re-ready|stop|error]
  9014. stateMap:{
  9015. standby:'待命',
  9016. init :'初始化',
  9017. ready :'就绪',
  9018. page :'抓取页码中',
  9019. works :'抓取作品中',
  9020. finish:'完成',
  9021. 're-ready':'再抓取就绪',
  9022. stop :'用户手动停止',
  9023. error :'出错',
  9024. },
  9025. pxerVersion: pxer.package.version,
  9026. showPxerFailWindow:false,
  9027. runTimeTimestamp:0,
  9028. runTimeTimer:null,
  9029. checkedFailWorksList:[],
  9030. taskInfo:'',
  9031. tryFailWroksList:[],
  9032. showTaskOption:false,
  9033. taskOption:{
  9034. limit:'',
  9035. stopId:'',
  9036. },
  9037. showLoadBtn:true,
  9038. errmsg:'',
  9039.  
  9040. pageType: pxer.util.getPageType(),
  9041. currentUrl: document.URL,
  9042. showAllTagFilter: false,
  9043. showLoadingButton: false,
  9044. /**
  9045. * @property {'NECESSARY' | 'EXCLUDE' | 'WHATEVER'} [tagName] - default by WHATEVER
  9046. * */
  9047. tagFilterInfo: {},
  9048. }},
  9049. computed:{
  9050. isRunning(){
  9051. var runState =['page','works'];
  9052. return runState.indexOf(this.state)!==-1;
  9053. },
  9054. worksNum(){
  9055. return this.pxer.taskOption.limit ||this.pxer.worksNum;
  9056. },
  9057. taskCount(){
  9058. if (!this.pxer) return null;
  9059. var pageWorkCount = getOnePageWorkCount(this.pxer.pageType);
  9060. return Math.ceil(this.worksNum/pageWorkCount)+ +this.worksNum;
  9061. },
  9062. finishCount(){
  9063. if(this.state==='page'){
  9064. return this.pxer.taskList.filter(pr=>pr.completed).length;
  9065. }else if(this.state==='works'){
  9066. return (
  9067. this.pxer.taskList.filter(pr=>pr.completed).length
  9068. +~~(this.worksNum/20)
  9069. +this.pxer.failList.length
  9070. );
  9071. }else{
  9072. return -1;
  9073. };
  9074. },
  9075. forecastTime(){
  9076. if(this.isRunning&&this.finishCount){
  9077. return Math.ceil(
  9078. (this.runTimeTimestamp/this.finishCount)*this.taskCount
  9079. -this.runTimeTimestamp
  9080. );
  9081. }else{
  9082. return -1;
  9083. };
  9084. },
  9085. printConfigUgoira:{
  9086. get(){
  9087. return this.pxer.ppConfig.ugoira_zip+'-'+this.pxer.ppConfig.ugoira_frames;
  9088. },
  9089. set(value){
  9090. var arr =value.split('-');
  9091. this.pxer.ppConfig.ugoira_zip=arr[0];
  9092. this.pxer.ppConfig.ugoira_frames=arr[1];
  9093. }
  9094. },
  9095. no_tag_any:{
  9096. get(){
  9097. return this.pxer.pfConfig.no_tag_any.join(' ');
  9098. },
  9099. set(value){
  9100. this.pxer.pfConfig.no_tag_any =value.split(' ');
  9101. },
  9102. },
  9103. no_tag_every:{
  9104. get(){
  9105. return this.pxer.pfConfig.no_tag_every.join(' ');
  9106. },
  9107. set(value){
  9108. this.pxer.pfConfig.no_tag_every =value.split(' ');
  9109. },
  9110. },
  9111. has_tag_some:{
  9112. get(){
  9113. return this.pxer.pfConfig.has_tag_some.join(' ');
  9114. },
  9115. set(value){
  9116. this.pxer.pfConfig.has_tag_some =value.split(' ');
  9117. },
  9118. },
  9119. has_tag_every:{
  9120. get(){
  9121. return this.pxer.pfConfig.has_tag_every.join(' ');
  9122. },
  9123. set(value){
  9124. this.pxer.pfConfig.has_tag_every =value.split(' ');
  9125. },
  9126. },
  9127. showFailTaskList(){
  9128. if (!this.pxer) return [];
  9129. return this.pxer.failList
  9130. .filter((pfi)=>{
  9131. return this.tryFailWroksList.indexOf(pfi)===-1;
  9132. })
  9133. ;
  9134. },
  9135.  
  9136. canCrawlDirectly() {
  9137. this.currentUrl;
  9138. return this.pageType === 'works_medium';
  9139. },
  9140. canCrawl() {
  9141. this.currentUrl;
  9142. return PxerApp.canCrawl();
  9143. },
  9144.  
  9145. /**
  9146. * @return {TagInfo}
  9147. *
  9148. * @typedef TagInfo
  9149. * @property {Array.<string>} tags - all tags without repeat
  9150. * @property {Object.<string, number>} count - The times of tag included in works
  9151. * */
  9152. tagInfo() {
  9153. const allTags = this.pxer.resultSet.reduce((result, works) => result.concat(works.tagList), []);
  9154. const countMap = {};
  9155. const noRepeatTags = [];
  9156.  
  9157. allTags.forEach(tag => {
  9158. if (!noRepeatTags.includes(tag)) {
  9159. noRepeatTags.push(tag);
  9160. }
  9161. countMap[tag] = countMap[tag] || 0;
  9162. countMap[tag]++;
  9163. });
  9164.  
  9165. noRepeatTags.sort((tag1, tag2) => countMap[tag2] - countMap[tag1]);
  9166.  
  9167. return {
  9168. tags: noRepeatTags,
  9169. count: countMap,
  9170. }
  9171. },
  9172. needFoldTagFilter() {
  9173. return this.tagInfo.tags.length > 60;
  9174. },
  9175. tagFilterFolded() {
  9176. return this.needFoldTagFilter && !this.showAllTagFilter;
  9177. },
  9178. },
  9179. methods:{
  9180. createPxerApp() {
  9181. this.pxer = new PxerApp();
  9182. this.pxer.on('error',(error)=>{
  9183. this.errmsg = error;
  9184. pxer.sendEvent('error', {
  9185. error,
  9186. PXER_ERROR: typeof PXER_ERROR !== 'undefined' ? PXER_ERROR : null,
  9187. });
  9188. });
  9189. this.pxer.on('finishWorksTask',(result) =>{
  9190. pxer.sendEvent('finish', {
  9191. result_count: result.length,
  9192. ptm_config: this.pxer.ptmConfig,
  9193. task_option: this.pxer.taskOption,
  9194. error_count: this.pxer.failList.length,
  9195. });
  9196. });
  9197. },
  9198. crawlDirectly() {
  9199. this.createPxerApp();
  9200. this.showLoadingButton = true;
  9201. this.pxer.one('finishWorksTask',()=>{
  9202. this.showLoadingButton = false;
  9203. this.state='standby';
  9204. });
  9205. this.pxer.getThis();
  9206. pxer.sendEvent('get-this', {
  9207. page_type:this.pxer.pageType,
  9208. });
  9209. },
  9210.  
  9211. load(){
  9212. this.createPxerApp();
  9213. this.state='init';
  9214. this.pxer.init().then(()=>this.state='ready');
  9215. this.pxer.on('finishWorksTask',()=>{
  9216. window.blinkTitle();
  9217. });
  9218. pxer.sendEvent('load', {
  9219. page_type:this.pxer.pageType,
  9220. });
  9221. },
  9222. run(){
  9223. pxer.sendEvent("start", {
  9224. ptm_config:this.pxer.ptmConfig,
  9225. task_option:this.pxer.taskOption,
  9226. vm_state:this.state,
  9227. });
  9228. if(this.state==='ready'){
  9229. this.state='page';
  9230. this.pxer.initPageTask();
  9231. this.pxer.one('finishPageTask',()=>{
  9232. this.state='works';
  9233. this.pxer.switchPage2Works();
  9234. this.pxer.executeWroksTask();
  9235. });
  9236. this.pxer.one('finishWorksTask',()=>{
  9237. this.state='finish';
  9238. });
  9239. this.pxer.executePageTask();
  9240. }else if(this.state==='re-ready'){
  9241. this.state='works';
  9242. this.pxer.one('finishWorksTask',()=>{
  9243. this.state='finish';
  9244. });
  9245. this.pxer.executeFailWroks(this.tryFailWroksList);
  9246. this.tryFailWroksList=[];
  9247. }
  9248. },
  9249. stop(){
  9250. this.state='stop';
  9251. this.pxer.stop();
  9252. pxer.sendEvent("halt", {
  9253. task_count:this.taskCount,
  9254. finish_count:this.finishCount,
  9255. });
  9256. },
  9257. count(){
  9258. this.taskInfo =this.pxer.getWorksInfo()
  9259. },
  9260. printWorks(){
  9261. this.pxer.printWorks();
  9262. var sanitizedpfConfig = {};
  9263. for (let key in this.pxer.pfConfig) {
  9264. sanitizedpfConfig[key] = this.pxer.pfConfig[key].length?this.pxer.pfConfig[key].length:this.pxer.pfConfig[key];
  9265. }
  9266. pxer.sendEvent("print", {
  9267. pp_config:this.pxer.ppConfig,
  9268. pf_config:sanitizedpfConfig,
  9269. task_option:this.pxer.taskOption,
  9270. });
  9271. },
  9272. useTaskOption(){
  9273. this.showTaskOption=false;
  9274. pxer.sendEvent("setTaskOption", {
  9275. task_option: this.taskOption,
  9276. });
  9277. Object.assign(this.pxer.taskOption ,this.taskOption);
  9278. },
  9279. formatFailType(type){
  9280. return{
  9281. 'empty':'获取内容失败',
  9282. 'timeout':'获取超时',
  9283. 'r-18':'限制级作品(R-18)',
  9284. 'r-18g':'怪诞作品(R-18G)',
  9285. 'mypixiv':'仅好P友可见的作品',
  9286. 'parse':'解析错误',
  9287. }[type]||type;
  9288. },
  9289. formatFailSolution(type){
  9290. return{
  9291. 'empty':'点击左侧链接确认内容正确,再试一次~',
  9292. 'timeout':'增加最大等待时间再试一次~',
  9293. 'r-18':'开启账号R-18选项',
  9294. 'r-18g':'开启账号R-18G选项',
  9295. 'mypixiv':'添加画师好友再尝试',
  9296. 'parse':'再试一次,若问题依旧,请<a href="https://github.com/pea3nut/Pxer/issues/5" target="_blank">反馈</a>给花生',
  9297. }[type]||'要不。。。再试一次?';
  9298. },
  9299. tryCheckedPfi(){
  9300. this.tryFailWroksList.push(...this.checkedFailWorksList);
  9301. pxer.sendEvent("reready", {
  9302. checked_works:this.checkedFailWorksList,
  9303. });
  9304. this.checkedFailWorksList=[];
  9305. this.state='re-ready';
  9306. },
  9307. formatTime(s){
  9308. return `${~~(s/60)}:${(s%60>=10)?s%60:'0'+s%60}`
  9309. },
  9310.  
  9311. t: pxer.t,
  9312. listenUrlChange(){
  9313. const vm = this;
  9314. const historyPushState = history.pushState;
  9315. const historyReplaceState = history.replaceState;
  9316.  
  9317. history.pushState = function (...args) {
  9318. historyPushState.apply(history, args);
  9319. setTimeout(() => vm.currentUrl = document.URL, 0);
  9320. };
  9321. history.replaceState = function (...args) {
  9322. historyReplaceState.apply(history, args);
  9323. setTimeout(() => vm.currentUrl = document.URL, 0);
  9324. };
  9325. },
  9326.  
  9327. // about filter by tag
  9328. countTagTheme(tagName) {
  9329. switch (this.tagFilterInfo[tagName]) {
  9330. default:
  9331. case 'WHATEVER': return 'btn-secondary';
  9332. case 'EXCLUDE': return 'btn-danger';
  9333. case 'NECESSARY': return 'btn-success';
  9334. }
  9335. },
  9336. onTagFilterInfoChange(value){
  9337. this.pxer.pfConfig.no_tag_any = [];
  9338. this.pxer.pfConfig.has_tag_some = [];
  9339. for(let [tagName, filterOption] of Object.entries(value)) {
  9340. switch (filterOption) {
  9341. case 'EXCLUDE':
  9342. this.pxer.pfConfig.no_tag_any.push(tagName);
  9343. break;
  9344. case 'NECESSARY':
  9345. this.pxer.pfConfig.has_tag_some.push(tagName);
  9346. break;
  9347. }
  9348. }
  9349. },
  9350. onTagClick(tagName) {
  9351. switch (this.tagFilterInfo[tagName]) {
  9352. default:
  9353. case 'WHATEVER':
  9354. this.$set(this.tagFilterInfo, tagName, 'EXCLUDE');
  9355. break;
  9356. case 'EXCLUDE':
  9357. this.$set(this.tagFilterInfo, tagName, 'NECESSARY');
  9358. break;
  9359. case 'NECESSARY':
  9360. this.$set(this.tagFilterInfo, tagName, 'WHATEVER');
  9361. break;
  9362. }
  9363. },
  9364. },
  9365. mounted(){
  9366. this.listenUrlChange();
  9367. pxer.loaded = true;
  9368. pxer.sendEvent('pv');
  9369. },
  9370. };
  9371.  
  9372. // find a element as anchor
  9373. [
  9374. elt => {
  9375. const target = document.querySelector('#root > header');
  9376. if (!target) return false;
  9377.  
  9378. target.appendChild(elt);
  9379. return true;
  9380. },
  9381. elt => {
  9382. const target = document.querySelector('._global-header');
  9383. if (!target) return false;
  9384.  
  9385. target.appendChild(elt);
  9386. return true;
  9387. },
  9388. elt => {
  9389. const target = document.getElementById('wrapper');
  9390. if (!target) return false;
  9391.  
  9392. target.insertBefore(elt, target.firstChild);
  9393.  
  9394. return true;
  9395. },
  9396. elt => {
  9397. document.body.insertBefore(elt, document.body.firstChild);
  9398. return true;
  9399. },
  9400. ].some(fn => fn(el));
  9401.  
  9402. // mount UI
  9403. pxer.vm = new Vue(component).$mount(el);
  9404. });
  9405. ;
  9406.  
  9407.  
  9408. }());