pagy 7.0.11 → 43.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/apps/calendar.ru +741 -0
- data/apps/demo.ru +513 -0
- data/apps/enable_rails_page_segment.rb +54 -0
- data/apps/index.rb +9 -0
- data/apps/keynav+root_key.ru +316 -0
- data/apps/keynav.ru +255 -0
- data/apps/keyset.ru +219 -0
- data/apps/keyset_sequel.ru +212 -0
- data/apps/rails.ru +216 -0
- data/apps/repro.ru +185 -0
- data/bin/pagy +5 -0
- data/config/pagy.rb +46 -0
- data/javascripts/ai_widget.js +90 -0
- data/javascripts/pagy.js +168 -0
- data/javascripts/pagy.min.js +2 -0
- data/javascripts/pagy.mjs +161 -0
- data/javascripts/wand.js +1172 -0
- data/lib/pagy/classes/calendar/calendar.rb +101 -0
- data/lib/pagy/{calendar → classes/calendar}/day.rb +9 -12
- data/lib/pagy/{calendar → classes/calendar}/month.rb +7 -11
- data/lib/pagy/{calendar → classes/calendar}/quarter.rb +12 -16
- data/lib/pagy/classes/calendar/unit.rb +93 -0
- data/lib/pagy/{calendar → classes/calendar}/week.rb +7 -11
- data/lib/pagy/{calendar → classes/calendar}/year.rb +9 -9
- data/lib/pagy/classes/exceptions.rb +26 -0
- data/lib/pagy/classes/keyset/adapters/active_record.rb +50 -0
- data/lib/pagy/classes/keyset/adapters/sequel.rb +62 -0
- data/lib/pagy/classes/keyset/keynav.rb +85 -0
- data/lib/pagy/classes/keyset/keyset.rb +150 -0
- data/lib/pagy/classes/offset/countish.rb +17 -0
- data/lib/pagy/classes/offset/countless.rb +63 -0
- data/lib/pagy/classes/offset/offset.rb +63 -0
- data/lib/pagy/classes/offset/search.rb +34 -0
- data/lib/pagy/classes/request.rb +48 -0
- data/lib/pagy/cli.rb +122 -0
- data/lib/pagy/console.rb +5 -20
- data/lib/pagy/deprecated.rb +84 -0
- data/lib/pagy/modules/abilities/configurable.rb +37 -0
- data/lib/pagy/modules/abilities/countable.rb +23 -0
- data/lib/pagy/modules/abilities/linkable.rb +72 -0
- data/lib/pagy/modules/abilities/rangeable.rb +14 -0
- data/lib/pagy/modules/abilities/shiftable.rb +12 -0
- data/lib/pagy/modules/b64.rb +35 -0
- data/lib/pagy/modules/console.rb +33 -0
- data/lib/pagy/modules/i18n/i18n.rb +72 -0
- data/lib/pagy/modules/i18n/p11n/arabic.rb +30 -0
- data/lib/pagy/modules/i18n/p11n/east_slavic.rb +27 -0
- data/lib/pagy/modules/i18n/p11n/one_other.rb +15 -0
- data/lib/pagy/modules/i18n/p11n/one_upto_two_other.rb +15 -0
- data/lib/pagy/modules/i18n/p11n/other.rb +13 -0
- data/lib/pagy/modules/i18n/p11n/polish.rb +27 -0
- data/lib/pagy/modules/i18n/p11n/west_slavic.rb +22 -0
- data/lib/pagy/modules/i18n/p11n.rb +16 -0
- data/lib/pagy/modules/searcher.rb +20 -0
- data/lib/pagy/next.rb +25 -0
- data/lib/pagy/tasks/sync.rb +20 -0
- data/lib/pagy/toolbox/helpers/anchor_tags.rb +21 -0
- data/lib/pagy/toolbox/helpers/bootstrap/input_nav_js.rb +28 -0
- data/lib/pagy/toolbox/helpers/bootstrap/previous_next_html.rb +19 -0
- data/lib/pagy/toolbox/helpers/bootstrap/series_nav.rb +32 -0
- data/lib/pagy/toolbox/helpers/bootstrap/series_nav_js.rb +24 -0
- data/lib/pagy/toolbox/helpers/bulma/input_nav_js.rb +25 -0
- data/lib/pagy/toolbox/helpers/bulma/previous_next_html.rb +20 -0
- data/lib/pagy/toolbox/helpers/bulma/series_nav.rb +31 -0
- data/lib/pagy/toolbox/helpers/bulma/series_nav_js.rb +23 -0
- data/lib/pagy/toolbox/helpers/data_hash.rb +29 -0
- data/lib/pagy/toolbox/helpers/headers_hash.rb +30 -0
- data/lib/pagy/toolbox/helpers/info_tag.rb +30 -0
- data/lib/pagy/toolbox/helpers/input_nav_js.rb +22 -0
- data/lib/pagy/toolbox/helpers/limit_tag_js.rb +25 -0
- data/lib/pagy/toolbox/helpers/loaders.rb +55 -0
- data/lib/pagy/toolbox/helpers/page_url.rb +16 -0
- data/lib/pagy/toolbox/helpers/series_nav.rb +30 -0
- data/lib/pagy/toolbox/helpers/series_nav_js.rb +20 -0
- data/lib/pagy/toolbox/helpers/support/a_lambda.rb +36 -0
- data/lib/pagy/toolbox/helpers/support/data_pagy_attribute.rb +19 -0
- data/lib/pagy/toolbox/helpers/support/nav_aria_label_attribute.rb +10 -0
- data/lib/pagy/toolbox/helpers/support/series.rb +37 -0
- data/lib/pagy/toolbox/helpers/support/wrap_input_nav_js.rb +19 -0
- data/lib/pagy/toolbox/helpers/support/wrap_series_nav.rb +17 -0
- data/lib/pagy/toolbox/helpers/support/wrap_series_nav_js.rb +42 -0
- data/lib/pagy/toolbox/helpers/urls_hash.rb +12 -0
- data/lib/pagy/toolbox/paginators/calendar.rb +34 -0
- data/lib/pagy/toolbox/paginators/countish.rb +38 -0
- data/lib/pagy/toolbox/paginators/countless.rb +22 -0
- data/lib/pagy/toolbox/paginators/elasticsearch_rails.rb +56 -0
- data/lib/pagy/toolbox/paginators/keynav_js.rb +26 -0
- data/lib/pagy/toolbox/paginators/keyset.rb +15 -0
- data/lib/pagy/toolbox/paginators/meilisearch.rb +34 -0
- data/lib/pagy/toolbox/paginators/method.rb +38 -0
- data/lib/pagy/toolbox/paginators/offset.rb +24 -0
- data/lib/pagy/toolbox/paginators/searchkick.rb +34 -0
- data/lib/pagy/toolbox/paginators/typesense_rails.rb +34 -0
- data/lib/pagy.rb +67 -131
- data/locales/ar.yml +32 -0
- data/locales/be.yml +28 -0
- data/locales/bg.yml +24 -0
- data/locales/bs.yml +28 -0
- data/locales/ca.yml +24 -0
- data/locales/ckb.yml +20 -0
- data/locales/cs.yml +26 -0
- data/locales/da.yml +24 -0
- data/locales/de.yml +24 -0
- data/locales/dz.yml +20 -0
- data/locales/en.yml +24 -0
- data/{lib/locales → locales}/es.yml +9 -6
- data/locales/fr.yml +24 -0
- data/locales/hr.yml +28 -0
- data/locales/id.yml +20 -0
- data/locales/it.yml +24 -0
- data/locales/ja.yml +20 -0
- data/locales/km.yml +20 -0
- data/locales/ko.yml +20 -0
- data/locales/nb.yml +24 -0
- data/locales/nl.yml +24 -0
- data/locales/nn.yml +24 -0
- data/locales/pl.yml +28 -0
- data/{lib/locales → locales}/pt-BR.yml +10 -7
- data/{lib/locales → locales}/pt.yml +10 -7
- data/locales/ru.yml +28 -0
- data/locales/sk.yml +26 -0
- data/locales/sr.yml +28 -0
- data/locales/sv-SE.yml +24 -0
- data/locales/sv.yml +24 -0
- data/locales/sw.yml +28 -0
- data/locales/ta.yml +24 -0
- data/locales/tr.yml +24 -0
- data/locales/uk.yml +28 -0
- data/locales/vi.yml +20 -0
- data/locales/zh-CN.yml +20 -0
- data/locales/zh-HK.yml +20 -0
- data/locales/zh-TW.yml +20 -0
- data/stylesheets/pagy-tailwind.css +68 -0
- data/stylesheets/pagy.css +83 -0
- metadata +185 -94
- data/lib/config/pagy.rb +0 -258
- data/lib/javascripts/pagy-dev.js +0 -112
- data/lib/javascripts/pagy-module.js +0 -111
- data/lib/javascripts/pagy.js +0 -1
- data/lib/locales/ar.yml +0 -30
- data/lib/locales/be.yml +0 -25
- data/lib/locales/bg.yml +0 -21
- data/lib/locales/bs.yml +0 -25
- data/lib/locales/ca.yml +0 -23
- data/lib/locales/ckb.yml +0 -18
- data/lib/locales/cs.yml +0 -23
- data/lib/locales/da.yml +0 -23
- data/lib/locales/de.yml +0 -21
- data/lib/locales/en.yml +0 -21
- data/lib/locales/fr.yml +0 -21
- data/lib/locales/hr.yml +0 -25
- data/lib/locales/id.yml +0 -19
- data/lib/locales/it.yml +0 -21
- data/lib/locales/ja.yml +0 -19
- data/lib/locales/km.yml +0 -19
- data/lib/locales/ko.yml +0 -19
- data/lib/locales/nb.yml +0 -21
- data/lib/locales/nl.yml +0 -21
- data/lib/locales/nn.yml +0 -21
- data/lib/locales/pl.yml +0 -25
- data/lib/locales/ru.yml +0 -27
- data/lib/locales/sr.yml +0 -25
- data/lib/locales/sv-SE.yml +0 -21
- data/lib/locales/sv.yml +0 -21
- data/lib/locales/sw.yml +0 -23
- data/lib/locales/ta.yml +0 -23
- data/lib/locales/tr.yml +0 -19
- data/lib/locales/uk.yml +0 -25
- data/lib/locales/vi.yml +0 -17
- data/lib/locales/zh-CN.yml +0 -19
- data/lib/locales/zh-HK.yml +0 -19
- data/lib/locales/zh-TW.yml +0 -19
- data/lib/pagy/backend.rb +0 -39
- data/lib/pagy/calendar/helper.rb +0 -65
- data/lib/pagy/calendar.rb +0 -126
- data/lib/pagy/countless.rb +0 -37
- data/lib/pagy/exceptions.rb +0 -25
- data/lib/pagy/extras/arel.rb +0 -36
- data/lib/pagy/extras/array.rb +0 -24
- data/lib/pagy/extras/bootstrap.rb +0 -108
- data/lib/pagy/extras/bulma.rb +0 -105
- data/lib/pagy/extras/calendar.rb +0 -53
- data/lib/pagy/extras/countless.rb +0 -37
- data/lib/pagy/extras/elasticsearch_rails.rb +0 -80
- data/lib/pagy/extras/foundation.rb +0 -105
- data/lib/pagy/extras/frontend_helpers.rb +0 -67
- data/lib/pagy/extras/gearbox.rb +0 -54
- data/lib/pagy/extras/headers.rb +0 -53
- data/lib/pagy/extras/i18n.rb +0 -26
- data/lib/pagy/extras/items.rb +0 -61
- data/lib/pagy/extras/jsonapi.rb +0 -79
- data/lib/pagy/extras/materialize.rb +0 -96
- data/lib/pagy/extras/meilisearch.rb +0 -65
- data/lib/pagy/extras/metadata.rb +0 -38
- data/lib/pagy/extras/navs.rb +0 -51
- data/lib/pagy/extras/overflow.rb +0 -80
- data/lib/pagy/extras/searchkick.rb +0 -67
- data/lib/pagy/extras/semantic.rb +0 -95
- data/lib/pagy/extras/standalone.rb +0 -60
- data/lib/pagy/extras/support.rb +0 -40
- data/lib/pagy/extras/trim.rb +0 -29
- data/lib/pagy/extras/uikit.rb +0 -97
- data/lib/pagy/frontend.rb +0 -114
- data/lib/pagy/i18n.rb +0 -165
- data/lib/pagy/url_helpers.rb +0 -27
- data/lib/stylesheets/pagy.css +0 -61
- data/lib/stylesheets/pagy.scss +0 -50
- data/lib/stylesheets/pagy.tailwind.scss +0 -24
- /data/{lib/javascripts/pagy-module.d.ts → javascripts/pagy.d.ts} +0 -0
data/apps/repro.ru
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# DESCRIPTION
|
|
4
|
+
# Reproduce generic/simple issues
|
|
5
|
+
#
|
|
6
|
+
# DOC
|
|
7
|
+
# https://ddnexus.github.io/pagy/playground/#repro-app
|
|
8
|
+
#
|
|
9
|
+
# BIN HELP
|
|
10
|
+
# pagy -h
|
|
11
|
+
#
|
|
12
|
+
# DEV USAGE
|
|
13
|
+
# pagy clone repro
|
|
14
|
+
# pagy ./repro.ru
|
|
15
|
+
#
|
|
16
|
+
# URL
|
|
17
|
+
# http://127.0.0.1:8000
|
|
18
|
+
|
|
19
|
+
VERSION = '43.5.1'
|
|
20
|
+
|
|
21
|
+
if VERSION != Pagy::VERSION
|
|
22
|
+
Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
|
|
23
|
+
end
|
|
24
|
+
run_from_repo = Pagy::ROOT.join('pagy.gemspec').exist?
|
|
25
|
+
|
|
26
|
+
# Bundle
|
|
27
|
+
require 'bundler/inline'
|
|
28
|
+
gemfile(!run_from_repo) do
|
|
29
|
+
source 'https://rubygems.org'
|
|
30
|
+
gem 'oj'
|
|
31
|
+
gem 'puma'
|
|
32
|
+
gem 'sinatra'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Edit this section adding the legacy as needed
|
|
36
|
+
# Pagy initializer
|
|
37
|
+
Pagy::OPTIONS[:max_limit] = 100
|
|
38
|
+
|
|
39
|
+
# Sinatra setup
|
|
40
|
+
require 'sinatra/base'
|
|
41
|
+
# Sinatra application
|
|
42
|
+
class PagyRepro < Sinatra::Base
|
|
43
|
+
include Pagy::Method
|
|
44
|
+
|
|
45
|
+
get('/javascripts/:file') do
|
|
46
|
+
format = params[:file].split('.').last
|
|
47
|
+
if format == 'js'
|
|
48
|
+
content_type 'application/javascript'
|
|
49
|
+
elsif format == 'map'
|
|
50
|
+
content_type 'application/json'
|
|
51
|
+
end
|
|
52
|
+
send_file Pagy::ROOT.join('javascripts', params[:file])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Edit this action as needed
|
|
56
|
+
get '/' do
|
|
57
|
+
collection = MockCollection.new
|
|
58
|
+
@pagy, @records = pagy(collection) # simplest form
|
|
59
|
+
# @pagy, @records = pagy(:offset, collection, limit: 7, max_limit: 30)
|
|
60
|
+
# @pagy, @records = pagy(:countish, collection, ttl: 20)
|
|
61
|
+
# @pagy, @records = pagy(:countless, collection)
|
|
62
|
+
# @pagy, @records = pagy(Array(1..1000))
|
|
63
|
+
# response.headers.merge!(@pagy.headers_hash)
|
|
64
|
+
erb :main
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Views
|
|
68
|
+
template :layout do
|
|
69
|
+
<<~ERB
|
|
70
|
+
<!DOCTYPE html>
|
|
71
|
+
<html lang="en">
|
|
72
|
+
<head>
|
|
73
|
+
<title>Pagy Repro App</title>
|
|
74
|
+
<script src="javascripts/pagy.js"></script>
|
|
75
|
+
<script>
|
|
76
|
+
window.addEventListener("load", Pagy.init);
|
|
77
|
+
</script>
|
|
78
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
79
|
+
<style type="text/css">
|
|
80
|
+
@media screen { html, body {
|
|
81
|
+
font-size: 1rem;
|
|
82
|
+
line-height: 1.2;
|
|
83
|
+
padding: 0;
|
|
84
|
+
margin: 0;
|
|
85
|
+
} }
|
|
86
|
+
body {
|
|
87
|
+
background: white !important;
|
|
88
|
+
margin: 0 !important;
|
|
89
|
+
font-family: sans-serif !important;
|
|
90
|
+
}
|
|
91
|
+
.main-content {
|
|
92
|
+
padding: 1rem 1.5rem 2rem !important;
|
|
93
|
+
}
|
|
94
|
+
.pagy, .pagy-bootstrap, .pagy-bulma {
|
|
95
|
+
padding: .5em;
|
|
96
|
+
margin: .3em 0;
|
|
97
|
+
width: fit-content;
|
|
98
|
+
box-shadow: 5px 5px 10px 0px rgba(0,0,0,0.2);
|
|
99
|
+
}
|
|
100
|
+
/* Quick demo for overriding the element style attribute of certain pagy helpers
|
|
101
|
+
.pagy input[style] {
|
|
102
|
+
width: 5rem !important;
|
|
103
|
+
}
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
If you want to customize the style,
|
|
108
|
+
please replace the line below with the actual file content
|
|
109
|
+
*/
|
|
110
|
+
<%= Pagy::ROOT.join('stylesheets/pagy.css').read %>
|
|
111
|
+
</style>
|
|
112
|
+
</head>
|
|
113
|
+
<body>
|
|
114
|
+
<%= yield %>
|
|
115
|
+
</body>
|
|
116
|
+
</html>
|
|
117
|
+
ERB
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
template :main do
|
|
121
|
+
<<~ERB
|
|
122
|
+
<div class="main-content">
|
|
123
|
+
<h1>Pagy Repro App</h1>
|
|
124
|
+
<p> Self-contained, standalone app usable to easily reproduce any pagy issue.</p>
|
|
125
|
+
|
|
126
|
+
<h2>Versions</h2>
|
|
127
|
+
<ul>
|
|
128
|
+
<li>Ruby: <%= RUBY_VERSION %></li>
|
|
129
|
+
<li>Rack: <%= Rack::RELEASE %></li>
|
|
130
|
+
<li>Sinatra: <%= Sinatra::VERSION %></li>
|
|
131
|
+
<li>Pagy: <%= Pagy::VERSION %></li>
|
|
132
|
+
</ul>
|
|
133
|
+
|
|
134
|
+
<h3>Collection</h3>
|
|
135
|
+
<p id="records">@records: <%= @records.join(',') %></p>
|
|
136
|
+
|
|
137
|
+
<hr>
|
|
138
|
+
|
|
139
|
+
<h4>@pagy.series_nav</h4>
|
|
140
|
+
<%= @pagy.series_nav(id: 'series-nav',
|
|
141
|
+
aria_label: 'Pages nav') %>
|
|
142
|
+
|
|
143
|
+
<h4>@pagy.series_nav_js (responsive)</h4>
|
|
144
|
+
<%= @pagy.series_nav_js(id: 'series-nav-js-responsive',
|
|
145
|
+
aria_label: 'Pages nav_js_responsive',
|
|
146
|
+
steps: { 0 => 5, 500 => 7, 600 => 9, 700 => 11 }) %>
|
|
147
|
+
|
|
148
|
+
<h4>@pagy.input_nav_js</h4>
|
|
149
|
+
<%= @pagy.input_nav_js(id: 'input-nav-js',
|
|
150
|
+
aria_label: 'Pages input_nav_js') %>
|
|
151
|
+
|
|
152
|
+
<h4>@pagy.limit_tag_js</h4>
|
|
153
|
+
<%= @pagy.limit_tag_js(id: 'limit-tag-js') %>
|
|
154
|
+
|
|
155
|
+
<h4>@pagy.info_tag</h4>
|
|
156
|
+
<%= @pagy.info_tag(id: 'pagy-info') %>
|
|
157
|
+
</div>
|
|
158
|
+
ERB
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Simple array-based collection that acts as a standard DB collection.
|
|
163
|
+
# Use it as a simple way to get a collection that acts as an AR scope, but without any DB
|
|
164
|
+
# or create an ActiveRecord class or anything else that you need instead
|
|
165
|
+
class MockCollection < Array
|
|
166
|
+
def initialize(arr = Array(1..1000))
|
|
167
|
+
super
|
|
168
|
+
@collection = clone
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def offset(value)
|
|
172
|
+
@collection = self[value..] || []
|
|
173
|
+
self
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def limit(value)
|
|
177
|
+
@collection.empty? ? [] : @collection[0, value]
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def count(*)
|
|
181
|
+
size
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
run PagyRepro
|
data/bin/pagy
ADDED
data/config/pagy.rb
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Pagy initializer file (43.5.1)
|
|
4
|
+
# See https://ddnexus.github.io/pagy/toolbox/configuration/initializer/
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
############ Global Options ################################################################
|
|
8
|
+
# See https://ddnexus.github.io/pagy/toolbox/configuration/options/ for details.
|
|
9
|
+
# Examples:
|
|
10
|
+
#
|
|
11
|
+
# Pagy::OPTIONS[:limit] = 10 # Limit the items per page
|
|
12
|
+
# Pagy::OPTIONS[:max_limit] = 100 # The client is allowed to request a limit up to 100
|
|
13
|
+
# Pagy::OPTIONS[:jsonapi] = true # Use JSON:API compliant URLs
|
|
14
|
+
|
|
15
|
+
Pagy::OPTIONS.freeze
|
|
16
|
+
|
|
17
|
+
############ JS and CSS Resources ##########################################################
|
|
18
|
+
# See https://ddnexus.github.io/pagy/resources/javascript/
|
|
19
|
+
# and https://ddnexus.github.io/pagy/resources/stylesheets/ for details.
|
|
20
|
+
# Sync example:
|
|
21
|
+
#
|
|
22
|
+
# if Rails.env.development?
|
|
23
|
+
# Pagy.sync(:javascript, Rails.root.join('app/javascript'), 'pagy.mjs')
|
|
24
|
+
# Pagy.sync(:stylesheet, Rails.root.join('app/stylesheets'), 'pagy.css')
|
|
25
|
+
# end
|
|
26
|
+
#
|
|
27
|
+
# Pipeline example:
|
|
28
|
+
#
|
|
29
|
+
# Rails.application.config.assets.paths << Pagy::ROOT.join(':javascripts')
|
|
30
|
+
# Rails.application.config.assets.paths << Pagy::ROOT.join(':stylesheets')
|
|
31
|
+
|
|
32
|
+
############# Overriding Pagy::I18n Lookup #################################################
|
|
33
|
+
# See https://ddnexus.github.io/pagy/resources/i18n/ for details.
|
|
34
|
+
# Example for Rails:
|
|
35
|
+
#
|
|
36
|
+
# Pagy::I18n.pathnames << Rails.root.join('config/locales/pagy')
|
|
37
|
+
|
|
38
|
+
############# I18n Gem Translation #########################################################
|
|
39
|
+
# See https://ddnexus.github.io/pagy/resources/i18n/ for details.
|
|
40
|
+
#
|
|
41
|
+
# Pagy.translate_with_the_slower_i18n_gem!
|
|
42
|
+
|
|
43
|
+
############# Calendar Localization for non-en locales ####################################
|
|
44
|
+
# See https://ddnexus.github.io/pagy/toolbox/paginators/calendar#localization for details.
|
|
45
|
+
#
|
|
46
|
+
# Pagy::Calendar.localize_with_rails_i18n_gem(*your_locales)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const PagyAIWidget = {
|
|
2
|
+
HOST_ID: 'gurubase-chat-widget-container',
|
|
3
|
+
IMG_SELECTOR: '#chatWindow > div.anteon-header > div > img',
|
|
4
|
+
NAME_SELECTOR: '#chatWindow > div.anteon-header > div > span',
|
|
5
|
+
DESCRIPTION_SELECTOR: '#chatWindow > div.chat-messages > div > p',
|
|
6
|
+
NEW_IMG_SIZE: '40px',
|
|
7
|
+
NEW_NAME: 'Ask Pagy AI',
|
|
8
|
+
NEW_DESCRIPTION: 'Pagy AI uses the latest data in the documentation to answer your questions.',
|
|
9
|
+
ICON_URL: 'https://github.com/ddnexus/pagy/blob/master/assets/images/pagy-the-frog.png?raw=true',
|
|
10
|
+
skipTurbo: true,
|
|
11
|
+
|
|
12
|
+
checkAndEdit: function() {
|
|
13
|
+
const hostElement = document.getElementById(this.HOST_ID);
|
|
14
|
+
if (hostElement && hostElement.shadowRoot) {
|
|
15
|
+
const shadowRoot = hostElement.shadowRoot;
|
|
16
|
+
const img = shadowRoot.querySelector(this.IMG_SELECTOR);
|
|
17
|
+
const name = shadowRoot.querySelector(this.NAME_SELECTOR);
|
|
18
|
+
const description = shadowRoot.querySelector(this.DESCRIPTION_SELECTOR);
|
|
19
|
+
|
|
20
|
+
if (img) {
|
|
21
|
+
img.style.maxWidth = this.NEW_IMG_SIZE;
|
|
22
|
+
img.style.maxHeight = this.NEW_IMG_SIZE;
|
|
23
|
+
}
|
|
24
|
+
if (name) {
|
|
25
|
+
name.textContent = this.NEW_NAME;
|
|
26
|
+
}
|
|
27
|
+
if (description) {
|
|
28
|
+
description.textContent = this.NEW_DESCRIPTION;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
attemptEditing: function() {
|
|
36
|
+
if (this.checkAndEdit()) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
setTimeout(() => this.attemptEditing(), 200);
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
editChatWidget: function() {
|
|
43
|
+
this.attemptEditing();
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
appendWidgetScript: function() {
|
|
47
|
+
const script = document.createElement('script');
|
|
48
|
+
const hostname = window.location.hostname;
|
|
49
|
+
|
|
50
|
+
switch (hostname) {
|
|
51
|
+
case 'ddnexus.github.io': // remote docs
|
|
52
|
+
script.dataset.widgetId = 'HKtFSPZLGiAXOdBWS4rSAxEkqv8czIbJoQdMEwCqgEc';
|
|
53
|
+
script.dataset.margins = '{"bottom": "1.48rem", "right": "6rem"}';
|
|
54
|
+
break;
|
|
55
|
+
case 'localhost': // local docs
|
|
56
|
+
script.dataset.widgetId = 'djgBhRlpdH8b07oj0Gsaerz69Xfs0FXMuUluyOo2iR4';
|
|
57
|
+
script.dataset.margins = '{"bottom": "1.48rem", "right": "6rem"}';
|
|
58
|
+
break;
|
|
59
|
+
case '127.0.0.1': // apps
|
|
60
|
+
script.dataset.widgetId = '_rXLissYyqe-dJ9vGGGXzmJwavoW0GvuzQPEq5BZjP8';
|
|
61
|
+
break;
|
|
62
|
+
default:
|
|
63
|
+
console.error('Pagy AI - Unknown hostname: ', hostname);
|
|
64
|
+
}
|
|
65
|
+
script.async = true;
|
|
66
|
+
script.src = 'https://widget.gurubase.io/widget.latest.min.js';
|
|
67
|
+
script.id = 'guru-widget-id';
|
|
68
|
+
script.dataset.iconUrl = this.ICON_URL;
|
|
69
|
+
script.dataset.text = 'Pagy AI';
|
|
70
|
+
script.dataset.bgColor = '#1f7a1f';
|
|
71
|
+
script.dataset.lightMode = 'auto';
|
|
72
|
+
script.dataset.tooltipSide = 'bottom';
|
|
73
|
+
document.head.appendChild(script);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
78
|
+
PagyAIWidget.appendWidgetScript();
|
|
79
|
+
PagyAIWidget.editChatWidget();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
document.addEventListener("turbo:load", () => {
|
|
83
|
+
// skip only the first time (already done by DOMContentLoaded)
|
|
84
|
+
if (PagyAIWidget.skipTurbo) {
|
|
85
|
+
PagyAIWidget.skipTurbo = false;
|
|
86
|
+
} else {
|
|
87
|
+
window.chatWidget = new ChatWidget();
|
|
88
|
+
PagyAIWidget.editChatWidget();
|
|
89
|
+
}
|
|
90
|
+
});
|
data/javascripts/pagy.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// pagy.ts
|
|
2
|
+
var pagy_default = (() => {
|
|
3
|
+
const storageSupport = "sessionStorage" in window && "BroadcastChannel" in window;
|
|
4
|
+
let pagy = "pagy", storage, sync, tabId;
|
|
5
|
+
if (storageSupport) {
|
|
6
|
+
storage = sessionStorage;
|
|
7
|
+
sync = new BroadcastChannel(pagy);
|
|
8
|
+
tabId = Date.now();
|
|
9
|
+
sync.addEventListener("message", (e) => {
|
|
10
|
+
if (e.data.from) {
|
|
11
|
+
const cutoffs = storage.getItem(e.data.key);
|
|
12
|
+
if (cutoffs) {
|
|
13
|
+
sync.postMessage({ to: e.data.from, key: e.data.key, str: cutoffs });
|
|
14
|
+
}
|
|
15
|
+
} else if (e.data.to) {
|
|
16
|
+
if (e.data.to == tabId) {
|
|
17
|
+
storage.setItem(e.data.key, e.data.str);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const rjsObserver = new ResizeObserver((entries) => {
|
|
23
|
+
entries.forEach((e) => {
|
|
24
|
+
e.target.querySelectorAll(".pagy-rjs").forEach((el) => {
|
|
25
|
+
el.render();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
const B64SafeEncode = (unicode) => btoa(String.fromCharCode(...new TextEncoder().encode(unicode))).replace(/[+/=]/g, (m) => m == "+" ? "-" : m == "/" ? "_" : ""), B64Decode = (base64) => new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
|
|
30
|
+
const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36);
|
|
31
|
+
const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => {
|
|
32
|
+
let augmentPage;
|
|
33
|
+
const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey();
|
|
34
|
+
document.cookie = `${pagy}=${browserKey}`;
|
|
35
|
+
if (storageKey && !(storageKey in storage)) {
|
|
36
|
+
sync.postMessage({ from: tabId, key: storageKey });
|
|
37
|
+
await new Promise((resolve) => setTimeout(() => {
|
|
38
|
+
resolve("");
|
|
39
|
+
}, 100));
|
|
40
|
+
if (!(storageKey in storage)) {
|
|
41
|
+
augmentPage = (page) => `${page}+${String(last)}`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!augmentPage) {
|
|
45
|
+
if (!storageKey) {
|
|
46
|
+
do {
|
|
47
|
+
storageKey = randKey();
|
|
48
|
+
} while (storageKey in storage);
|
|
49
|
+
}
|
|
50
|
+
const data = storage.getItem(storageKey), cutoffs = data ? JSON.parse(data) : [undefined];
|
|
51
|
+
if (spliceArgs) {
|
|
52
|
+
cutoffs.splice(...spliceArgs);
|
|
53
|
+
storage.setItem(storageKey, JSON.stringify(cutoffs));
|
|
54
|
+
}
|
|
55
|
+
augmentPage = (page) => {
|
|
56
|
+
const pageNum = parseInt(page);
|
|
57
|
+
return B64SafeEncode(JSON.stringify([
|
|
58
|
+
browserKey,
|
|
59
|
+
storageKey,
|
|
60
|
+
pageNum,
|
|
61
|
+
cutoffs.length,
|
|
62
|
+
cutoffs[pageNum - 1],
|
|
63
|
+
cutoffs[pageNum]
|
|
64
|
+
]));
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey;
|
|
68
|
+
const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`);
|
|
69
|
+
for (const a of nav.querySelectorAll("a[href]")) {
|
|
70
|
+
a.href = a.href.replace(re, (_match, prefix, digit) => `${String(prefix)}${augmentPage(digit)}`);
|
|
71
|
+
}
|
|
72
|
+
return augmentPage;
|
|
73
|
+
};
|
|
74
|
+
const buildNavJs = (nav, [
|
|
75
|
+
[before, anchor, current, gap, after],
|
|
76
|
+
pageToken,
|
|
77
|
+
[widths, series, labels],
|
|
78
|
+
keynavArgs
|
|
79
|
+
]) => {
|
|
80
|
+
const parent = nav.parentElement;
|
|
81
|
+
let lastWidth = -1;
|
|
82
|
+
(nav.render = () => {
|
|
83
|
+
const index = widths.findIndex((w) => w < parent.clientWidth);
|
|
84
|
+
if (widths[index] === lastWidth) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
let html = before;
|
|
88
|
+
series[index].forEach((item, i) => {
|
|
89
|
+
html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? `${String(item)}<`);
|
|
90
|
+
});
|
|
91
|
+
html += after;
|
|
92
|
+
nav.innerHTML = "";
|
|
93
|
+
nav.insertAdjacentHTML("afterbegin", html);
|
|
94
|
+
lastWidth = widths[index];
|
|
95
|
+
if (keynavArgs && storageSupport) {
|
|
96
|
+
augmentKeynav(nav, keynavArgs);
|
|
97
|
+
}
|
|
98
|
+
})();
|
|
99
|
+
if (nav.classList.contains(pagy + "-rjs")) {
|
|
100
|
+
rjsObserver.observe(parent);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const initInputNavJs = async (nav, [url_token, pageToken, keynavArgs]) => {
|
|
104
|
+
const augment = keynavArgs && storageSupport ? await augmentKeynav(nav, keynavArgs) : (page) => page;
|
|
105
|
+
initInput(nav, (inputValue) => url_token.replace(pageToken, augment(inputValue)));
|
|
106
|
+
};
|
|
107
|
+
const initLimitTagJs = (span, [from, url_token, page_token, limitToken]) => {
|
|
108
|
+
initInput(span, (inputValue) => {
|
|
109
|
+
return url_token.replace(page_token, Math.max(Math.ceil(from / parseInt(inputValue)), 1)).replace(limitToken, inputValue);
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
const initInput = (element, getUrl) => {
|
|
113
|
+
const input = element.querySelector("input"), link = element.querySelector("a");
|
|
114
|
+
let initial = input.value;
|
|
115
|
+
const action = () => {
|
|
116
|
+
if (input.value === initial) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0);
|
|
120
|
+
if (val < min || val > max) {
|
|
121
|
+
input.value = initial;
|
|
122
|
+
input.select();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
initial = input.value;
|
|
126
|
+
link.href = getUrl(input.value);
|
|
127
|
+
link.click();
|
|
128
|
+
};
|
|
129
|
+
input.addEventListener("focus", () => {
|
|
130
|
+
input.select();
|
|
131
|
+
});
|
|
132
|
+
input.addEventListener("focusout", action);
|
|
133
|
+
input.addEventListener("keypress", (e) => {
|
|
134
|
+
if (e.key == "Enter") {
|
|
135
|
+
action();
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
return {
|
|
140
|
+
version: "43.5.1",
|
|
141
|
+
init(arg) {
|
|
142
|
+
const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]");
|
|
143
|
+
for (const element of elements) {
|
|
144
|
+
try {
|
|
145
|
+
const [helperId, ...args] = JSON.parse(B64Decode(element.getAttribute("data-pagy")));
|
|
146
|
+
if (helperId == "k") {
|
|
147
|
+
augmentKeynav(element, ...args);
|
|
148
|
+
} else if (helperId == "snj") {
|
|
149
|
+
buildNavJs(element, args);
|
|
150
|
+
} else if (helperId == "inj") {
|
|
151
|
+
initInputNavJs(element, args);
|
|
152
|
+
} else if (helperId == "ltj") {
|
|
153
|
+
initLimitTagJs(element, args);
|
|
154
|
+
}
|
|
155
|
+
} catch (err) {
|
|
156
|
+
console.warn(`Pagy.init: %o
|
|
157
|
+
%s`, element, err);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
})();
|
|
163
|
+
|
|
164
|
+
// pagy-shim.ts
|
|
165
|
+
window.Pagy = pagy_default;
|
|
166
|
+
|
|
167
|
+
//# debugId=688FC1BE541CE72564756E2164756E21
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyIsICJwYWd5LXNoaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW50ZXJmYWNlIFN5bmNEYXRhIHtcbiAgZnJvbT86IG51bWJlclxuICB0bz8gIDogbnVtYmVyXG4gIGtleSAgOiBzdHJpbmdcbiAgc3RyPyA6IHN0cmluZ1xufVxudHlwZSBJbml0QXJncyA9IFtcImtcIiwgIEtleW5hdkFyZ3NdIHwgICAgICAgICAgLy8gc2VyaWVzX25hdltfanNdIHdpdGgga2V5bmF2IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgW1wic25qXCIsIFNlcmllc05hdkpzQXJnc10gfCAgICAvLyBzZXJpZXNfbmF2X2pzXG4gICAgICAgICAgICAgICAgW1wiaW5qXCIsIElucHV0TmF2SnNBcmdzXSB8ICAgICAvLyBpbnB1dF9uYXZfanNcbiAgICAgICAgICAgICAgICBbXCJsdGpcIiwgTGltaXRUYWdKc0FyZ3NdOyAgICAgIC8vIGxpbWl0X3RhZ19qc1xudHlwZSBBdWdtZW50S2V5bmF2ID0gKG5hdjpIVE1MRWxlbWVudCwga2V5bmF2QXJnczpLZXluYXZBcmdzKSA9PiBQcm9taXNlPCgocGFnZTogc3RyaW5nKSA9PiBzdHJpbmcpPjtcbnR5cGUgS2V5bmF2QXJncyA9IHJlYWRvbmx5IFtzdG9yYWdlS2V5IDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290S2V5ICAgIDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlS2V5ICAgIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlQXJncz86IFNwbGljZUFyZ3NdO1xudHlwZSBTcGxpY2VBcmdzID0gcmVhZG9ubHkgW3N0YXJ0ICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IG51bWJlciwgICAgIC8vIGl0IHdvdWxkIGJlIG9wdGlvbmFsLCBidXQgdHMgY29tcGxhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXM6ICAgIEN1dG9mZltdXTtcbnR5cGUgQ3V0b2ZmID0gcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW107XG50eXBlIEF1Z21lbnRlZFBhZ2UgPSBbYnJvd3NlcklkICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlS2V5IDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZXMgICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvckN1dG9mZjogQ3V0b2ZmIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlQ3V0b2ZmIDogQ3V0b2ZmIHwgbnVsbF07XG50eXBlIFNlcmllc05hdkpzQXJncyA9IHJlYWRvbmx5IFtOYXZKc1Rva2VucywgcGFnZVRva2VuOiBzdHJpbmcsIE5hdkpzU2VyaWVzLCBLZXluYXZBcmdzP107XG50eXBlIE5hdkpzU2VyaWVzID0gcmVhZG9ubHkgW3dpZHRoczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogKHN0cmluZyB8IG51bWJlcilbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IHN0cmluZ1tdW10gfCBudWxsXTtcbnR5cGUgSW5wdXROYXZKc0FyZ3MgPSByZWFkb25seSBbdXJsVG9rZW46ICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUb2tlbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXluYXZBcmdzP107XG50eXBlIExpbWl0VGFnSnNBcmdzID0gcmVhZG9ubHkgW2Zyb20gICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsVG9rZW4gIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVG9rZW4gOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0VG9rZW46IHN0cmluZ107XG50eXBlIE5hdkpzVG9rZW5zID0gcmVhZG9ubHkgW2JlZm9yZSA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcCAgICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgIDogc3RyaW5nXTtcbmludGVyZmFjZSBOYXZKc0VsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIHJlbmRlcigpOiB2b2lkXG59XG5cbi8vIFRoZSBzeW50YXggdXNlZCBpbiB0aGlzIGZpbGUgaGFzIGJlZW4gY2FyZWZ1bGx5IGNvbXBvc2VkIHRvIG1pbmltaXplXG4vLyB0aGUgcGFneS5taW4uanMgc2l6ZSBhbmQgYXZvaWQgcG9sbHV0aW9uIGluIHRoZSB3aW5kb3cgb2JqZWN0LlxuZXhwb3J0IGRlZmF1bHQgKCgpID0+IHtcbiAgY29uc3Qgc3RvcmFnZVN1cHBvcnQgPSAnc2Vzc2lvblN0b3JhZ2UnIGluIHdpbmRvdyAmJiAnQnJvYWRjYXN0Q2hhbm5lbCcgaW4gd2luZG93O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCBwYWd5ID0gXCJwYWd5XCIsIHN0b3JhZ2U6IFN0b3JhZ2UsIHN5bmM6IEJyb2FkY2FzdENoYW5uZWwsIHRhYklkOiBudW1iZXI7XG4gIGlmIChzdG9yYWdlU3VwcG9ydCkge1xuICAgIHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZTsgLy8gc2hvcnRlbiB0aGUgY29tcGlsZWQgc2l6ZVxuICAgIHN5bmMgICAgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbChwYWd5KTtcbiAgICB0YWJJZCAgID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFN5bmMgdGhlIHNlc3Npb25TdG9yYWdlIGtleXMgZm9yIHRoZSBjdXRvZmZzIG9wZW5lZCBpbiBhIG5ldyB0YWIvd2luZG93XG4gICAgc3luYy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZTpNZXNzYWdlRXZlbnQ8U3luY0RhdGE+KSA9PiB7XG4gICAgICBpZiAoZS5kYXRhLmZyb20pIHsgLy8gcmVxdWVzdCBjdXRvZmZzXG4gICAgICAgIGNvbnN0IGN1dG9mZnMgPSBzdG9yYWdlLmdldEl0ZW0oZS5kYXRhLmtleSk7XG4gICAgICAgIGlmIChjdXRvZmZzKSB7XG4gICAgICAgICAgc3luYy5wb3N0TWVzc2FnZSg8U3luY0RhdGE+e3RvOiBlLmRhdGEuZnJvbSwga2V5OiBlLmRhdGEua2V5LCBzdHI6IGN1dG9mZnN9KTtcbiAgICAgICAgfSAvLyBzZW5kIHJlc3BvbnNlXG4gICAgICB9IGVsc2UgaWYgKGUuZGF0YS50bykgeyAgLy8gcmVjZWl2ZSBjdXRvZmZzXG4gICAgICAgIGlmIChlLmRhdGEudG8gPT0gdGFiSWQpIHtcbiAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oZS5kYXRhLmtleSwgPHN0cmluZz5lLmRhdGEuc3RyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gIGNvbnN0IHJqc09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGVudHJpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgIGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGw8TmF2SnNFbGVtZW50PihcIi5wYWd5LXJqc1wiKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwucmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLyogRnVsbCBzZXQgb2YgQjY0IGZ1bmN0aW9uc1xuICBjb25zdCBCNjRFbmNvZGUgICAgID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHVuaWNvZGUpKSksXG4gICAgICAgIEI2NFNhZmUgICAgICAgPSAodW5zYWZlOnN0cmluZykgID0+IHVuc2FmZS5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NFNhZmVFbmNvZGUgPSAodW5pY29kZTpzdHJpbmcpID0+IEI2NFNhZmUoQjY0RW5jb2RlKHVuaWNvZGUpKSxcbiAgICAgICAgQjY0RGVjb2RlICAgICA9IChiYXNlNjQ6c3RyaW5nKSAgPT4gKG5ldyBUZXh0RGVjb2RlcigpKS5kZWNvZGUoVWludDhBcnJheS5mcm9tKGF0b2IoYmFzZTY0KSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpKSxcbiAgICAgICAgQjY0VW5zYWZlICAgICA9IChzYWZlOnN0cmluZykgICAgPT4gc2FmZS5yZXBsYWNlKC9bLV9dL2csIChtYXRjaCkgPT4gbWF0Y2ggPT0gXCItXCIgPyBcIitcIiA6IFwiL1wiKSxcbiAgICAgICAgQjY0U2FmZURlY29kZSA9IChiYXNlNjQ6c3RyaW5nKSAgPT4gQjY0RGVjb2RlKEI2NFVuc2FmZShiYXNlNjQpKVxuICAqL1xuICBjb25zdCBCNjRTYWZlRW5jb2RlID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHVuaWNvZGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGtleTogMyBjaGFycyBtYXgsIGJhc2UtMzYgbnVtYmVyIDwgMzYqKjNcbiAgY29uc3QgcmFuZEtleSA9ICgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2ICoqIDMpLnRvU3RyaW5nKDM2KTtcblxuICAvLyBNYW5hZ2UgdGhlIHBhZ2UgYXVnbWVudGF0aW9uIGZvciBLZXluYXYsIGNhbGxlZCBvbmx5IGlmIHN0b3JhZ2VTdXBwb3J0XG4gIGNvbnN0IGF1Z21lbnRLZXluYXY6IEF1Z21lbnRLZXluYXYgPSBhc3luYyAobmF2LCBbc3RvcmFnZUtleSwgcm9vdEtleSwgcGFnZUtleSwgbGFzdCwgc3BsaWNlQXJnc10pID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYWxpZ24tYXNzaWdubWVudHMvYWxpZ24tYXNzaWdubWVudHNcbiAgICBsZXQgYXVnbWVudFBhZ2U6IChwYWdlOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBjb25zdCBicm93c2VyS2V5ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KC87XFxzKy8pICAvLyBpdCB3b3JrcyBldmVuIGlmIG1hbGZvcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKChyb3cpID0+IHJvdy5zdGFydHNXaXRoKHBhZ3kgKyBcIj1cIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5zcGxpdChcIj1cIilbMV0gPz8gcmFuZEtleSgpO1xuICAgIGRvY3VtZW50LmNvb2tpZSAgPSBgJHtwYWd5fT0ke2Jyb3dzZXJLZXl9YDsgIC8vIFNtYWxsZXIgLm1pbiBzaXplOiBzZXQgdGhlIGNvb2tpZSB3aXRob3V0IGNoZWNraW5nXG4gICAgaWYgKHN0b3JhZ2VLZXkgJiYgIShzdG9yYWdlS2V5IGluIHN0b3JhZ2UpKSB7XG4gICAgICAvLyBTeW5jIHRoZSBzZXNzaW9uZ1N0b3JhZ2UgZnJvbSBvdGhlciB0YWJzL3dpbmRvd3MgKGUuZy4sIG9wZW4gcGFnZSBpbiB0aGUgbmV3IHRhYi93aW5kb3cpXG4gICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57IGZyb206IHRhYklkLCBrZXk6IHN0b3JhZ2VLZXkgfSk7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbGlzdGVuZXIgdG8gY29weSB0aGUgY3V0b2ZmcyBpbiB0aGUgY3VycmVudCBzZXNzaW9uU3RvcmFnZVxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nfG51bGw+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHsgcmVzb2x2ZShcIlwiKSB9LCAxMDApKTtcbiAgICAgIGlmICghKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkpIHsgLy8gdGhlIHN0b3JhZ2VLZXkgZGlkbid0IGdldCBjb3BpZWQ6IGZhbGxiYWNrIHRvIGNvdW50bGVzcyBwYWdpbmF0aW9uXG4gICAgICAgIGF1Z21lbnRQYWdlID0gKHBhZ2U6IHN0cmluZykgPT4gYCR7cGFnZX0rJHtTdHJpbmcobGFzdCl9YDsgICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgSWYgaXQgaXMgbm90IGFzc2lnbmVkIGl0IG1lYW5zIGl0IHN1cHBvcnRzIGtleW5hdlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgaWYgKCFhdWdtZW50UGFnZSkgeyAvLyByZWd1bGFyIGtleW5hdiBwYWdpbmF0aW9uXG4gICAgICBpZiAoIXN0b3JhZ2VLZXkpIHsgZG8geyBzdG9yYWdlS2V5ID0gcmFuZEtleSgpIH0gd2hpbGUgKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkgfSAvLyBubyBkdXAga2V5c1xuICAgICAgY29uc3QgZGF0YSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSxcbiAgICAgICAgICBjdXRvZmZzID0gPEN1dG9mZltdPihkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IFt1bmRlZmluZWRdKTtcbiAgICAgIGlmIChzcGxpY2VBcmdzKSB7XG4gICAgICAgIGN1dG9mZnMuc3BsaWNlKC4uLnNwbGljZUFyZ3MpO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY3V0b2ZmcykpO1xuICAgICAgfVxuICAgICAgLy8gQXVnbWVudCBmdW5jdGlvblxuICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTpzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2UpO1xuICAgICAgICByZXR1cm4gQjY0U2FmZUVuY29kZShKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIDxBdWdtZW50ZWRQYWdlPlticm93c2VyS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzLmxlbmd0aCwgICAgICAgLy8gcGFnZXMvbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bSAtIDFdLCAvLyBwcmlvckN1dG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bV1dKSk7ICAvLyBwYWdlQ3V0b2ZmXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSAocm9vdEtleSkgPyBgJHtyb290S2V5fSU1QiR7cGFnZUtleX0lNURgIDogcGFnZUtleTtcbiAgICBjb25zdCByZSAgICAgPSBuZXcgUmVnRXhwKGAoPzw9XFxcXD8uKikoXFxcXGIke3NlYXJjaH09KShcXFxcZCspYCk7XG4gICAgLy8gQXVnbWVudCB0aGUgcGFnZSBwYXJhbSBvZiBlYWNoIGhyZWZcbiAgICBmb3IgKGNvbnN0IGEgb2YgPE5vZGVMaXN0T2Y8SFRNTEFuY2hvckVsZW1lbnQ+Pjx1bmtub3duPm5hdi5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykpIHtcbiAgICAgIGEuaHJlZiA9IGEuaHJlZi5yZXBsYWNlKHJlLCAoX21hdGNoLCBwcmVmaXgsIGRpZ2l0KTogc3RyaW5nID0+IGAke1N0cmluZyhwcmVmaXgpfSR7YXVnbWVudFBhZ2UoPHN0cmluZz5kaWdpdCl9YCk7XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUgYXVnbWVudCBmdW5jdGlvbiBmb3IgZnVydGhlciBhdWdtZW50YXRpb24gKGkuZS4sIHVybCB0b2tlbiBpbiBpbnB1dF9uYXZfanMpXG4gICAgcmV0dXJuIGF1Z21lbnRQYWdlO1xuICB9O1xuXG4gIC8vIEJ1aWxkIHRoZSBzZXJpZXNfbmF2X2pzIGhlbHBlclxuICBjb25zdCBidWlsZE5hdkpzID0gKG5hdjpOYXZKc0VsZW1lbnQsIFtbYmVmb3JlLCBhbmNob3IsIGN1cnJlbnQsIGdhcCwgYWZ0ZXJdLCBwYWdlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRocywgc2VyaWVzLCBsYWJlbHNdLCBrZXluYXZBcmdzXTpTZXJpZXNOYXZKc0FyZ3MpID0+IHtcbiAgICBjb25zdCAgcGFyZW50ID0gPEhUTUxFbGVtZW50Pm5hdi5wYXJlbnRFbGVtZW50O1xuICAgIGxldCBsYXN0V2lkdGggPSAtMTtcbiAgICAobmF2LnJlbmRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gd2lkdGhzLmZpbmRJbmRleCh3ID0+IHcgPCBwYXJlbnQuY2xpZW50V2lkdGgpO1xuICAgICAgaWYgKHdpZHRoc1tpbmRleF0gPT09IGxhc3RXaWR0aCkgeyByZXR1cm4gfSAvLyBubyBjaGFuZ2U6IGFib3J0XG5cbiAgICAgIGxldCBodG1sID0gYmVmb3JlO1xuICAgICAgc2VyaWVzW2luZGV4XS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIC8vIEF2b2lkIHRoZSBpZiBibG9ja3MgYW5kIGNoYWluIHRoZSByZXN1bHRzIChzaG9ydGVyIHBhZ3kubWluLmpzIGFuZCBlYXNpZXIgcmVhZGluZylcbiAgICAgICAgaHRtbCArPSBpdGVtID09IFwiZ2FwXCIgPyBnYXAgOlxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIGl0ZW0gbWF5IGJlIGEgbnVtYmVyLCBidXQgdGhlICdyZXBsYWNlJyBjb252ZXJ0cyBpdCB0byBzdHJpbmcgKHNob3J0ZXIgcGFneS5taW4uanMpXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBpdGVtID09IFwibnVtYmVyXCIgPyBhbmNob3IucmVwbGFjZShwYWdlVG9rZW4sIGl0ZW0pIDogY3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCJMPFwiLCBsYWJlbHM/LltpbmRleF1baV0gPz8gYCR7U3RyaW5nKGl0ZW0pfTxgKTtcbiAgICAgIH0pO1xuICAgICAgaHRtbCAgICAgICAgICs9IGFmdGVyO1xuICAgICAgbmF2LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICBuYXYuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgIGxhc3RXaWR0aCA9IHdpZHRoc1tpbmRleF07XG4gICAgICBpZiAoa2V5bmF2QXJncyAmJiBzdG9yYWdlU3VwcG9ydCkgeyB2b2lkIGF1Z21lbnRLZXluYXYobmF2LCBrZXluYXZBcmdzKSB9XG4gICAgfSkoKTtcbiAgICBpZiAobmF2LmNsYXNzTGlzdC5jb250YWlucyhwYWd5ICsgXCItcmpzXCIpKSB7IHJqc09ic2VydmVyLm9ic2VydmUocGFyZW50KSB9XG4gIH07XG5cbiAgLy8gSW5pdCB0aGUgaW5wdXRfbmF2X2pzIGhlbHBlcnNcbiAgY29uc3QgaW5pdElucHV0TmF2SnMgPSBhc3luYyAobmF2OkhUTUxFbGVtZW50LCBbdXJsX3Rva2VuLCBwYWdlVG9rZW4sIGtleW5hdkFyZ3NdOklucHV0TmF2SnNBcmdzKSA9PiB7XG4gICAgY29uc3QgYXVnbWVudCA9IGtleW5hdkFyZ3MgJiYgc3RvcmFnZVN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBhdWdtZW50S2V5bmF2KG5hdiwga2V5bmF2QXJncylcbiAgICAgICAgICAgICAgICAgICAgOiAocGFnZTogc3RyaW5nKSA9PiBwYWdlO1xuICAgIGluaXRJbnB1dChuYXYsIGlucHV0VmFsdWUgPT4gdXJsX3Rva2VuLnJlcGxhY2UocGFnZVRva2VuLCBhdWdtZW50KGlucHV0VmFsdWUpKSk7XG4gIH07XG5cbiAgLy8gSW5pdCB0aGUgbGltaXRfdGFnX2pzIGhlbHBlclxuICBjb25zdCBpbml0TGltaXRUYWdKcyA9IChzcGFuOkhUTUxTcGFuRWxlbWVudCwgW2Zyb20sIHVybF90b2tlbiwgcGFnZV90b2tlbiwgbGltaXRUb2tlbl06TGltaXRUYWdKc0FyZ3MpID0+IHtcbiAgICBpbml0SW5wdXQoc3BhbiwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBwYWdlIGlzIGEgbnVtYmVyLCBidXQgdGhlICdyZXBsYWNlJyBjb252ZXJ0cyBpdCB0byBzdHJpbmcgKHNob3J0ZXIgcGFneS5taW4uanMpXG4gICAgICByZXR1cm4gdXJsX3Rva2VuLnJlcGxhY2UocGFnZV90b2tlbiwgTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpKVxuICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGxpbWl0VG9rZW4sIGlucHV0VmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGlucHV0IGVsZW1lbnRcbiAgY29uc3QgaW5pdElucHV0ID0gKGVsZW1lbnQ6SFRNTEVsZW1lbnQsIGdldFVybDoodjpzdHJpbmcpID0+IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlucHV0ICAgPSA8SFRNTElucHV0RWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKSxcbiAgICAgICAgICBsaW5rICAgID0gPEhUTUxBbmNob3JFbGVtZW50PmVsZW1lbnQucXVlcnlTZWxlY3RvcihcImFcIik7XG4gICAgbGV0ICAgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgIGNvbnN0IGFjdGlvbiAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFttaW4sIHZhbCwgbWF4XSA9IFtpbnB1dC5taW4sIGlucHV0LnZhbHVlLCBpbnB1dC5tYXhdLm1hcChuID0+IHBhcnNlSW50KG4pIHx8IDApO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7ICAvLyByZXNldCBpbnZhbGlkL291dC1vZi1yYW5nZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBpbml0aWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgICA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGdldFVybChpbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoKSA9PiB7IGlucHV0LnNlbGVjdCgpIH0pO1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBhY3Rpb24pO1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCBlID0+IHsgaWYgKGUua2V5ID09IFwiRW50ZXJcIikgeyBhY3Rpb24oKSB9IH0pO1xuICB9O1xuXG4gIC8vIFB1YmxpYyBpbnRlcmZhY2VcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBcIjQzLjUuMVwiLFxuXG4gICAgLy8gU2NhbiBmb3IgZWxlbWVudHMgd2l0aCBhIFwiZGF0YS1wYWd5XCIgYXR0cmlidXRlIGFuZCBjYWxsIHRoZWlyIGluaXQgZnVuY3Rpb25zIHdpdGggdGhlIGRlY29kZWQgYXJnc1xuICAgIGluaXQoYXJnPzpIVE1MRWxlbWVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYXJnIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudCxcbiAgICAgICAgICAgIGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiA8Tm9kZUxpc3RPZjxIVE1MRWxlbWVudD4+ZWxlbWVudHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbaGVscGVySWQsIC4uLmFyZ3NdID0gPEluaXRBcmdzPkpTT04ucGFyc2UoQjY0RGVjb2RlKDxzdHJpbmc+ZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikpKTtcbiAgICAgICAgICBpZiAoaGVscGVySWQgPT0gXCJrXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3ByZWFkIDIgYXJndW1lbnRzLCBub3QgMyBhcyBpdCBjb21wbGFpbnMgYWJvdXRcbiAgICAgICAgICAgIHZvaWQgYXVnbWVudEtleW5hdihlbGVtZW50LCAuLi48S2V5bmF2QXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwic25qXCIpIHtcbiAgICAgICAgICAgIGJ1aWxkTmF2SnMoPE5hdkpzRWxlbWVudD5lbGVtZW50LCA8U2VyaWVzTmF2SnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJpbmpcIikge1xuICAgICAgICAgICAgdm9pZCBpbml0SW5wdXROYXZKcyhlbGVtZW50LCA8SW5wdXROYXZKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJsdGpcIikge1xuICAgICAgICAgICAgaW5pdExpbWl0VGFnSnMoZWxlbWVudCwgPExpbWl0VGFnSnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlbHNlIHsgY29uc29sZS53YXJuKFwiUGFneS5pbml0OiAlb1xcblVua25vd24gaGVscGVySWQgJyVzJ1wiLCBlbGVtZW50LCBoZWxwZXJJZCkgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS53YXJuKFwiUGFneS5pbml0OiAlb1xcbiVzXCIsIGVsZW1lbnQsIGVycikgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pKCk7XG4iLAogICAgImltcG9ydCBQYWd5IGZyb20gXCIuL3BhZ3kudHNcIlxud2luZG93LlBhZ3kgPSBQYWd5XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBZ0RBLElBQWdCLHNCQUFNO0FBQUEsRUFDcEIsTUFBTSxpQkFBaUIsb0JBQW9CLFVBQVUsc0JBQXNCO0FBQUEsRUFFM0UsSUFBSSxPQUFPLFFBQVEsU0FBa0IsTUFBd0I7QUFBQSxFQUM3RCxJQUFJLGdCQUFnQjtBQUFBLElBQ2xCLFVBQVU7QUFBQSxJQUNWLE9BQVUsSUFBSSxpQkFBaUIsSUFBSTtBQUFBLElBQ25DLFFBQVUsS0FBSyxJQUFJO0FBQUEsSUFHbkIsS0FB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
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
window.Pagy=(()=>{let B="sessionStorage"in window&&"BroadcastChannel"in window,L="pagy",Z,O,W;if(B)Z=sessionStorage,O=new BroadcastChannel(L),W=Date.now(),O.addEventListener("message",(q)=>{if(q.data.from){let z=Z.getItem(q.data.key);if(z)O.postMessage({to:q.data.from,key:q.data.key,str:z})}else if(q.data.to){if(q.data.to==W)Z.setItem(q.data.key,q.data.str)}});let V=new ResizeObserver((q)=>{q.forEach((z)=>{z.target.querySelectorAll(".pagy-rjs").forEach((C)=>{C.render()})})}),_=(q)=>btoa(String.fromCharCode(...new TextEncoder().encode(q))).replace(/[+/=]/g,(z)=>z=="+"?"-":z=="/"?"_":""),x=(q)=>new TextDecoder().decode(Uint8Array.from(atob(q),(z)=>z.charCodeAt(0))),P=()=>Math.floor(Math.random()*46656).toString(36),J=async(q,[z,C,F,H,G])=>{let Q,X=document.cookie.split(/;\s+/).find((M)=>M.startsWith(L+"="))?.split("=")[1]??P();if(document.cookie=`${L}=${X}`,z&&!(z in Z)){if(O.postMessage({from:W,key:z}),await new Promise((M)=>setTimeout(()=>{M("")},100)),!(z in Z))Q=(M)=>`${M}+${String(H)}`}if(!Q){if(!z)do z=P();while(z in Z);let M=Z.getItem(z),Y=M?JSON.parse(M):[void 0];if(G)Y.splice(...G),Z.setItem(z,JSON.stringify(Y));Q=($)=>{let R=parseInt($);return _(JSON.stringify([X,z,R,Y.length,Y[R-1],Y[R]]))}}let D=C?`${C}%5B${F}%5D`:F,E=new RegExp(`(?<=\\?.*)(\\b${D}=)(\\d+)`);for(let M of q.querySelectorAll("a[href]"))M.href=M.href.replace(E,(Y,$,R)=>`${String($)}${Q(R)}`);return Q},T=(q,[[z,C,F,H,G],Q,[X,D,E],M])=>{let Y=q.parentElement,$=-1;if((q.render=()=>{let R=X.findIndex((j)=>j<Y.clientWidth);if(X[R]===$)return;let U=z;if(D[R].forEach((j,I)=>{U+=j=="gap"?H:(typeof j=="number"?C.replace(Q,j):F).replace("L<",E?.[R][I]??`${String(j)}<`)}),U+=G,q.innerHTML="",q.insertAdjacentHTML("afterbegin",U),$=X[R],M&&B)J(q,M)})(),q.classList.contains(L+"-rjs"))V.observe(Y)},w=async(q,[z,C,F])=>{let H=F&&B?await J(q,F):(G)=>G;S(q,(G)=>z.replace(C,H(G)))},A=(q,[z,C,F,H])=>{S(q,(G)=>{return C.replace(F,Math.max(Math.ceil(z/parseInt(G)),1)).replace(H,G)})},S=(q,z)=>{let C=q.querySelector("input"),F=q.querySelector("a"),H=C.value,G=()=>{if(C.value===H)return;let[Q,X,D]=[C.min,C.value,C.max].map((E)=>parseInt(E)||0);if(X<Q||X>D){C.value=H,C.select();return}H=C.value,F.href=z(C.value),F.click()};C.addEventListener("focus",()=>{C.select()}),C.addEventListener("focusout",G),C.addEventListener("keypress",(Q)=>{if(Q.key=="Enter")G()})};return{version:"43.5.1",init(q){let z=q instanceof HTMLElement?q:document,C=z.querySelectorAll("[data-pagy]");for(let F of C)try{let[H,...G]=JSON.parse(x(F.getAttribute("data-pagy")));if(H=="k")J(F,...G);else if(H=="snj")T(F,G);else if(H=="inj")w(F,G);else if(H=="ltj")A(F,G)}catch(H){console.warn(`Pagy.init: %o
|
|
2
|
+
%s`,F,H)}}}})();
|