bullet_train 1.0.60 → 1.0.61

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a31a2c2246fb6f2d9e82e21d6e2a54677c659004925e6a0e05362049784821f
4
- data.tar.gz: 209e1be3698752408c23ccceedd74aabcb15d7d67bc418fed0bcca0ab27a2853
3
+ metadata.gz: 4fea59622718639896bc50bb9d91d934331a3f985fd65e22703c1ca19025d349
4
+ data.tar.gz: f50597d18f7d906c487ff60479b4bbe7ba8bc3cbf7111b1735b394fbc0c11a4f
5
5
  SHA512:
6
- metadata.gz: 01e2fda3d6f57bc96e8f45fac0eda8b32b18384d3af0c15909791b8c97611ffd8c1e4fe998b91b33c687835a68a0063d4d64d53bd278bc025bd935f351c78445
7
- data.tar.gz: f5a8ff518213dc2b9e16c02996e04da2e0a73db51f24021bef3ad6d2d364b36352bbb88f91b69823286d18c46d77f22d8792e5a761d8647e4e2ebaf63b7d498a
6
+ metadata.gz: 41bb8cc66fcef89d33bb568dd2f656eda2c2de1614ca21188d188b35a8385f7407fa682ce67fbd686cc81c0f854195e3e360a9682b9627f6151ecc3a12bd972a
7
+ data.tar.gz: 8bf40a3c0748b733708d7ddd5dfb33c6034b62ff437101c96d8b0e1fe48cc512c07836f00f060b9e750a5d9146669b64f1f550e815a50fd8312ffa38c1710b45
@@ -1,3 +1,3 @@
1
1
  module BulletTrain
2
- VERSION = "1.0.60"
2
+ VERSION = "1.0.61"
3
3
  end
@@ -56,4 +56,178 @@ namespace :bullet_train do
56
56
  warn "\nšŸš… Usage: `bin/resolve [path, partial, or URL] (--eject) (--open)`\n".blue
57
57
  end
58
58
  end
59
+
60
+ task :develop, [:all_options] => :environment do |t, arguments|
61
+ def stream(command, prefix = " ")
62
+ puts ""
63
+
64
+ begin
65
+ trap("SIGINT") { throw :ctrl_c }
66
+
67
+ IO.popen(command) do |io|
68
+ while (line = io.gets)
69
+ puts "#{prefix}#{line}"
70
+ end
71
+ end
72
+ rescue UncaughtThrowError
73
+ puts "Received a <Control + C>. Exiting the child process.".blue
74
+ end
75
+
76
+ puts ""
77
+ end
78
+
79
+ # TODO Extract this into a YAML file.
80
+ framework_packages = {
81
+ "bullet_train" => {
82
+ git: "https://github.com/bullet-train-co/bullet_train-base",
83
+ npm: "@bullet-train/bullet-train"
84
+ },
85
+ "bullet_train-api" => {
86
+ git: "https://github.com/bullet-train-co/bullet_train-api",
87
+ },
88
+ "bullet_train-fields" => {
89
+ git: "https://github.com/bullet-train-co/bullet_train-fields",
90
+ npm: "@bullet-train/fields"
91
+ },
92
+ "bullet_train-has_uuid" => {
93
+ git: "https://github.com/bullet-train-co/bullet_train-has_uuid",
94
+ },
95
+ "bullet_train-incoming_webhooks" => {
96
+ git: "https://github.com/bullet-train-co/bullet_train-incoming_webhooks",
97
+ },
98
+ "bullet_train-integrations" => {
99
+ git: "https://github.com/bullet-train-co/bullet_train-integrations",
100
+ },
101
+ "bullet_train-integrations-stripe" => {
102
+ git: "https://github.com/bullet-train-co/bullet_train-base-integrations-stripe",
103
+ },
104
+ "bullet_train-obfuscates_id" => {
105
+ git: "https://github.com/bullet-train-co/bullet_train-obfuscates_id",
106
+ },
107
+ "bullet_train-outgoing_webhooks" => {
108
+ git: "https://github.com/bullet-train-co/bullet_train-outgoing_webhooks",
109
+ },
110
+ "bullet_train-outgoing_webhooks-core" => {
111
+ git: "https://github.com/bullet-train-co/bullet_train-outgoing_webhooks-core",
112
+ },
113
+ "bullet_train-scope_questions" => {
114
+ git: "https://github.com/bullet-train-co/bullet_train-scope_questions",
115
+ },
116
+ "bullet_train-scope_validator" => {
117
+ git: "https://github.com/bullet-train-co/bullet_train-scope_validator",
118
+ },
119
+ "bullet_train-sortable" => {
120
+ git: "https://github.com/bullet-train-co/bullet_train-sortable",
121
+ npm: "@bullet-train/bullet-train-sortable"
122
+ },
123
+ "bullet_train-super_scaffolding" => {
124
+ git: "https://github.com/bullet-train-co/bullet_train-super_scaffolding",
125
+ },
126
+ "bullet_train-super_load_and_authorize_resource" => {
127
+ git: "https://github.com/bullet-train-co/bullet_train-super_load_and_authorize_resource",
128
+ },
129
+ "bullet_train-themes" => {
130
+ git: "https://github.com/bullet-train-co/bullet_train-themes",
131
+ },
132
+ "bullet_train-themes-base" => {
133
+ git: "https://github.com/bullet-train-co/bullet_train-themes-base",
134
+ },
135
+ "bullet_train-themes-light" => {
136
+ git: "https://github.com/bullet-train-co/bullet_train-themes-light",
137
+ },
138
+ "bullet_train-themes-tailwind_css" => {
139
+ git: "https://github.com/bullet-train-co/bullet_train-themes-tailwind_css",
140
+ },
141
+ }
142
+
143
+ puts "Which framework package do you want to work on?".blue
144
+ puts ""
145
+ framework_packages.each do |gem, details|
146
+ puts " #{framework_packages.keys.find_index(gem) + 1}. #{gem}".blue
147
+ end
148
+ puts ""
149
+ puts "Enter a number below and hit <Enter>:".blue
150
+ number = $stdin.gets.chomp
151
+
152
+ gem = framework_packages.keys[number.to_i - 1]
153
+
154
+ if gem
155
+ details = framework_packages[gem]
156
+
157
+ puts "OK! Let's work on `#{gem}` together!".green
158
+ puts ""
159
+ puts "First, we're going to clone a copy of the package repository.".blue
160
+
161
+ # TODO Prompt whether they want to check out their own forked version of the repository.
162
+
163
+ if File.exist?("local/#{gem}")
164
+ puts "Can't clone into `local/#{gem}` because it already exists. We will try to use what's already there.".yellow
165
+ puts "However, it will be up to you to make sure that working copy of the repository is in a clean state and checked out to the `main` branch or whatever you want to work on.".yellow
166
+ puts "Hit <Enter> to continue.".blue
167
+ $stdin.gets
168
+
169
+ # TODO We should check whether the local copy is in a clean state, and if it is, check out `main`.
170
+ # TODO We should also pull `origin/main` to make sure we're on the most up-to-date version of the package.
171
+ else
172
+ stream "git clone #{details[:git]} local/#{gem}"
173
+ end
174
+
175
+ # TODO Ask them whether they want to check out a specific branch to work on. (List available remote branches.)
176
+
177
+ puts ""
178
+ puts "Now we'll try to link up that repository in the `Gemfile`.".blue
179
+ if `cat Gemfile | grep "gem \\\"#{gem}\\\", path: \\\"local/#{gem}\\\""`.chomp.present?
180
+ puts "This gem is already linked to a checked out copy in `local` in the `Gemfile`.".green
181
+ elsif `cat Gemfile | grep "gem \\\"#{gem}\\\","`.chomp.present?
182
+ puts "This gem already has some sort of alternative source configured in the `Gemfile`.".yellow
183
+ puts "We can't do anything with this. Sorry! We'll proceed, but you have to link this package yourself.".red
184
+ elsif `cat Gemfile | grep "gem \\\"#{gem}\\\""`.chomp.present?
185
+ puts "This gem is directly present in the `Gemfile`, so we'll update that line.".green
186
+
187
+ text = File.read("Gemfile")
188
+ new_contents = text.gsub(/gem "#{gem}"/, "gem \"#{gem}\", path: \"local/#{gem}\"")
189
+ File.open("Gemfile", "w") { |file| file.puts new_contents }
190
+ else
191
+ puts "This gem isn't directly present in the `Gemfile`, so we'll add it temporarily.".green
192
+ File.open("Gemfile", "a+") { |file|
193
+ file.puts
194
+ file.puts "gem \"#{gem}\", path: \"local/#{gem}\" # Added by \`bin/develop\`."
195
+ }
196
+ end
197
+
198
+ puts ""
199
+ puts "Now we'll run `bundle install`.".blue
200
+ stream "bundle install"
201
+
202
+ puts ""
203
+ puts "We'll restart any running Rails server now.".blue
204
+ stream "rails restart"
205
+
206
+ puts ""
207
+ puts "OK, we're opening that package in your IDE, `#{ENV["IDE"] || "code"}`. (You can configure this with `export IDE=whatever`.)".blue
208
+ `#{ENV["IDE"] || "code"} local/#{gem}`
209
+
210
+ puts ""
211
+ if details[:npm]
212
+ puts "This package also has an npm package, so we'll link that up as well.".blue
213
+ stream "cd local/#{gem} && yarn install && yarn link && cd ../.. && yarn link \"#{details[:npm]}\""
214
+
215
+ puts ""
216
+ puts "And now we're going to watch for any changes you make to the JavaScript and recompile as we go.".blue
217
+ puts "When you're done, you can hit <Control + C> and we'll clean all off this up.".blue
218
+ stream "cd local/#{gem} && yarn build --watch"
219
+ else
220
+ puts "This package has no npm package, so we'll just hang out here and do nothing. However, when you hit <Enter> here, we'll start the process of cleaning all of this up.".blue
221
+ $stdin.gets
222
+ end
223
+
224
+ puts ""
225
+ puts "OK, here's a list of things this script still doesn't do you for you:".yellow
226
+ puts "1. It doesn't clean up the repository that was cloned into `local`.".yellow
227
+ puts "2. Unless you remove it, it won't update that repository the next time you link to it.".yellow
228
+ else
229
+ puts ""
230
+ puts "Invalid option, \"#{number}\". Try again.".red
231
+ end
232
+ end
59
233
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullet_train
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.60
4
+ version: 1.0.61
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Culver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-30 00:00:00.000000000 Z
11
+ date: 2022-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: standard
@@ -399,8 +399,6 @@ files:
399
399
  - README.md
400
400
  - Rakefile
401
401
  - app/assets/config/bullet_train_manifest.js
402
- - app/assets/javascripts/bullet-train.js
403
- - app/assets/javascripts/bullet-train.js.map
404
402
  - app/controllers/account/invitations_controller.rb
405
403
  - app/controllers/account/memberships_controller.rb
406
404
  - app/controllers/account/onboarding/user_details_controller.rb
@@ -634,7 +632,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
634
632
  - !ruby/object:Gem::Version
635
633
  version: '0'
636
634
  requirements: []
637
- rubygems_version: 3.2.32
635
+ rubygems_version: 3.3.7
638
636
  signing_key:
639
637
  specification_version: 4
640
638
  summary: Bullet Train
@@ -1,2 +0,0 @@
1
- import{Controller as e}from"stimulus";function t(e){var t=(e.match(/^(?:\.\/)?(.+)(?:[_-]controller\..+?)$/)||[])[1];if(t)return t.replace(/_/g,"-").replace(/\//g,"--")}function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,n(e,t)}function n(e,t){return n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},n(e,t)}var i=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.copy=function(){this.inputTarget.value=this.sourceTarget.innerText,this.inputTarget.select(),document.execCommand("copy"),this.buttonTarget.innerHTML='<i id="copied" class="fas fa-check w-4 h-4 block text-green-600"></i>',setTimeout(function(){document.getElementById("copied").innerHTML='<i class="far fa-copy w-4 h-4 block text-gray-600"></i>'},1500)},t}(e);i.targets=["source","input","button"];var o=function(e){function t(){for(var t,r=arguments.length,n=new Array(r),i=0;i<r;i++)n[i]=arguments[i];return(t=e.call.apply(e,[this].concat(n))||this).removeTrailingNewlines=function(e){e.element.innerHTML.match(/<br><\/div>$/)&&(e.element.innerHTML=e.element.innerHTML.slice(0,-10)+"</div>",t.removeTrailingNewlines(e))},t.removeTrailingWhitespace=function(e){e.element.innerHTML.match(/&nbsp;<\/div>$/)?(e.element.innerHTML=e.element.innerHTML.slice(0,-12)+"</div>",t.removeTrailingWhitespace(e)):e.element.innerHTML.match(/&nbsp; <\/div>$/)&&(e.element.innerHTML=e.element.innerHTML.slice(0,-13)+"</div>",t.removeTrailingWhitespace(e))},t}r(t,e);var n=t.prototype;return n.resetOnSuccess=function(e){e.detail.success&&e.target.reset()},n.stripTrix=function(){var e=this;this.trixFieldTargets.forEach(function(t){e.removeTrailingNewlines(t.editor),e.removeTrailingWhitespace(t.editor),t.parentElement.querySelector("input").value=t.innerHTML})},n.submitOnReturn=function(e){if((e.metaKey||e.ctrlKey)&&13==e.keyCode){e.preventDefault();var t=e.target.closest("form");this.submitForm(t)}},n.submitForm=function(e){e.requestSubmit?e.requestSubmit():e.querySelector("[type=submit]").click()},t}(e);o.targets=["trixField","scroll"];var a=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n,i,o=t.prototype;return o.toggle=function(){var e=this.isWrapperHidden?this.showEventNameValue:this.hideEventNameValue;this.isWrapperHidden&&this.showWrapper(),this.wrapperTarget.dispatchEvent(new CustomEvent(e))},o.showWrapper=function(){this.wrapperTarget.classList.remove(this.hiddenClass)},o.hideWrapper=function(){this.wrapperTarget.classList.add(this.hiddenClass)},n=t,(i=[{key:"isWrapperHidden",get:function(){return this.wrapperTarget.classList.contains(this.hiddenClass)}}])&&function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}(n.prototype,i),Object.defineProperty(n,"prototype",{writable:!1}),t}(e);a.targets=["wrapper"],a.classes=["hidden"],a.values={showEventName:String,hideEventName:String};var s=[[i,"clipboard_controller.js"],[o,"form_controller.js"],[a,"mobile_menu_controller.js"]].map(function(e){var r=e[0];return{identifier:t(e[1]),controllerConstructor:r}});document.addEventListener("turbo:load",function(){navigator.userAgent.toLocaleLowerCase().includes("electron")&&document.body.classList.add("electron")});export{s as controllerDefinitions};
2
- //# sourceMappingURL=bullet-train.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bullet-train.js","sources":["../../../node_modules/@stimulus/webpack-helpers/dist/index.js","../../javascript/controllers/clipboard_controller.js","../../javascript/controllers/form_controller.js","../../javascript/controllers/mobile_menu_controller.js","../../javascript/controllers/index.js","../../javascript/electron/index.js"],"sourcesContent":["export function definitionsFromContext(context) {\n return context.keys()\n .map(function (key) { return definitionForModuleWithContextAndKey(context, key); })\n .filter(function (value) { return value; });\n}\nfunction definitionForModuleWithContextAndKey(context, key) {\n var identifier = identifierForContextKey(key);\n if (identifier) {\n return definitionForModuleAndIdentifier(context(key), identifier);\n }\n}\nfunction definitionForModuleAndIdentifier(module, identifier) {\n var controllerConstructor = module.default;\n if (typeof controllerConstructor == \"function\") {\n return { identifier: identifier, controllerConstructor: controllerConstructor };\n }\n}\nexport function identifierForContextKey(key) {\n var logicalName = (key.match(/^(?:\\.\\/)?(.+)(?:[_-]controller\\..+?)$/) || [])[1];\n if (logicalName) {\n return logicalName.replace(/_/g, \"-\").replace(/\\//g, \"--\");\n }\n}\n//# sourceMappingURL=index.js.map","import { Controller } from 'stimulus'\n\nexport default class extends Controller {\n static targets = ['source', 'input', 'button']\n\n copy() {\n this.inputTarget.value = this.sourceTarget.innerText\n this.inputTarget.select()\n document.execCommand('copy')\n this.buttonTarget.innerHTML = '<i id=\"copied\" class=\"fas fa-check w-4 h-4 block text-green-600\"></i>'\n setTimeout(function () {\n document.getElementById('copied').innerHTML = '<i class=\"far fa-copy w-4 h-4 block text-gray-600\"></i>'\n }, 1500)\n }\n}\n","import { Controller } from 'stimulus'\n\n// TODO Some of this feels really specific to the conversation messages form. Should we rename this controller?\nexport default class extends Controller {\n static targets = ['trixField', 'scroll']\n\n resetOnSuccess(e){\n if(e.detail.success) {\n e.target.reset();\n }\n }\n\n stripTrix(){\n this.trixFieldTargets.forEach(element => {\n this.removeTrailingNewlines(element.editor)\n this.removeTrailingWhitespace(element.editor)\n // When doing this as part of the form submission, Trix does not update the input element's value attribute fast enough.\n // In order to submit the stripped value, we manually update it here to fix the race condition\n element.parentElement.querySelector(\"input\").value = element.innerHTML\n })\n }\n\n submitOnReturn(e) {\n if((e.metaKey || e.ctrlKey) && e.keyCode == 13) {\n e.preventDefault();\n let form = e.target.closest(\"form\")\n this.submitForm(form)\n }\n }\n\n removeTrailingNewlines = (trixEditor) => {\n if (trixEditor.element.innerHTML.match(/<br><\\/div>$/)) {\n trixEditor.element.innerHTML = trixEditor.element.innerHTML.slice(0, -10) + \"</div>\"\n this.removeTrailingNewlines(trixEditor)\n }\n }\n\n removeTrailingWhitespace = (trixEditor) => {\n if (trixEditor.element.innerHTML.match(/&nbsp;<\\/div>$/)) {\n trixEditor.element.innerHTML = trixEditor.element.innerHTML.slice(0, -12) + \"</div>\"\n this.removeTrailingWhitespace(trixEditor)\n } else if (trixEditor.element.innerHTML.match(/&nbsp; <\\/div>$/)) {\n trixEditor.element.innerHTML = trixEditor.element.innerHTML.slice(0, -13) + \"</div>\"\n this.removeTrailingWhitespace(trixEditor)\n }\n }\n\n submitForm(form) {\n // Right now, Safari and IE don't support the requestSubmit method which is required for Turbo\n // Doing form.submit() doesn't actually fire the submit event which Turbo needs\n if (form.requestSubmit) {\n form.requestSubmit()\n } else {\n form.querySelector(\"[type=submit]\").click()\n }\n }\n}\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"wrapper\"]\n static classes = [ \"hidden\" ] // necessary because stimulus-reveal will mess with the [hidden] attribute on the wrapper\n static values = {\n showEventName: String,\n hideEventName: String,\n }\n\n toggle() {\n const eventName = this.isWrapperHidden? this.showEventNameValue: this.hideEventNameValue\n if (this.isWrapperHidden) {\n this.showWrapper()\n }\n \n this.wrapperTarget.dispatchEvent(new CustomEvent(eventName))\n }\n \n get isWrapperHidden() {\n return this.wrapperTarget.classList.contains(this.hiddenClass)\n }\n \n showWrapper() {\n this.wrapperTarget.classList.remove(this.hiddenClass)\n }\n \n hideWrapper() {\n this.wrapperTarget.classList.add(this.hiddenClass)\n }\n}","import { identifierForContextKey } from \"@stimulus/webpack-helpers\"\n\nimport ClipboardController from './clipboard_controller'\nimport FormController from './form_controller'\nimport MobileMenuController from './mobile_menu_controller'\n\nexport const controllerDefinitions = [\n [ClipboardController, 'clipboard_controller.js'],\n [FormController, 'form_controller.js'],\n [MobileMenuController, 'mobile_menu_controller.js'],\n].map(function(d) {\n const key = d[1]\n const controller = d[0]\n return {\n identifier: identifierForContextKey(key),\n controllerConstructor: controller\n }\n})\n","document.addEventListener(\"turbo:load\", () => {\n if (navigator.userAgent.toLocaleLowerCase().includes('electron')) {\n document.body.classList.add('electron')\n }\n})"],"names":["identifierForContextKey","key","logicalName","match","replace","copy","this","inputTarget","value","sourceTarget","innerText","select","document","execCommand","buttonTarget","innerHTML","setTimeout","getElementById","Controller","targets","removeTrailingNewlines","trixEditor","element","slice","_this","removeTrailingWhitespace","resetOnSuccess","e","detail","success","target","reset","stripTrix","trixFieldTargets","forEach","_this2","editor","parentElement","querySelector","submitOnReturn","metaKey","ctrlKey","keyCode","preventDefault","form","closest","submitForm","requestSubmit","click","toggle","eventName","isWrapperHidden","showEventNameValue","hideEventNameValue","showWrapper","wrapperTarget","dispatchEvent","CustomEvent","classList","remove","hiddenClass","hideWrapper","add","contains","classes","values","showEventName","String","hideEventName","controllerDefinitions","ClipboardController","FormController","MobileMenuController","map","d","controller","identifier","controllerConstructor","addEventListener","navigator","userAgent","toLocaleLowerCase","includes","body"],"mappings":"sCAiBO,SAASA,EAAwBC,GACpC,IAAIC,GAAeD,EAAIE,MAAM,2CAA6C,IAAI,GAC9E,GAAID,EACA,OAAOA,EAAYE,QAAQ,KAAM,KAAKA,QAAQ,MAAO,yRCf3DC,KAAA,WACEC,KAAKC,YAAYC,MAAQF,KAAKG,aAAaC,UAC3CJ,KAAKC,YAAYI,SACjBC,SAASC,YAAY,QACrBP,KAAKQ,aAAaC,UAAY,wEAC9BC,WAAW,WACTJ,SAASK,eAAe,UAAUF,UAAY,2DAC7C,UAVsBG,KACpBC,QAAU,CAAC,SAAU,QAAS,oKC2BrCC,uBAAyB,SAACC,GACpBA,EAAWC,QAAQP,UAAUZ,MAAM,kBACrCkB,EAAWC,QAAQP,UAAYM,EAAWC,QAAQP,UAAUQ,MAAM,GAAI,IAAM,SAC5EC,EAAKJ,uBAAuBC,OAIhCI,yBAA2B,SAACJ,GACtBA,EAAWC,QAAQP,UAAUZ,MAAM,mBACrCkB,EAAWC,QAAQP,UAAYM,EAAWC,QAAQP,UAAUQ,MAAM,GAAI,IAAM,SAC5EC,EAAKC,yBAAyBJ,IACrBA,EAAWC,QAAQP,UAAUZ,MAAM,qBAC5CkB,EAAWC,QAAQP,UAAYM,EAAWC,QAAQP,UAAUQ,MAAM,GAAI,IAAM,SAC5EC,EAAKC,yBAAyBJ,yCArClCK,eAAA,SAAeC,GACVA,EAAEC,OAAOC,SACVF,EAAEG,OAAOC,WAIbC,UAAA,sBACE1B,KAAK2B,iBAAiBC,QAAQ,SAAAZ,GAC5Ba,EAAKf,uBAAuBE,EAAQc,QACpCD,EAAKV,yBAAyBH,EAAQc,QAGtCd,EAAQe,cAAcC,cAAc,SAAS9B,MAAQc,EAAQP,eAIjEwB,eAAA,SAAeZ,GACb,IAAIA,EAAEa,SAAWb,EAAEc,UAA0B,IAAbd,EAAEe,QAAe,CAC/Cf,EAAEgB,iBACF,IAAIC,EAAOjB,EAAEG,OAAOe,QAAQ,QAC5BvC,KAAKwC,WAAWF,OAqBpBE,WAAA,SAAWF,GAGLA,EAAKG,cACPH,EAAKG,gBAELH,EAAKN,cAAc,iBAAiBU,YAlDb9B,KACpBC,QAAU,CAAC,YAAa,oHCM/B8B,OAAA,WACE,IAAMC,EAAY5C,KAAK6C,gBAAiB7C,KAAK8C,mBAAoB9C,KAAK+C,mBAClE/C,KAAK6C,iBACP7C,KAAKgD,cAGPhD,KAAKiD,cAAcC,cAAc,IAAIC,YAAYP,OAOnDI,YAAA,WACEhD,KAAKiD,cAAcG,UAAUC,OAAOrD,KAAKsD,gBAG3CC,YAAA,WACEvD,KAAKiD,cAAcG,UAAUI,IAAIxD,KAAKsD,iDATxC,WACE,YAAYL,cAAcG,UAAUK,SAASzD,KAAKsD,4PAlBzB1C,KACpBC,QAAU,CAAE,aACZ6C,QAAU,CAAE,YACZC,OAAS,CACdC,cAAeC,OACfC,cAAeD,QCDNE,IAAAA,EAAwB,CACnC,CAACC,EAAqB,2BACtB,CAACC,EAAgB,sBACjB,CAACC,EAAsB,8BACvBC,IAAI,SAASC,GACb,IACMC,EAAaD,EAAE,GACrB,MAAO,CACLE,WAAY5E,EAHF0E,EAAE,IAIZG,sBAAuBF,KCf3B/D,SAASkE,iBAAiB,aAAc,WAClCC,UAAUC,UAAUC,oBAAoBC,SAAS,aACnDtE,SAASuE,KAAKzB,UAAUI,IAAI"}